From 8ae6038760b89481bb2eb515397982777ead2c09 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Mon, 23 Sep 2024 14:20:14 +0300 Subject: [PATCH 001/113] Implement ToolCallStep & Fix transition after PromptStep (#513) > [!IMPORTANT] > Implement `ToolCallStep` and fix transition logic after `PromptStep` in workflow execution. > > - **ToolCallStep Implementation**: > - Implements `tool_call_step()` in `tool_call_step.py` to handle tool calls, including generating a call ID and validating tool names. > - Updates `STEP_TO_ACTIVITY` in `task_execution/__init__.py` to map `ToolCallStep` to `tool_call_step()`. > - **PromptStep Transition Fix**: > - Updates transition logic in `task_execution/__init__.py` to handle tool calls after a `PromptStep`. > - Removes unused code related to tool calls in `PromptStep` handling. > - **State Machine Update**: > - Updates `valid_transitions` in `tasks.py` to allow 'wait' to 'step' transition. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 5ab9e3a59ab8f000d371cdfed07b6a0364c88a21. It will automatically update as commits are pushed. --- .../activities/task_steps/prompt_step.py | 1 - .../activities/task_steps/tool_call_step.py | 45 +++++++++++++++---- .../agents_api/common/protocol/tasks.py | 2 +- .../workflows/task_execution/__init__.py | 36 +++++---------- 4 files changed, 50 insertions(+), 34 deletions(-) diff --git a/agents-api/agents_api/activities/task_steps/prompt_step.py b/agents-api/agents_api/activities/task_steps/prompt_step.py index d04dc99a6..3eecc2b55 100644 --- a/agents-api/agents_api/activities/task_steps/prompt_step.py +++ b/agents-api/agents_api/activities/task_steps/prompt_step.py @@ -22,7 +22,6 @@ async def prompt_step(context: StepContext) -> StepOutcome: context_data, skip_vars=["developer_id"], ) - # Get settings and run llm agent_default_settings: dict = ( context.execution_input.agent.default_settings.model_dump() diff --git a/agents-api/agents_api/activities/task_steps/tool_call_step.py b/agents-api/agents_api/activities/task_steps/tool_call_step.py index 85a119deb..a576bbbeb 100644 --- a/agents-api/agents_api/activities/task_steps/tool_call_step.py +++ b/agents-api/agents_api/activities/task_steps/tool_call_step.py @@ -1,20 +1,49 @@ +import base64 +import secrets + from beartype import beartype from temporalio import activity +from ...activities.task_steps import base_evaluate +from ...autogen.openapi_model import ToolCallStep from ...common.protocol.tasks import ( StepContext, + StepOutcome, ) +def generate_call_id(): + # Generate 18 random bytes (which will result in 24 base64 characters) + random_bytes = secrets.token_bytes(18) + # Encode to base64 and remove padding + base64_string = base64.urlsafe_b64encode(random_bytes).decode("ascii").rstrip("=") + # Add the "call_" prefix + return f"call_{base64_string}" + + @activity.defn @beartype -async def tool_call_step(context: StepContext) -> dict: - raise NotImplementedError() - # assert isinstance(context.current_step, ToolCallStep) +async def tool_call_step(context: StepContext) -> StepOutcome: + assert isinstance(context.current_step, ToolCallStep) + + tool_type, tool_name = context.current_step.tool.split(".") + arguments = await base_evaluate( + context.current_step.arguments, context.model_dump() + ) + + tools = context.execution_input.tools + + assert tool_name in [tool.name for tool in tools], f"Tool {tool_name} not found" + + call_id = generate_call_id() - # context.current_step.tool_id - # context.current_step.arguments - # # get tool by id - # # call tool + tool_call = { + tool_type: { + "arguments": arguments, + "name": tool_name, + }, + "id": call_id, + "type": tool_type, + } - # return {} + return StepOutcome(output=tool_call) diff --git a/agents-api/agents_api/common/protocol/tasks.py b/agents-api/agents_api/common/protocol/tasks.py index 81a04bb4a..e50b5c2ea 100644 --- a/agents-api/agents_api/common/protocol/tasks.py +++ b/agents-api/agents_api/common/protocol/tasks.py @@ -72,7 +72,7 @@ "error": [], "cancelled": [], # Intermediate states - "wait": ["resume", "cancelled", "finish", "finish_branch"], + "wait": ["resume", "step", "cancelled", "finish", "finish_branch"], "resume": [ "wait", "error", diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index 2ff45e55c..d1f13585f 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -81,7 +81,7 @@ # Mapping of step types to their corresponding activities STEP_TO_ACTIVITY = { PromptStep: task_steps.prompt_step, - # ToolCallStep: tool_call_step, + ToolCallStep: task_steps.tool_call_step, WaitForInputStep: task_steps.wait_for_input_step, SwitchStep: task_steps.switch_step, LogStep: task_steps.log_step, @@ -389,10 +389,7 @@ async def run( state = PartialTransition(type="resume", output=result) - case PromptStep(), StepOutcome( - output=response - ): # FIXME: if not response.choices[0].tool_calls: - # SCRUM-15 + case PromptStep(), StepOutcome(output=response): workflow.logger.debug(f"Prompt step: Received response: {response}") if response["choices"][0]["finish_reason"] != "tool_calls": workflow.logger.debug("Prompt step: Received response") @@ -421,19 +418,6 @@ async def run( ) state = PartialTransition(output=new_response.output, type="resume") - # case PromptStep(), StepOutcome( - # output=response - # ): # FIXME: if response.choices[0].tool_calls: - # # SCRUM-15 - # workflow.logger.debug("Prompt step: Received response") - # - # ## First, enter a wait-for-input step and ask developer to run the tool calls - # ## Then, continue the workflow with the input received from the developer - # ## This will be a dict with the tool call name as key and the tool call arguments as value - # ## The prompt is run again with the tool call arguments as input - # ## And the result is returned - # ## If model asks for more tool calls, repeat the process - case SetStep(), StepOutcome(output=evaluated_output): workflow.logger.info("Set step: Updating user state") self.update_user_state(evaluated_output) @@ -466,11 +450,15 @@ async def run( workflow.logger.error("ParallelStep not yet implemented") raise ApplicationError("Not implemented") - case ToolCallStep(), _: - # FIXME: Implement ToolCallStep - # SCRUM-16 - workflow.logger.error("ToolCallStep not yet implemented") - raise ApplicationError("Not implemented") + case ToolCallStep(), StepOutcome(output=tool_call): + # Enter a wait-for-input step to ask the developer to run the tool calls + tool_call_response = await workflow.execute_activity( + task_steps.raise_complete_async, + args=[context, tool_call], + schedule_to_close_timeout=timedelta(days=31), + ) + + state = PartialTransition(output=tool_call_response, type="resume") case _: workflow.logger.error( @@ -502,7 +490,7 @@ async def run( # Continue as a child workflow return await continue_as_child( - context, + context.execution_input, start=final_state.next, previous_inputs=previous_inputs + [final_state.output], user_state=self.user_state, From f19dd75ea518b0c79bd2d884eb1a84d9050175f6 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 23 Sep 2024 16:40:22 -0400 Subject: [PATCH 002/113] doc: Update README.md with announcement update (#517) Co-authored-by: Julep Developers --- README.md | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a45e07dfb..0f49831ff 100644 --- a/README.md +++ b/README.md @@ -45,15 +45,33 @@ Build powerful AI applications with stateful agents, complex workflows, and inte ## 🚀 Upcoming Release: v0.4 Alpha -
- Announcing v0.4 Alpha -
+**Release Date**: October 7 (Hacktoberfest Launch) + +We are thrilled to announce the upcoming release of **Julep v0.4 Alpha** on **October 7**, just in time for **Hacktoberfest**! + +### **Key Highlights** + +#### **New Feature: Tasks** + +- **Autonomous Workflows**: Unlock the ability for agents to perform long-term, multi-step tasks autonomously. Define complex workflows that enable your agents to operate with minimal intervention. + +- **Harness OpenAI's o1 Models**: Leverage the advanced reasoning and planning capabilities of OpenAI's o1 models. Perfect for orchestrating intricate and prolonged tasks that require sophisticated understanding and execution. + +- **100+ Integrations**: Seamlessly integrate with popular tools and APIs, including **GitHub**, **Salesforce**, **File Manager**, **Code Execution**, and more. Expand your agents' capabilities to perform a wide range of actions. + +#### **Rewritten from Scratch Based on Developer Feedback** + +- **Enhanced Doc Search**: Experience a significant improvement in document retrieval. Agents can now access the most relevant information faster, ensuring more accurate and contextually appropriate interactions. + +- **Easier to Use**: We've streamlined the user experience with simplified APIs and more intuitive interfaces. Building powerful AI applications is now more straightforward than ever. + +- **Multi-Agent Sessions**: Support for sessions with multiple agents and users. Enable complex interaction patterns, collaborative problem-solving, and more dynamic conversations within your applications. -We're excited to announce that v0.4 is currently in alpha! This release brings significant improvements and new features. Stay tuned for the official release. +- **Extensive Integrations**: Incorporate a multitude of popular tools and services directly into your AI applications, enhancing functionality and providing richer experiences for your users. -For a comprehensive overview of Julep's core concepts and upcoming features, check out our [detailed concepts guide](docs/julep-concepts.md). +### **Call to Action** -Looking for the previous version? You can find the [v0.3 README here](v0.3_README.md). +- **Join Our Discord Community**: Be among the first to access Julep v0.4 Alpha! [Join our Discord](https://discord.com/invite/JTSBGRZrzj) to get early access and API keys. Engage with other developers, share your projects, and provide feedback. --- From c2163017e37349c1af78c3fa37820af96ed1af85 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Wed, 25 Sep 2024 10:08:09 -0400 Subject: [PATCH 003/113] feat: Add basic support for integration tools to ToolStep (#519) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > This PR updates the handling of integrations and systems by adding new models, updating workflows, and modifying session options, along with dependency updates and a migration script. > > - **Behavior**: > - Adds `execute_integration` function in `execute_integration.py` to handle integration tool calls. > - Updates `prompt_step.py` to handle unwrapping of prompt responses and tool call results. > - Modifies `tool_call_step.py` to handle tool calls using `Tool` model. > - **Models**: > - Adds `IntegrationDef` and `SystemDef` models in `Tools.py`. > - Updates `CreateToolRequest`, `PatchToolRequest`, `UpdateToolRequest`, and `Tool` to use `IntegrationDef` and `SystemDef`. > - Adds `forward_tool_results` option to session models in `Sessions.py`. > - **Workflow**: > - Updates `TaskExecutionWorkflow` in `task_execution/__init__.py` to handle integration tool calls. > - **Dependencies**: > - Updates `@typespec/*` dependencies in `package.json` to version `0.60.x`. > - **Migration**: > - Adds migration script `migrate_1727235852_add_forward_tool_calls_option.py` to add `forward_tool_calls` option to sessions. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for a49aa123e96125fc45e33839bd7e90a708088b70. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- .../activities/execute_integration.py | 55 ++++ .../activities/task_steps/prompt_step.py | 16 +- .../activities/task_steps/tool_call_step.py | 22 +- agents-api/agents_api/autogen/Common.py | 10 + agents-api/agents_api/autogen/Sessions.py | 50 +++ agents-api/agents_api/autogen/Tasks.py | 292 +++++++++++++++++- agents-api/agents_api/autogen/Tools.py | 168 ++++++++-- .../agents_api/autogen/openapi_model.py | 1 + .../agents_api/common/protocol/tasks.py | 19 +- .../execution/prepare_execution_input.py | 7 +- agents-api/agents_api/models/task/get_task.py | 19 +- .../agents_api/models/task/list_tasks.py | 19 +- .../agents_api/models/tools/__init__.py | 1 + .../tools/get_tool_args_from_metadata.py | 126 ++++++++ agents-api/agents_api/worker/worker.py | 6 +- .../workflows/task_execution/__init__.py | 100 ++++-- ...727235852_add_forward_tool_calls_option.py | 87 ++++++ agents-api/tests/fixtures.py | 2 + agents-api/tests/test_execution_workflow.py | 118 ++++++- agents-api/tests/utils.py | 2 +- typespec/common/scalars.tsp | 19 +- typespec/package-lock.json | 97 +++--- typespec/package.json | 14 +- typespec/sessions/models.tsp | 9 + typespec/tasks/models.tsp | 18 ++ typespec/tasks/steps.tsp | 22 +- typespec/tools/models.tsp | 52 +++- 27 files changed, 1156 insertions(+), 195 deletions(-) create mode 100644 agents-api/agents_api/activities/execute_integration.py create mode 100644 agents-api/agents_api/models/tools/get_tool_args_from_metadata.py create mode 100644 agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py diff --git a/agents-api/agents_api/activities/execute_integration.py b/agents-api/agents_api/activities/execute_integration.py new file mode 100644 index 000000000..9183eca2b --- /dev/null +++ b/agents-api/agents_api/activities/execute_integration.py @@ -0,0 +1,55 @@ +from typing import Any + +from beartype import beartype +from temporalio import activity + +from ..autogen.openapi_model import IntegrationDef +from ..common.protocol.tasks import StepContext +from ..env import testing +from ..models.tools import get_tool_args_from_metadata + + +@beartype +async def execute_integration( + context: StepContext, + tool_name: str, + integration: IntegrationDef, + arguments: dict[str, Any], +) -> Any: + developer_id = context.execution_input.developer_id + agent_id = context.execution_input.agent.id + task_id = context.execution_input.task.id + + merged_tool_args = get_tool_args_from_metadata( + developer_id=developer_id, agent_id=agent_id, task_id=task_id + ) + + arguments = merged_tool_args.get(tool_name, {}) | arguments + + try: + if integration.provider == "dummy": + return arguments + + else: + raise NotImplementedError( + f"Unknown integration provider: {integration.provider}" + ) + except BaseException as e: + if activity.in_activity(): + activity.logger.error(f"Error in execute_integration: {e}") + + raise + + +async def mock_execute_integration( + context: StepContext, + tool_name: str, + integration: IntegrationDef, + arguments: dict[str, Any], +) -> Any: + return arguments + + +execute_integration = activity.defn(name="execute_integration")( + execute_integration if not testing else mock_execute_integration +) diff --git a/agents-api/agents_api/activities/task_steps/prompt_step.py b/agents-api/agents_api/activities/task_steps/prompt_step.py index 3eecc2b55..e9b4daeb3 100644 --- a/agents-api/agents_api/activities/task_steps/prompt_step.py +++ b/agents-api/agents_api/activities/task_steps/prompt_step.py @@ -1,5 +1,6 @@ from beartype import beartype from temporalio import activity +from temporalio.exceptions import ApplicationError from ...clients import ( litellm, # We dont directly import `acompletion` so we can mock it @@ -63,18 +64,29 @@ async def prompt_step(context: StepContext) -> StepOutcome: else: passed_settings: dict = {} + # Wrap the prompt in a list if it is not already + if isinstance(prompt, str): + prompt = [{"role": "user", "content": prompt}] + completion_data: dict = { "model": agent_model, "tools": formatted_agent_tools or None, - ("messages" if isinstance(prompt, list) else "prompt"): prompt, + "messages": prompt, **agent_default_settings, **passed_settings, } + response = await litellm.acompletion( **completion_data, ) + if context.current_step.unwrap: + if response.choices[0].finish_reason == "tool_calls": + raise ApplicationError("Tool calls cannot be unwrapped") + + response = response.choices[0].message.content + return StepOutcome( - output=response.model_dump(), + output=response.model_dump() if hasattr(response, "model_dump") else response, next=None, ) diff --git a/agents-api/agents_api/activities/task_steps/tool_call_step.py b/agents-api/agents_api/activities/task_steps/tool_call_step.py index a576bbbeb..3082d8706 100644 --- a/agents-api/agents_api/activities/task_steps/tool_call_step.py +++ b/agents-api/agents_api/activities/task_steps/tool_call_step.py @@ -3,9 +3,10 @@ from beartype import beartype from temporalio import activity +from temporalio.exceptions import ApplicationError -from ...activities.task_steps import base_evaluate -from ...autogen.openapi_model import ToolCallStep +from ...activities.task_steps.base_evaluate import base_evaluate +from ...autogen.openapi_model import Tool, ToolCallStep from ...common.protocol.tasks import ( StepContext, StepOutcome, @@ -26,24 +27,27 @@ def generate_call_id(): async def tool_call_step(context: StepContext) -> StepOutcome: assert isinstance(context.current_step, ToolCallStep) - tool_type, tool_name = context.current_step.tool.split(".") + tools: list[Tool] = context.tools + tool_name = context.current_step.tool + + tool = next((t for t in tools if t.name == tool_name), None) + + if tool is None: + raise ApplicationError(f"Tool {tool_name} not found in the toolset") + arguments = await base_evaluate( context.current_step.arguments, context.model_dump() ) - tools = context.execution_input.tools - - assert tool_name in [tool.name for tool in tools], f"Tool {tool_name} not found" - call_id = generate_call_id() tool_call = { - tool_type: { + tool.type: { "arguments": arguments, "name": tool_name, }, "id": call_id, - "type": tool_type, + "type": tool.type, } return StepOutcome(output=tool_call) diff --git a/agents-api/agents_api/autogen/Common.py b/agents-api/agents_api/autogen/Common.py index cb8d88035..a2d6b99a6 100644 --- a/agents-api/agents_api/autogen/Common.py +++ b/agents-api/agents_api/autogen/Common.py @@ -9,6 +9,16 @@ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel +class JinjaTemplate(RootModel[str]): + model_config = ConfigDict( + populate_by_name=True, + ) + root: str + """ + A valid jinja template. + """ + + class Limit(RootModel[int]): model_config = ConfigDict( populate_by_name=True, diff --git a/agents-api/agents_api/autogen/Sessions.py b/agents-api/agents_api/autogen/Sessions.py index f167efec5..75e5252cd 100644 --- a/agents-api/agents_api/autogen/Sessions.py +++ b/agents-api/agents_api/autogen/Sessions.py @@ -43,6 +43,16 @@ class CreateSessionRequest(BaseModel): """ Action to start on context window overflow """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + """ metadata: dict[str, Any] | None = None @@ -70,6 +80,16 @@ class PatchSessionRequest(BaseModel): """ Action to start on context window overflow """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + """ metadata: dict[str, Any] | None = None @@ -97,6 +117,16 @@ class Session(BaseModel): """ Action to start on context window overflow """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + """ id: Annotated[UUID, Field(json_schema_extra={"readOnly": True})] metadata: dict[str, Any] | None = None created_at: Annotated[AwareDatetime, Field(json_schema_extra={"readOnly": True})] @@ -160,6 +190,16 @@ class UpdateSessionRequest(BaseModel): """ Action to start on context window overflow """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + """ metadata: dict[str, Any] | None = None @@ -194,6 +234,16 @@ class CreateOrUpdateSessionRequest(CreateSessionRequest): """ Action to start on context window overflow """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + """ metadata: dict[str, Any] | None = None diff --git a/agents-api/agents_api/autogen/Tasks.py b/agents-api/agents_api/autogen/Tasks.py index c1e69d492..48dba4ad7 100644 --- a/agents-api/agents_api/autogen/Tasks.py +++ b/agents-api/agents_api/autogen/Tasks.py @@ -15,7 +15,7 @@ TextOnlyDocSearchRequest, VectorDocSearchRequest, ) -from .Tools import CreateToolRequest +from .Tools import CreateToolRequest, NamedToolChoice class CaseThen(BaseModel): @@ -46,6 +46,34 @@ class CaseThen(BaseModel): """ +class CaseThenUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + case: Literal["_"] | str + """ + The condition to evaluate + """ + then: ( + EvaluateStep + | ToolCallStep + | PromptStepUpdateItem + | GetStep + | SetStep + | LogStep + | EmbedStep + | SearchStep + | ReturnStep + | SleepStep + | ErrorWorkflowStep + | YieldStep + | WaitForInputStep + ) + """ + The steps to run if the condition is true + """ + + class Content(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -74,6 +102,14 @@ class ContentModel(BaseModel): """ +class ContentModel1(Content): + pass + + +class ContentModel2(ContentModel): + pass + + class CreateTaskRequest(BaseModel): """ Payload for creating a task @@ -197,6 +233,30 @@ class ForeachDo(BaseModel): """ +class ForeachDoUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + in_: Annotated[str, Field(alias="in")] + """ + The variable to iterate over. + VALIDATION: Should NOT return more than 1000 elements. + """ + do: ( + EvaluateStep + | ToolCallStep + | PromptStepUpdateItem + | GetStep + | SetStep + | LogStep + | EmbedStep + | SearchStep + ) + """ + The steps to run for each iteration + """ + + class ForeachStep(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -213,6 +273,20 @@ class ForeachStep(BaseModel): """ +class ForeachStepUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + kind_: str | None = None + """ + Discriminator property for BaseWorkflowStep. + """ + foreach: ForeachDoUpdateItem + """ + The steps to run for each iteration + """ + + class GetStep(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -281,6 +355,58 @@ class IfElseWorkflowStep(BaseModel): """ +class IfElseWorkflowStepUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + kind_: str | None = None + """ + Discriminator property for BaseWorkflowStep. + """ + if_: Annotated[str, Field(alias="if")] + """ + The condition to evaluate + """ + then: ( + EvaluateStep + | ToolCallStep + | PromptStepUpdateItem + | GetStep + | SetStep + | LogStep + | EmbedStep + | SearchStep + | ReturnStep + | SleepStep + | ErrorWorkflowStep + | YieldStep + | WaitForInputStep + ) + """ + The steps to run if the condition is true + """ + else_: Annotated[ + EvaluateStep + | ToolCallStep + | PromptStepUpdateItem + | GetStep + | SetStep + | LogStep + | EmbedStep + | SearchStep + | ReturnStep + | SleepStep + | ErrorWorkflowStep + | YieldStep + | WaitForInputStep + | None, + Field(None, alias="else"), + ] + """ + The steps to run if the condition is false + """ + + class ImageUrl(BaseModel): """ The image URL @@ -371,7 +497,7 @@ class MainModel(BaseModel): map: ( EvaluateStep | ToolCallStep - | PromptStep + | PromptStepUpdateItem | GetStep | SetStep | LogStep @@ -425,6 +551,32 @@ class ParallelStep(BaseModel): """ +class ParallelStepUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + kind_: str | None = None + """ + Discriminator property for BaseWorkflowStep. + """ + parallel: Annotated[ + list[ + EvaluateStep + | ToolCallStep + | PromptStepUpdateItem + | GetStep + | SetStep + | LogStep + | EmbedStep + | SearchStep + ], + Field(max_length=100), + ] + """ + The steps to run in parallel. Max concurrency will depend on the platform. + """ + + class PatchTaskRequest(BaseModel): """ Payload for patching a task @@ -438,7 +590,7 @@ class PatchTaskRequest(BaseModel): list[ EvaluateStep | ToolCallStep - | PromptStep + | PromptStepUpdateItem | GetStep | SetStep | LogStep @@ -449,10 +601,10 @@ class PatchTaskRequest(BaseModel): | ErrorWorkflowStep | YieldStep | WaitForInputStep - | IfElseWorkflowStep - | SwitchStep - | ForeachStep - | ParallelStep + | IfElseWorkflowStepUpdateItem + | SwitchStepUpdateItem + | ForeachStepUpdateItem + | ParallelStepUpdateItem | MainModel ] | None, @@ -520,10 +672,72 @@ class PromptStep(BaseModel): """ The prompt to run """ + tools: Literal["all"] | list[ToolRef | CreateToolRequest] = [] + """ + The tools to use for the prompt + """ + tool_choice: Literal["auto", "none"] | NamedToolChoice | None = None + """ + The tool choice for the prompt + """ + settings: ChatSettings | None = None + """ + Settings for the prompt + """ + unwrap: StrictBool = False + """ + Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` + """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be used as the model's input. + If a tool call is not made, the model's output will be used as the next step's input. + """ + + +class PromptStepUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + kind_: str | None = None + """ + Discriminator property for BaseWorkflowStep. + """ + prompt: list[PromptItem] | str + """ + The prompt to run + """ + tools: Literal["all"] | list[ToolRefUpdateItem | CreateToolRequest] = [] + """ + The tools to use for the prompt + """ + tool_choice: Literal["auto", "none"] | NamedToolChoice | None = None + """ + The tool choice for the prompt + """ settings: ChatSettings | None = None """ Settings for the prompt """ + unwrap: StrictBool = False + """ + Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` + """ + forward_tool_results: StrictBool | None = None + """ + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be used as the model's input. + If a tool call is not made, the model's output will be used as the next step's input. + """ class ReturnStep(BaseModel): @@ -626,6 +840,20 @@ class SwitchStep(BaseModel): """ +class SwitchStepUpdateItem(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + kind_: str | None = None + """ + Discriminator property for BaseWorkflowStep. + """ + switch: Annotated[list[CaseThenUpdateItem], Field(min_length=1)] + """ + The cond tree + """ + + class Task(BaseModel): """ Object describing a Task @@ -706,9 +934,7 @@ class ToolCallStep(BaseModel): """ The kind of step """ - tool: Annotated[ - str, Field(pattern="^(function|integration|system|api_call)\\.(\\w+)$") - ] + tool: Annotated[str, Field(max_length=40, pattern="^[^\\W0-9]\\w*$")] """ The tool to run """ @@ -718,6 +944,52 @@ class ToolCallStep(BaseModel): """ +class ToolRef(BaseModel): + """ + Reference to a tool + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + ref: ToolRefById | ToolRefByName + + +class ToolRefById(BaseModel): + """ + Reference to a tool by id + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + id: UUID | None = None + + +class ToolRefByName(BaseModel): + """ + Reference to a tool by name + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + name: Annotated[str | None, Field(None, max_length=40, pattern="^[^\\W0-9]\\w*$")] + """ + Valid python identifier names + """ + + +class ToolRefUpdateItem(BaseModel): + """ + Reference to a tool + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + + class UpdateTaskRequest(BaseModel): """ Payload for updating a task diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index 7664af1af..7b7f38214 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -22,9 +22,6 @@ class ChosenToolCall(BaseModel): Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) """ function: FunctionCallOption | None = None - integration: Any | None = None - system: Any | None = None - api_call: Any | None = None id: Annotated[UUID, Field(json_schema_extra={"readOnly": True})] @@ -44,13 +41,12 @@ class CreateToolRequest(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ - function: FunctionDef + function: FunctionDef | None = None """ The function to call """ - integration: Any | None = None - system: Any | None = None - api_call: Any | None = None + integration: IntegrationDef | None = None + system: SystemDef | None = None class FunctionCallOption(BaseModel): @@ -75,14 +71,7 @@ class FunctionDef(BaseModel): """ DO NOT USE: This will be overriden by the tool name. Here only for compatibility reasons. """ - description: Annotated[ - str | None, - Field( - None, - max_length=120, - pattern="^[\\p{L}\\p{Nl}\\p{Pattern_Syntax}\\p{Pattern_White_Space}]+[\\p{ID_Start}\\p{Mn}\\p{Mc}\\p{Nd}\\p{Pc}\\p{Pattern_Syntax}\\p{Pattern_White_Space}]*$", - ), - ] + description: str | None = None """ Description of the function """ @@ -92,6 +81,89 @@ class FunctionDef(BaseModel): """ +class IntegrationDef(BaseModel): + """ + Integration definition + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + provider: Literal[ + "dummy", + "dall-e", + "duckduckgo", + "hackernews", + "weather", + "wikipedia", + "twitter", + "webpage", + "requests", + ] + """ + The provider of the integration + """ + method: str | None = None + """ + The specific method of the integration to call + """ + description: str | None = None + """ + Optional description of the integration + """ + setup: dict[str, Any] | None = None + """ + The setup parameters the integration accepts + """ + arguments: dict[str, Any] | None = None + """ + The arguments to pre-apply to the integration call + """ + + +class IntegrationDefUpdate(BaseModel): + """ + Integration definition + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + provider: ( + Literal[ + "dummy", + "dall-e", + "duckduckgo", + "hackernews", + "weather", + "wikipedia", + "twitter", + "webpage", + "requests", + ] + | None + ) = None + """ + The provider of the integration + """ + method: str | None = None + """ + The specific method of the integration to call + """ + description: str | None = None + """ + Optional description of the integration + """ + setup: dict[str, Any] | None = None + """ + The setup parameters the integration accepts + """ + arguments: dict[str, Any] | None = None + """ + The arguments to pre-apply to the integration call + """ + + class NamedToolChoice(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -101,9 +173,6 @@ class NamedToolChoice(BaseModel): Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) """ function: FunctionCallOption | None = None - integration: Any | None = None - system: Any | None = None - api_call: Any | None = None class PatchToolRequest(BaseModel): @@ -126,9 +195,52 @@ class PatchToolRequest(BaseModel): """ The function to call """ - integration: Any | None = None - system: Any | None = None - api_call: Any | None = None + integration: IntegrationDefUpdate | None = None + system: SystemDefUpdate | None = None + + +class SystemDef(BaseModel): + """ + System definition + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + call: str + """ + The name of the system call + """ + description: str | None = None + """ + Optional description of the system call + """ + arguments: dict[str, Any] | None = None + """ + The arguments to pre-apply to the system call + """ + + +class SystemDefUpdate(BaseModel): + """ + System definition + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + call: str | None = None + """ + The name of the system call + """ + description: str | None = None + """ + Optional description of the system call + """ + arguments: dict[str, Any] | None = None + """ + The arguments to pre-apply to the system call + """ class Tool(BaseModel): @@ -143,13 +255,12 @@ class Tool(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ - function: FunctionDef + function: FunctionDef | None = None """ The function to call """ - integration: Any | None = None - system: Any | None = None - api_call: Any | None = None + integration: IntegrationDef | None = None + system: SystemDef | None = None created_at: Annotated[AwareDatetime, Field(json_schema_extra={"readOnly": True})] """ When this resource was created as UTC date-time @@ -188,13 +299,12 @@ class UpdateToolRequest(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ - function: FunctionDef + function: FunctionDef | None = None """ The function to call """ - integration: Any | None = None - system: Any | None = None - api_call: Any | None = None + integration: IntegrationDef | None = None + system: SystemDef | None = None class ChosenFunctionCall(ChosenToolCall): diff --git a/agents-api/agents_api/autogen/openapi_model.py b/agents-api/agents_api/autogen/openapi_model.py index 3e329581c..5c5a8c86f 100644 --- a/agents-api/agents_api/autogen/openapi_model.py +++ b/agents-api/agents_api/autogen/openapi_model.py @@ -200,6 +200,7 @@ class TaskSpec(_Task): model_config = ConfigDict(extra="ignore") workflows: list[Workflow] + tools: list[TaskToolDef] # Remove main field from the model main: None = None diff --git a/agents-api/agents_api/common/protocol/tasks.py b/agents-api/agents_api/common/protocol/tasks.py index e50b5c2ea..6892d7098 100644 --- a/agents-api/agents_api/common/protocol/tasks.py +++ b/agents-api/agents_api/common/protocol/tasks.py @@ -126,7 +126,7 @@ class ExecutionInput(BaseModel): execution: Execution task: TaskSpecDef agent: Agent - tools: list[Tool] + agent_tools: list[Tool] arguments: dict[str, Any] # Not used at the moment @@ -139,6 +139,23 @@ class StepContext(BaseModel): inputs: list[Any] cursor: TransitionTarget + @computed_field + @property + def tools(self) -> list[Tool]: + execution_input = self.execution_input + task = execution_input.task + agent_tools = execution_input.agent_tools + + if not task.inherit_tools: + return task.tools + + # Remove duplicates from agent_tools + filtered_tools = [ + t for t in agent_tools if t.name not in map(lambda x: x.name, task.tools) + ] + + return filtered_tools + task.tools + @computed_field @property def outputs(self) -> list[dict[str, Any]]: # included in dump diff --git a/agents-api/agents_api/models/execution/prepare_execution_input.py b/agents-api/agents_api/models/execution/prepare_execution_input.py index 5bc14939a..b763a7508 100644 --- a/agents-api/agents_api/models/execution/prepare_execution_input.py +++ b/agents-api/agents_api/models/execution/prepare_execution_input.py @@ -39,13 +39,10 @@ transform=lambda d: { **d, "task": { - "tools": [ - {tool["type"]: tool.pop("spec"), **tool} - for tool in map(fix_uuid_if_present, d["task"].pop("tools")) - ], + "tools": [*map(fix_uuid_if_present, d["task"].pop("tools"))], **d["task"], }, - "tools": [ + "agent_tools": [ {tool["type"]: tool.pop("spec"), **tool} for tool in map(fix_uuid_if_present, d["tools"]) ], diff --git a/agents-api/agents_api/models/task/get_task.py b/agents-api/agents_api/models/task/get_task.py index 4bb3d06b6..4e5b2fb97 100644 --- a/agents-api/agents_api/models/task/get_task.py +++ b/agents-api/agents_api/models/task/get_task.py @@ -68,20 +68,6 @@ def get_task( }, updated_at = to_int(updated_at_ms) / 1000 - tool_data[collect(tool_def)] := - task_data[_, agent_id, _, _, _, _, _, _, _, _, _], - *tools { - agent_id, - type, - name, - spec, - }, tool_def = { - "type": type, - "name": name, - "spec": spec, - "inherited": true, - } - ?[ id, agent_id, @@ -95,20 +81,19 @@ def get_task( updated_at, metadata, ] := - tool_data[inherited_tools], task_data[ id, agent_id, name, description, input_schema, - task_tools, + tools, inherit_tools, workflows, created_at, updated_at, metadata, - ], tools = task_tools ++ if(inherit_tools, inherited_tools, []) + ] :limit 1 """ diff --git a/agents-api/agents_api/models/task/list_tasks.py b/agents-api/agents_api/models/task/list_tasks.py index 35c52d184..a443ce9e2 100644 --- a/agents-api/agents_api/models/task/list_tasks.py +++ b/agents-api/agents_api/models/task/list_tasks.py @@ -74,20 +74,6 @@ def list_tasks( }}, updated_at = to_int(updated_at_ms) / 1000 - tool_data[collect(tool_def)] := - input[agent_id], - *tools {{ - agent_id, - type, - name, - spec, - }}, tool_def = {{ - "type": type, - "name": name, - "spec": spec, - "inherited": true, - }} - ?[ task_id, agent_id, @@ -101,20 +87,19 @@ def list_tasks( updated_at, metadata, ] := - tool_data[inherited_tools], task_data[ task_id, agent_id, name, description, input_schema, - task_tools, + tools, inherit_tools, workflows, created_at, updated_at, metadata, - ], tools = task_tools ++ if(inherit_tools, inherited_tools, []) + ] :limit $limit :offset $offset diff --git a/agents-api/agents_api/models/tools/__init__.py b/agents-api/agents_api/models/tools/__init__.py index 98f3a5e3a..b1775f1a9 100644 --- a/agents-api/agents_api/models/tools/__init__.py +++ b/agents-api/agents_api/models/tools/__init__.py @@ -14,6 +14,7 @@ from .create_tools import create_tools from .delete_tool import delete_tool from .get_tool import get_tool +from .get_tool_args_from_metadata import get_tool_args_from_metadata from .list_tools import list_tools from .patch_tool import patch_tool from .update_tool import update_tool diff --git a/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py b/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py new file mode 100644 index 000000000..08882ae6f --- /dev/null +++ b/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py @@ -0,0 +1,126 @@ +from uuid import UUID + +from beartype import beartype +from fastapi import HTTPException +from pycozo.client import QueryException +from pydantic import ValidationError + +from ..utils import ( + cozo_query, + partialclass, + rewrap_exceptions, + verify_developer_id_query, + verify_developer_owns_resource_query, + wrap_in_class, +) + + +def tool_args_for_task( + *, + developer_id: UUID, + agent_id: UUID, + task_id: UUID, +) -> tuple[list[str], dict]: + agent_id = str(agent_id) + task_id = str(task_id) + + get_query = """ + input[agent_id, task_id] <- [[to_uuid($agent_id), to_uuid($task_id)]] + + ?[args] := + input[agent_id, task_id], + *tasks { + task_id, + metadata: task_metadata, + }, + *agents { + agent_id, + metadata: agent_metadata, + }, + task_args = get(task_metadata, "x-tool-args", {}), + agent_args = get(agent_metadata, "x-tool-args", {}), + + # Right values overwrite left values + # See: https://docs.cozodb.org/en/latest/functions.html#Func.Vector.concat + args = concat(agent_args, task_args), + """ + + queries = [ + verify_developer_id_query(developer_id), + verify_developer_owns_resource_query( + developer_id, "tasks", task_id=task_id, parents=[("agents", "agent_id")] + ), + get_query, + ] + + return (queries, {"agent_id": agent_id, "task_id": task_id}) + + +def tool_args_for_session( + *, + developer_id: UUID, + session_id: UUID, + agent_id: UUID, +) -> tuple[list[str], dict]: + session_id = str(session_id) + + get_query = """ + input[session_id, agent_id] <- [[to_uuid($session_id), to_uuid($agent_id)]] + + ?[args] := + input[session_id, agent_id], + *sessions { + session_id, + metadata: session_metadata, + }, + *agents { + agent_id, + metadata: agent_metadata, + }, + session_args = get(session_metadata, "x-tool-args"), + agent_args = get(agent_metadata, "x-tool-args"), + + # Right values overwrite left values + # See: https://docs.cozodb.org/en/latest/functions.html#Func.Vector.concat + args = concat(agent_args, session_args), + """ + + queries = [ + verify_developer_id_query(developer_id), + verify_developer_owns_resource_query( + developer_id, "sessions", session_id=session_id + ), + get_query, + ] + + return (queries, {"agent_id": agent_id, "session_id": session_id}) + + +@rewrap_exceptions( + { + QueryException: partialclass(HTTPException, status_code=400), + ValidationError: partialclass(HTTPException, status_code=400), + TypeError: partialclass(HTTPException, status_code=400), + } +) +@wrap_in_class(dict, transform=lambda x: x["args"], one=True) +@cozo_query +@beartype +def get_tool_args_from_metadata( + *, + developer_id: UUID, + agent_id: UUID, + session_id: UUID | None = None, + task_id: UUID | None = None, +) -> tuple[list[str], dict]: + match session_id, task_id: + case (None, task_id) if task_id is not None: + return tool_args_for_task( + developer_id=developer_id, agent_id=agent_id, task_id=task_id + ) + case (session_id, None) if session_id is not None: + return tool_args_for_session( + developer_id=developer_id, agent_id=agent_id, session_id=session_id + ) + case (_, _): + raise ValueError("Either session_id or task_id must be provided") diff --git a/agents-api/agents_api/worker/worker.py b/agents-api/agents_api/worker/worker.py index 65e813023..77698364d 100644 --- a/agents-api/agents_api/worker/worker.py +++ b/agents-api/agents_api/worker/worker.py @@ -15,6 +15,7 @@ def create_worker(client: Client) -> Any: from ..activities import task_steps from ..activities.demo import demo_activity from ..activities.embed_docs import embed_docs + from ..activities.execute_integration import execute_integration from ..activities.mem_mgmt import mem_mgmt from ..activities.mem_rating import mem_rating from ..activities.summarization import summarization @@ -49,10 +50,11 @@ def create_worker(client: Client) -> Any: activities=[ *task_activities, demo_activity, - summarization, + embed_docs, + execute_integration, mem_mgmt, mem_rating, - embed_docs, + summarization, truncation, ], ) diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index d1f13585f..3c8197e29 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -11,6 +11,7 @@ # Import necessary modules and types with workflow.unsafe.imports_passed_through(): from ...activities import task_steps + from ...activities.execute_integration import execute_integration from ...autogen.openapi_model import ( EmbedStep, ErrorWorkflowStep, @@ -389,34 +390,47 @@ async def run( state = PartialTransition(type="resume", output=result) - case PromptStep(), StepOutcome(output=response): + case PromptStep(unwrap=True), StepOutcome(output=response): workflow.logger.debug(f"Prompt step: Received response: {response}") - if response["choices"][0]["finish_reason"] != "tool_calls": - workflow.logger.debug("Prompt step: Received response") - state = PartialTransition(output=response) - else: - workflow.logger.debug("Prompt step: Received tool call") - message = response["choices"][0]["message"] - tool_calls_input = message["tool_calls"] - - # Enter a wait-for-input step to ask the developer to run the tool calls - tool_calls_results = await workflow.execute_activity( - task_steps.raise_complete_async, - args=[context, tool_calls_input], - schedule_to_close_timeout=timedelta(days=31), - ) - # Feed the tool call results back to the model - # context.inputs.append(tool_calls_results) - context.current_step.prompt.append(message) - context.current_step.prompt.append(tool_calls_results) - new_response = await workflow.execute_activity( - task_steps.prompt_step, - context, - schedule_to_close_timeout=timedelta( - seconds=30 if debug or testing else 600 - ), - ) - state = PartialTransition(output=new_response.output, type="resume") + state = PartialTransition(output=response) + + case PromptStep(forward_tool_results=False, unwrap=False), StepOutcome( + output=response + ): + workflow.logger.debug(f"Prompt step: Received response: {response}") + state = PartialTransition(output=response) + + case PromptStep(unwrap=False), StepOutcome(output=response) if response[ + "choices" + ][0]["finish_reason"] != "tool_calls": + workflow.logger.debug(f"Prompt step: Received response: {response}") + state = PartialTransition(output=response) + + case PromptStep(unwrap=False), StepOutcome(output=response) if response[ + "choices" + ][0]["finish_reason"] == "tool_calls": + workflow.logger.debug("Prompt step: Received tool call") + message = response["choices"][0]["message"] + tool_calls_input = message["tool_calls"] + + # Enter a wait-for-input step to ask the developer to run the tool calls + tool_calls_results = await workflow.execute_activity( + task_steps.raise_complete_async, + args=[context, tool_calls_input], + schedule_to_close_timeout=timedelta(days=31), + ) + + # Feed the tool call results back to the model + context.current_step.prompt.append(message) + context.current_step.prompt.append(tool_calls_results) + new_response = await workflow.execute_activity( + task_steps.prompt_step, + context, + schedule_to_close_timeout=timedelta( + seconds=30 if debug or testing else 600 + ), + ) + state = PartialTransition(output=new_response.output, type="resume") case SetStep(), StepOutcome(output=evaluated_output): workflow.logger.info("Set step: Updating user state") @@ -450,7 +464,9 @@ async def run( workflow.logger.error("ParallelStep not yet implemented") raise ApplicationError("Not implemented") - case ToolCallStep(), StepOutcome(output=tool_call): + case ToolCallStep(), StepOutcome(output=tool_call) if tool_call[ + "type" + ] == "function": # Enter a wait-for-input step to ask the developer to run the tool calls tool_call_response = await workflow.execute_activity( task_steps.raise_complete_async, @@ -460,6 +476,33 @@ async def run( state = PartialTransition(output=tool_call_response, type="resume") + case ToolCallStep(), StepOutcome(output=tool_call) if tool_call[ + "type" + ] == "integration": + call = tool_call["integration"] + tool_name = call["name"] + arguments = call["arguments"] + integration = next( + (t for t in context.tools if t.name == tool_name), None + ) + + if integration is None: + raise ApplicationError(f"Integration {tool_name} not found") + + tool_call_response = await workflow.execute_activity( + execute_integration, + args=[context, tool_name, integration, arguments], + schedule_to_close_timeout=timedelta( + seconds=30 if debug or testing else 600 + ), + ) + + state = PartialTransition(output=tool_call_response) + + case ToolCallStep(), StepOutcome(output=_): + # FIXME: Handle system/api_call tool_calls + raise ApplicationError("Not implemented") + case _: workflow.logger.error( f"Unhandled step type: {type(context.current_step).__name__}" @@ -468,6 +511,7 @@ async def run( # 4. Transition to the next step workflow.logger.info(f"Transitioning after step {context.cursor.step}") + # The returned value is the transition finally created final_state = await transition(context, state) diff --git a/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py b/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py new file mode 100644 index 000000000..ad1aab998 --- /dev/null +++ b/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py @@ -0,0 +1,87 @@ +#/usr/bin/env python3 + +MIGRATION_ID = "add_forward_tool_calls_option" +CREATED_AT = 1727235852.744035 + + +def run(client, queries): + joiner = "}\n\n{" + + query = joiner.join(queries) + query = f"{{\n{query}\n}}" + client.run(query) + + +add_forward_tool_calls_option_to_session_query = dict( + up=""" + ?[forward_tool_calls, token_budget, context_overflow, developer_id, session_id, updated_at, situation, summary, created_at, metadata, render_templates, token_budget, context_overflow] := *sessions{ + developer_id, + session_id, + updated_at, + situation, + summary, + created_at, + metadata, + render_templates, + token_budget, + context_overflow, + }, + forward_tool_calls = null + + :replace sessions { + developer_id: Uuid, + session_id: Uuid, + updated_at: Validity default [floor(now()), true], + => + situation: String, + summary: String? default null, + created_at: Float default now(), + metadata: Json default {}, + render_templates: Bool default false, + token_budget: Int? default null, + context_overflow: String? default null, + forward_tool_calls: Bool? default null, + } + """, + down=""" + ?[token_budget, context_overflow, developer_id, session_id, updated_at, situation, summary, created_at, metadata, render_templates, token_budget, context_overflow] := *sessions{ + developer_id, + session_id, + updated_at, + situation, + summary, + created_at, + metadata, + render_templates, + token_budget, + context_overflow, + } + + :replace sessions { + developer_id: Uuid, + session_id: Uuid, + updated_at: Validity default [floor(now()), true], + => + situation: String, + summary: String? default null, + created_at: Float default now(), + metadata: Json default {}, + render_templates: Bool default false, + token_budget: Int? default null, + context_overflow: String? default null, + } + """, +) + + +queries = [ + add_forward_tool_calls_option_to_session_query, +] + + +def up(client): + run(client, [q["up"] for q in queries]) + + +def down(client): + run(client, [q["down"] for q in reversed(queries)]) diff --git a/agents-api/tests/fixtures.py b/agents-api/tests/fixtures.py index 4cc5c2674..d5b032311 100644 --- a/agents-api/tests/fixtures.py +++ b/agents-api/tests/fixtures.py @@ -48,6 +48,8 @@ def cozo_client(migrations_dir: str = "./migrations"): # and initialize the schema. client = CozoClient() + setattr(app.state, "cozo_client", client) + init(client) apply(client, migrations_dir=migrations_dir, all_=True) diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index 44f6d6ed4..cddc65666 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -338,7 +338,7 @@ async def _( assert result["value"] == data.input["test"] -# @test("workflow: log step") +@test("workflow: log step") async def _( client=cozo_client, developer_id=test_developer_id, @@ -441,7 +441,61 @@ async def _( assert result["hello"] == data.input["test"] -@test("workflow: wait for input step start") +@test("workflow: tool call integration type step") +async def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, +): + data = CreateExecutionRequest(input={"test": "input"}) + + task = create_task( + developer_id=developer_id, + agent_id=agent.id, + data=CreateTaskRequest( + **{ + "name": "test task", + "description": "test task about", + "input_schema": {"type": "object", "additionalProperties": True}, + "tools": [ + { + "type": "integration", + "name": "hello", + "integration": { + "provider": "dummy", + }, + } + ], + "main": [ + { + "tool": "hello", + "arguments": {"test": "_.test"}, + }, + ], + } + ), + client=client, + ) + + async with patch_testing_temporal() as (_, mock_run_task_execution_workflow): + execution, handle = await start_execution( + developer_id=developer_id, + task_id=task.id, + data=data, + client=client, + ) + + assert handle is not None + assert execution.task_id == task.id + assert execution.input == data.input + mock_run_task_execution_workflow.assert_called_once() + + result = await handle.result() + assert result["test"] == data.input["test"] + + +# FIXME: This test is not working. It gets stuck +# @test("workflow: wait for input step start") async def _( client=cozo_client, developer_id=test_developer_id, @@ -818,6 +872,66 @@ async def _( assert result["role"] == "assistant" +@test("workflow: prompt step unwrap") +async def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, +): + mock_model_response = ModelResponse( + id="fake_id", + choices=[Choices(message={"role": "assistant", "content": "Hello, world!"})], + created=0, + object="text_completion", + ) + + with patch("agents_api.clients.litellm.acompletion") as acompletion: + acompletion.return_value = mock_model_response + data = CreateExecutionRequest(input={"test": "input"}) + + task = create_task( + developer_id=developer_id, + agent_id=agent.id, + data=CreateTaskRequest( + **{ + "name": "test task", + "description": "test task about", + "input_schema": {"type": "object", "additionalProperties": True}, + "main": [ + { + "prompt": [ + { + "role": "user", + "content": "message", + }, + ], + "unwrap": True, + "settings": {}, + }, + ], + } + ), + client=client, + ) + + async with patch_testing_temporal() as (_, mock_run_task_execution_workflow): + execution, handle = await start_execution( + developer_id=developer_id, + task_id=task.id, + data=data, + client=client, + ) + + assert handle is not None + assert execution.task_id == task.id + assert execution.input == data.input + + mock_run_task_execution_workflow.assert_called_once() + + result = await handle.result() + assert result == "Hello, world!" + + @test("workflow: set and get steps") async def _( client=cozo_client, diff --git a/agents-api/tests/utils.py b/agents-api/tests/utils.py index 83b864472..e54dabe17 100644 --- a/agents-api/tests/utils.py +++ b/agents-api/tests/utils.py @@ -84,7 +84,7 @@ def patch_embed_acompletion(output={"role": "assistant", "content": "Hello, worl object="text_completion", ) - with patch("agents_api.clients.embed.embed") as embed, patch( + with patch("agents_api.clients.litellm.aembedding") as embed, patch( "agents_api.clients.litellm.acompletion" ) as acompletion: embed.return_value = [[1.0] * EMBEDDING_SIZE] diff --git a/typespec/common/scalars.tsp b/typespec/common/scalars.tsp index 79eda2d99..97fe37706 100644 --- a/typespec/common/scalars.tsp +++ b/typespec/common/scalars.tsp @@ -48,12 +48,21 @@ alias eventStream = "text/event-stream"; /** Different possible sources that can produce new entries */ alias entrySource = "api_request" | "api_response" | "tool_response" | "internal" | "summarizer" | "meta"; -/** Naming convention for tool references. Tools are resolved in order: `step-settings` -> `task` -> `agent` */ -@pattern("^(function|integration|system|api_call)\\.(\\w+)$") -scalar toolRef extends string; - /** A simple python expression compatible with SimpleEval. */ scalar PyExpression extends string; /** A valid jinja template. */ -scalar JinjaTemplate extends string; \ No newline at end of file +scalar JinjaTemplate extends string; + +/** Integration provider name */ +alias integrationProvider = ( + | "dummy" + | "dall-e" + | "duckduckgo" + | "hackernews" + | "weather" + | "wikipedia" + | "twitter" + | "webpage" + | "requests" +); diff --git a/typespec/package-lock.json b/typespec/package-lock.json index 2eb61490e..0ddfdb155 100644 --- a/typespec/package-lock.json +++ b/typespec/package-lock.json @@ -1,19 +1,19 @@ { "name": "julep-typespec", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "julep-typespec", - "version": "0.3.0", + "version": "0.4.0", "dependencies": { - "@typespec/compiler": "^0.59.1", - "@typespec/http": "^0.59.1", - "@typespec/openapi": "^0.59.0", - "@typespec/openapi3": "^0.59.1", - "@typespec/rest": "^0.59.1", - "@typespec/versioning": "^0.59.0" + "@typespec/compiler": "^0.60.1", + "@typespec/http": "^0.60.0", + "@typespec/openapi": "^0.60.0", + "@typespec/openapi3": "^0.60.0", + "@typespec/rest": "^0.60.0", + "@typespec/versioning": "^0.60.1" } }, "node_modules/@apidevtools/swagger-methods": { @@ -60,9 +60,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -274,9 +274,9 @@ "license": "MIT" }, "node_modules/@typespec/compiler": { - "version": "0.59.1", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.59.1.tgz", - "integrity": "sha512-O2ljgr6YoFaIH6a8lWc90/czdv4B2X6N9wz4WsnQnVvgO0Tj0s+3xkvp4Tv59RKMhT0f3fK6dL8oEGO32FYk1A==", + "version": "0.60.1", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.60.1.tgz", + "integrity": "sha512-I6Vcpvd7mBP7SI5vCBh9rZGXAtVy95BKhAd33Enw32psswiSzRpA7zdyZhOMekTOGVXNS/+E5l2PGGCzQddB4w==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.24.7", @@ -303,34 +303,34 @@ } }, "node_modules/@typespec/http": { - "version": "0.59.1", - "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.59.1.tgz", - "integrity": "sha512-Ai8oCAO+Bw1HMSZ9gOI5Od4fNn/ul4HrVtTB01xFuLK6FQj854pxhzao8ylPnr7gIRQ327FV12/QfXR87yCiYQ==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.60.0.tgz", + "integrity": "sha512-ktfS9vpHfltyeAaQLNAZdqrn6Per3vmB/HDH/iyudYLA5wWblT1siKvpFCMWq53CJorRO7yeOKv+Q/M26zwEtg==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.59.0" + "@typespec/compiler": "~0.60.0" } }, "node_modules/@typespec/openapi": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.59.0.tgz", - "integrity": "sha512-do1Dm5w0MuK3994gYTBg6qMfgeIxmmsDqnz3zimYKMPpbnUBi4F6/o4iCfn0Fn9kaNl+H6UlOzZpsZW9xHui1Q==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.60.0.tgz", + "integrity": "sha512-YVwLppgHY8r/MudHNSLSUXzdw+CIpjmb31gI2a0KDGnI6sWDwY7LSWfjGU4TY/ubt0+X0Tjoy330mTvw71YBTg==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.59.0", - "@typespec/http": "~0.59.0" + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0" } }, "node_modules/@typespec/openapi3": { - "version": "0.59.1", - "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-0.59.1.tgz", - "integrity": "sha512-89VbUbkWKxeFgE0w0hpVyk1UZ6ZHRxOhcAHvF5MgxQxEhs2ALXKAqapWjFQsYrLBhAUoWzdPFrJJUMbwF9kX0Q==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-0.60.0.tgz", + "integrity": "sha512-gvrTHZACdeQtV7GfhVOHqkyTgMFyM2nKAIiz2P83LIncMCDUc00bGKGmaBk+xpuwKtCJyxBeVpCbID31YAq96g==", "license": "MIT", "dependencies": { "@readme/openapi-parser": "~2.6.0", @@ -343,35 +343,35 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.59.0", - "@typespec/http": "~0.59.1", - "@typespec/openapi": "~0.59.0", - "@typespec/versioning": "~0.59.0" + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0", + "@typespec/openapi": "~0.60.0", + "@typespec/versioning": "~0.60.0" } }, "node_modules/@typespec/rest": { - "version": "0.59.1", - "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.59.1.tgz", - "integrity": "sha512-uKU431jBYL2tVQWG5THA75+OtXDa1e8cMAafYK/JJRRiVRd8D/Epd8fp07dzlB8tFGrhCaGlekRMqFPFrHh2/A==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.60.0.tgz", + "integrity": "sha512-mHYubyuBvwdV2xkHrJfPwV7b/Ksyb9lA1Q/AQwpVFa7Qu1X075TBVALmH+hK3V0EdUG1CGJZ5Sw4BWgl8ZS0BA==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.59.0", - "@typespec/http": "~0.59.1" + "@typespec/compiler": "~0.60.0", + "@typespec/http": "~0.60.0" } }, "node_modules/@typespec/versioning": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.59.0.tgz", - "integrity": "sha512-aihO/ux0lLmsuYAdGVkiBflSudcZokYG42SELk1FtMFo609G3Pd7ep7hau6unBnMIceQZejB0ow5UGRupK4X5A==", + "version": "0.60.1", + "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.60.1.tgz", + "integrity": "sha512-HogYL7P9uOPoSvkLLDjF22S6E9td6EY3c6TcIHhCzDTAQoi54csikD0gNrtcCkFG0UeQk29HgQymV397j+vp4g==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.59.0" + "@typespec/compiler": "~0.60.0" } }, "node_modules/ajv": { @@ -514,9 +514,9 @@ "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -637,9 +637,9 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -761,6 +761,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1059,9 +1060,9 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", - "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", "license": "MIT" }, "node_modules/vscode-languageserver-types": { diff --git a/typespec/package.json b/typespec/package.json index a7b3d7ee4..d424d67dc 100644 --- a/typespec/package.json +++ b/typespec/package.json @@ -1,14 +1,14 @@ { "name": "julep-typespec", - "version": "0.3.0", + "version": "0.4.0", "type": "module", "dependencies": { - "@typespec/compiler": "^0.59.1", - "@typespec/http": "^0.59.1", - "@typespec/openapi": "^0.59.0", - "@typespec/openapi3": "^0.59.1", - "@typespec/rest": "^0.59.1", - "@typespec/versioning": "^0.59.0" + "@typespec/compiler": "^0.60.1", + "@typespec/http": "^0.60.0", + "@typespec/openapi": "^0.60.0", + "@typespec/openapi3": "^0.60.0", + "@typespec/rest": "^0.60.0", + "@typespec/versioning": "^0.60.1" }, "private": true } diff --git a/typespec/sessions/models.tsp b/typespec/sessions/models.tsp index aecec4ba1..dfbb6ea41 100644 --- a/typespec/sessions/models.tsp +++ b/typespec/sessions/models.tsp @@ -62,6 +62,15 @@ model Session { /** Action to start on context window overflow */ context_overflow: ContextOverflowType | null = null; + /** Whether to forward the tool results to the model when available. + * "true" => always forward + * "false" => never forward + * null => forward if applicable (default) + * + * If a tool call is made, the tool's output will be sent back to the model as the model's input. + * If a tool call is not made, the model's output will be returned as is. */ + forward_tool_results: boolean | null = null; + ...HasId; ...HasMetadata; ...HasTimestamps; diff --git a/typespec/tasks/models.tsp b/typespec/tasks/models.tsp index 4ec23f31b..b8b115861 100644 --- a/typespec/tasks/models.tsp +++ b/typespec/tasks/models.tsp @@ -30,6 +30,24 @@ model TaskTool extends CreateToolRequest { inherited?: boolean = false; } +/** Reference to a tool by id */ +model ToolRefById { + @visibility("read", "create") + id?: uuid; +} + +/** Reference to a tool by name */ +model ToolRefByName { + @visibility("read", "create") + name?: validPythonIdentifier; +} + +/** Reference to a tool */ +model ToolRef { + @visibility("read", "create") + ref: ToolRefById | ToolRefByName; +} + /** Object describing a Task */ model Task { @visibility("read", "create") diff --git a/typespec/tasks/steps.tsp b/typespec/tasks/steps.tsp index d9be46577..3495def1b 100644 --- a/typespec/tasks/steps.tsp +++ b/typespec/tasks/steps.tsp @@ -4,6 +4,7 @@ import "../chat"; import "../common"; import "../docs"; import "../entries"; +import "../tools"; import "./step_kind.tsp"; @@ -13,6 +14,7 @@ using Chat; using Common; using Docs; using Entries; +using Tools; namespace Tasks; @@ -76,7 +78,7 @@ model ToolCallStep extends BaseWorkflowStep<"tool_call"> { model ToolCallStepDef { /** The tool to run */ - tool: toolRef; + tool: validPythonIdentifier; /** The input parameters for the tool (defaults to last step output) */ arguments: ExpressionObject | "_" = "_"; @@ -93,8 +95,26 @@ model PromptStepDef { /** The prompt to run */ prompt: JinjaTemplate | InputChatMLMessage[]; + /** The tools to use for the prompt */ + tools: "all" | (ToolRef | CreateToolRequest)[] = #[]; + + /** The tool choice for the prompt */ + tool_choice?: ToolChoiceOption; + /** Settings for the prompt */ settings?: ChatSettings; + + /** Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` */ + unwrap?: boolean = false; + + /** Whether to forward the tool results to the model when available. + * "true" => always forward + * "false" => never forward + * null => forward if applicable (default) + * + * If a tool call is made, the tool's output will be used as the model's input. + * If a tool call is not made, the model's output will be used as the next step's input. */ + forward_tool_results: boolean | null = null; } model EvaluateStep extends BaseWorkflowStep<"evaluate"> { diff --git a/typespec/tools/models.tsp b/typespec/tools/models.tsp index bab70b643..b7478ee24 100644 --- a/typespec/tools/models.tsp +++ b/typespec/tools/models.tsp @@ -35,13 +35,43 @@ model FunctionDef { name?: null = null; /** Description of the function */ - description?: identifierSafeUnicode; + description?: string; /** The parameters the function accepts */ parameters?: FunctionParameters; } +/** Integration definition */ +model IntegrationDef { + /** The provider of the integration */ + provider: integrationProvider; + + /** The specific method of the integration to call */ + method?: string; + + /** Optional description of the integration */ + description?: string; + + /** The setup parameters the integration accepts */ + setup?: FunctionParameters; + + /** The arguments to pre-apply to the integration call */ + arguments?: FunctionParameters; +} + +/** System definition */ +model SystemDef { + /** The name of the system call */ + call: string; + + /** Optional description of the system call */ + description?: string; + + /** The arguments to pre-apply to the system call */ + arguments?: FunctionParameters; +} + // TODO: We should use this model for all tools, not just functions and discriminate on the type model Tool { /** Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) */ @@ -51,10 +81,10 @@ model Tool { name: validPythonIdentifier; /** The function to call */ - function: FunctionDef; - integration?: unknown; - system?: unknown; - api_call?: unknown; + function?: FunctionDef; + integration?: IntegrationDef; + system?: SystemDef; + api_call?: never; // TODO: Implement ...HasTimestamps; ...HasId; @@ -71,9 +101,9 @@ model NamedToolChoice { type: ToolType; function?: FunctionCallOption; - integration?: unknown; - system?: unknown; - api_call?: unknown; + integration?: never; // TODO: Implement + system?: never; // TODO: Implement + api_call?: never; // TODO: Implement } model NamedFunctionChoice extends NamedToolChoice { @@ -112,9 +142,9 @@ model ChosenToolCall { type: ToolType; function?: FunctionCallOption; - integration?: unknown; - system?: unknown; - api_call?: unknown; + integration?: never; // TODO: Implement + system?: never; // TODO: Implement + api_call?: never; // TODO: Implement ...HasId; } From ecb1a12d155af5f6f0676523722aaae1c6c8c58b Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Wed, 25 Sep 2024 22:38:03 +0300 Subject: [PATCH 004/113] feat(integration-service): Add integrations service (#520) Introduces a new integration service with FastAPI, Docker setup, and support for multiple integrations like DALL-E and Wikipedia. - Integration Service: + Adds integrations-service with Docker setup in docker-compose.yml and Dockerfile. + FastAPI application in web.py with routers for execution and integration management. - Models: + Defines models for DalleImageGenerator, DuckDuckGoSearch, HackerNews, Weather, and Wikipedia in models directory. + IntegrationExecutionRequest and IntegrationExecutionResponse for handling execution requests. - Utilities: + Implements execute_integration in execute_integration.py to handle integration execution logic. + Integration utilities for DALL-E, DuckDuckGo, Hacker News, Weather, and Wikipedia in utils/integrations. - Configuration: + Adds pyproject.toml for dependency management with Poetry. + Adds pytype.toml for type checking configuration. --- docker-compose.yml | 1 + integrations-service/Dockerfile | 19 + integrations-service/docker-compose.yml | 26 + integrations-service/integrations/__init__.py | 0 .../integrations/models/__init__.py | 17 + .../models/dalle_image_generator.py | 9 + .../integrations/models/duckduckgo_search.py | 5 + .../integrations/models/hacker_news.py | 5 + .../integrations/models/models.py | 81 + .../integrations/models/weather.py | 13 + .../integrations/models/wikipedia.py | 6 + .../integrations/routers/__init__.py | 2 + .../routers/execution/__init__.py | 1 + .../integrations/routers/execution/execute.py | 19 + .../integrations/routers/execution/router.py | 3 + .../routers/integrations/__init__.py | 2 + .../integrations/get_integration_tool.py | 40 + .../routers/integrations/get_integrations.py | 82 + .../routers/integrations/router.py | 3 + .../integrations/utils/execute_integration.py | 26 + .../utils/integrations/__init__.py | 5 + .../utils/integrations/__tts_query.py | 20 + .../utils/integrations/__twitter.py | 32 + .../integrations/dalle_image_generator.py | 22 + .../utils/integrations/duckduckgo_search.py | 15 + .../utils/integrations/gmail/send_mail.py | 6 + .../utils/integrations/hacker_news.py | 31 + .../utils/integrations/weather.py | 24 + .../utils/integrations/wikipedia.py | 29 + integrations-service/integrations/web.py | 83 + integrations-service/poetry.lock | 1961 +++++++++++++++++ integrations-service/pyproject.toml | 36 + integrations-service/pytype.toml | 64 + 33 files changed, 2688 insertions(+) create mode 100644 integrations-service/Dockerfile create mode 100644 integrations-service/docker-compose.yml create mode 100644 integrations-service/integrations/__init__.py create mode 100644 integrations-service/integrations/models/__init__.py create mode 100644 integrations-service/integrations/models/dalle_image_generator.py create mode 100644 integrations-service/integrations/models/duckduckgo_search.py create mode 100644 integrations-service/integrations/models/hacker_news.py create mode 100644 integrations-service/integrations/models/models.py create mode 100644 integrations-service/integrations/models/weather.py create mode 100644 integrations-service/integrations/models/wikipedia.py create mode 100644 integrations-service/integrations/routers/__init__.py create mode 100644 integrations-service/integrations/routers/execution/__init__.py create mode 100644 integrations-service/integrations/routers/execution/execute.py create mode 100644 integrations-service/integrations/routers/execution/router.py create mode 100644 integrations-service/integrations/routers/integrations/__init__.py create mode 100644 integrations-service/integrations/routers/integrations/get_integration_tool.py create mode 100644 integrations-service/integrations/routers/integrations/get_integrations.py create mode 100644 integrations-service/integrations/routers/integrations/router.py create mode 100644 integrations-service/integrations/utils/execute_integration.py create mode 100644 integrations-service/integrations/utils/integrations/__init__.py create mode 100644 integrations-service/integrations/utils/integrations/__tts_query.py create mode 100644 integrations-service/integrations/utils/integrations/__twitter.py create mode 100644 integrations-service/integrations/utils/integrations/dalle_image_generator.py create mode 100644 integrations-service/integrations/utils/integrations/duckduckgo_search.py create mode 100644 integrations-service/integrations/utils/integrations/gmail/send_mail.py create mode 100644 integrations-service/integrations/utils/integrations/hacker_news.py create mode 100644 integrations-service/integrations/utils/integrations/weather.py create mode 100644 integrations-service/integrations/utils/integrations/wikipedia.py create mode 100644 integrations-service/integrations/web.py create mode 100644 integrations-service/poetry.lock create mode 100644 integrations-service/pyproject.toml create mode 100644 integrations-service/pytype.toml diff --git a/docker-compose.yml b/docker-compose.yml index b2db4939f..c5ea3bbf0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,7 @@ include: - ./agents-api/docker-compose.yml - ./scheduler/docker-compose.yml - ./llm-proxy/docker-compose.yml + - ./integrations-service/docker-compose.yml # TODO: Enable after testing # - ./monitoring/docker-compose.yml diff --git a/integrations-service/Dockerfile b/integrations-service/Dockerfile new file mode 100644 index 000000000..785021926 --- /dev/null +++ b/integrations-service/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.11-slim + +WORKDIR /app + +# Install Poetry +RUN pip install poetry + +# Copy only requirements to cache them in docker layer +COPY pyproject.toml poetry.lock* /app/ + +# Project initialization: +RUN poetry config virtualenvs.create false \ + && poetry install --no-interaction --no-ansi + +# Copy project +COPY . ./ + +# Run the application +CMD ["python", "-m", "integrations.web", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/integrations-service/docker-compose.yml b/integrations-service/docker-compose.yml new file mode 100644 index 000000000..750dc473d --- /dev/null +++ b/integrations-service/docker-compose.yml @@ -0,0 +1,26 @@ +name: julep-integrations + +# Shared environment variables +x--shared-environment: &shared-environment + OPENAI_API_KEY: ${OPENAI_API_KEY} + +services: + integrations: + environment: + <<: *shared-environment + + build: . + ports: + - "8000:8000" + + develop: + watch: + - action: sync+restart + path: ./ + target: /app/ + ignore: + - ./**/*.pyc + - action: rebuild + path: poetry.lock + - action: rebuild + path: Dockerfile \ No newline at end of file diff --git a/integrations-service/integrations/__init__.py b/integrations-service/integrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/integrations-service/integrations/models/__init__.py b/integrations-service/integrations/models/__init__.py new file mode 100644 index 000000000..5efd3c797 --- /dev/null +++ b/integrations-service/integrations/models/__init__.py @@ -0,0 +1,17 @@ +from .dalle_image_generator import ( + DalleImageGeneratorArguments, + DalleImageGeneratorSetup, +) +from .duckduckgo_search import DuckDuckGoSearchExecutionArguments +from .hacker_news import HackerNewsExecutionArguments + +# TODO: Move these models somewhere else +from .models import ( + ExecuteIntegrationArguments, + ExecuteIntegrationSetup, + IntegrationDef, + IntegrationExecutionRequest, + IntegrationExecutionResponse, +) +from .weather import WeatherExecutionArguments, WeatherExecutionSetup +from .wikipedia import WikipediaExecutionArguments diff --git a/integrations-service/integrations/models/dalle_image_generator.py b/integrations-service/integrations/models/dalle_image_generator.py new file mode 100644 index 000000000..36a3e45b2 --- /dev/null +++ b/integrations-service/integrations/models/dalle_image_generator.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel, Field + + +class DalleImageGeneratorSetup(BaseModel): + api_key: str = Field(str, description="The API key for DALL-E") + + +class DalleImageGeneratorArguments(BaseModel): + prompt: str = Field(str, description="The image generation prompt") diff --git a/integrations-service/integrations/models/duckduckgo_search.py b/integrations-service/integrations/models/duckduckgo_search.py new file mode 100644 index 000000000..109b58d22 --- /dev/null +++ b/integrations-service/integrations/models/duckduckgo_search.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel, Field + + +class DuckDuckGoSearchExecutionArguments(BaseModel): + query: str = Field(..., description="The search query string") diff --git a/integrations-service/integrations/models/hacker_news.py b/integrations-service/integrations/models/hacker_news.py new file mode 100644 index 000000000..057ec83bd --- /dev/null +++ b/integrations-service/integrations/models/hacker_news.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel, Field + + +class HackerNewsExecutionArguments(BaseModel): + url: str = Field(..., description="The URL of the Hacker News thread to fetch") diff --git a/integrations-service/integrations/models/models.py b/integrations-service/integrations/models/models.py new file mode 100644 index 000000000..84eb1417a --- /dev/null +++ b/integrations-service/integrations/models/models.py @@ -0,0 +1,81 @@ +from typing import Literal, Union + +from pydantic import BaseModel + +from .dalle_image_generator import ( + DalleImageGeneratorArguments, + DalleImageGeneratorSetup, +) +from .duckduckgo_search import DuckDuckGoSearchExecutionArguments +from .hacker_news import HackerNewsExecutionArguments +from .weather import WeatherExecutionArguments, WeatherExecutionSetup +from .wikipedia import WikipediaExecutionArguments + +ExecuteIntegrationArguments = Union[ + WikipediaExecutionArguments, + DuckDuckGoSearchExecutionArguments, + DalleImageGeneratorArguments, + WeatherExecutionArguments, + HackerNewsExecutionArguments, +] + +ExecuteIntegrationSetup = Union[ + DalleImageGeneratorSetup, + WeatherExecutionSetup, +] + + +class IntegrationExecutionRequest(BaseModel): + setup: ExecuteIntegrationSetup | None = None + """ + The setup parameters the integration accepts (such as API keys) + """ + arguments: ExecuteIntegrationArguments + """ + The arguments to pass to the integration + """ + + +class IntegrationExecutionResponse(BaseModel): + result: str + """ + The result of the integration execution + """ + + +class IntegrationDef(BaseModel): + provider: ( + Literal[ + "dummy", + "dalle_image_generator", + "duckduckgo_search", + "hacker_news", + "weather", + "wikipedia", + "twitter", + "web_base", + "requests", + "gmail", + "tts_query", + ] + | None + ) = None + """ + The provider of the integration + """ + method: str | None = None + """ + The specific method of the integration to call + """ + description: str | None = None + """ + Optional description of the integration + """ + setup: dict | None = None + """ + The setup parameters the integration accepts + """ + arguments: dict | None = None + """ + The arguments to pre-apply to the integration call + """ diff --git a/integrations-service/integrations/models/weather.py b/integrations-service/integrations/models/weather.py new file mode 100644 index 000000000..c432e1e54 --- /dev/null +++ b/integrations-service/integrations/models/weather.py @@ -0,0 +1,13 @@ +from pydantic import BaseModel, Field + + +class WeatherExecutionSetup(BaseModel): + openweathermap_api_key: str = Field( + ..., description="The location for which to fetch weather data" + ) + + +class WeatherExecutionArguments(BaseModel): + location: str = Field( + ..., description="The location for which to fetch weather data" + ) diff --git a/integrations-service/integrations/models/wikipedia.py b/integrations-service/integrations/models/wikipedia.py new file mode 100644 index 000000000..8276d8484 --- /dev/null +++ b/integrations-service/integrations/models/wikipedia.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + + +class WikipediaExecutionArguments(BaseModel): + query: str = Field(..., description="The search query string") + load_max_docs: int = Field(2, description="Maximum number of documents to load") diff --git a/integrations-service/integrations/routers/__init__.py b/integrations-service/integrations/routers/__init__.py new file mode 100644 index 000000000..f1be65754 --- /dev/null +++ b/integrations-service/integrations/routers/__init__.py @@ -0,0 +1,2 @@ +from .execution.router import router as execution_router +from .integrations.router import router as integrations_router diff --git a/integrations-service/integrations/routers/execution/__init__.py b/integrations-service/integrations/routers/execution/__init__.py new file mode 100644 index 000000000..ef8e79dda --- /dev/null +++ b/integrations-service/integrations/routers/execution/__init__.py @@ -0,0 +1 @@ +from .execute import execute diff --git a/integrations-service/integrations/routers/execution/execute.py b/integrations-service/integrations/routers/execution/execute.py new file mode 100644 index 000000000..9baf63795 --- /dev/null +++ b/integrations-service/integrations/routers/execution/execute.py @@ -0,0 +1,19 @@ +from fastapi import Body, HTTPException, Path + +from ...models import IntegrationExecutionRequest, IntegrationExecutionResponse +from ...utils.execute_integration import execute_integration +from .router import router + + +@router.post("/execute/{provider}", tags=["execution"]) +async def execute( + provider: str = Path(..., description="The integration provider"), + request: IntegrationExecutionRequest = Body( + ..., description="The integration execution request" + ), +) -> IntegrationExecutionResponse: + try: + result = await execute_integration(provider, request.setup, request.arguments) + return IntegrationExecutionResponse(result=result) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) diff --git a/integrations-service/integrations/routers/execution/router.py b/integrations-service/integrations/routers/execution/router.py new file mode 100644 index 000000000..5c3ec9311 --- /dev/null +++ b/integrations-service/integrations/routers/execution/router.py @@ -0,0 +1,3 @@ +from fastapi import APIRouter + +router: APIRouter = APIRouter() diff --git a/integrations-service/integrations/routers/integrations/__init__.py b/integrations-service/integrations/routers/integrations/__init__.py new file mode 100644 index 000000000..01645a176 --- /dev/null +++ b/integrations-service/integrations/routers/integrations/__init__.py @@ -0,0 +1,2 @@ +from .get_integration_tool import get_integration_tool +from .get_integrations import get_integrations diff --git a/integrations-service/integrations/routers/integrations/get_integration_tool.py b/integrations-service/integrations/routers/integrations/get_integration_tool.py new file mode 100644 index 000000000..8392c52d2 --- /dev/null +++ b/integrations-service/integrations/routers/integrations/get_integration_tool.py @@ -0,0 +1,40 @@ +from typing import Optional + +from fastapi import HTTPException + +from ...models.models import IntegrationDef +from .get_integrations import get_integrations +from .router import router + + +def convert_to_openai_tool(integration: IntegrationDef) -> dict: + return { + "type": "function", + "function": { + "name": integration.provider, + "description": integration.description, + "parameters": { + "type": "object", + "properties": integration.arguments, + "required": [ + k + for k, v in integration.arguments.items() + if v.get("required", False) + ], + }, + }, + } + + +@router.get("/integrations/{provider}/tool", tags=["integration_tool"]) +@router.get("/integrations/{provider}/{method}/tool", tags=["integration_tool"]) +async def get_integration_tool(provider: str, method: Optional[str] = None): + integrations = await get_integrations() + + for integration in integrations: + if integration.provider == provider and ( + method is None or integration.method == method + ): + return convert_to_openai_tool(integration) + + raise HTTPException(status_code=404, detail="Integration not found") diff --git a/integrations-service/integrations/routers/integrations/get_integrations.py b/integrations-service/integrations/routers/integrations/get_integrations.py new file mode 100644 index 000000000..ff47340c0 --- /dev/null +++ b/integrations-service/integrations/routers/integrations/get_integrations.py @@ -0,0 +1,82 @@ +import importlib +import inspect +import os +from typing import Any, List + +from pydantic import BaseModel + +from ...models.models import IntegrationDef +from ...utils import integrations +from .router import router + + +def create_integration_def(module: Any) -> IntegrationDef: + module_parts = module.__name__.split(".") + if len(module_parts) > 4: # Nested integration + provider = module_parts[-2] + method = module_parts[-1] + else: # Top-level integration + provider = module_parts[-1] + method = None + + # Find the first function in the module + function_name = next( + name + for name, obj in inspect.getmembers(module) + if inspect.isfunction(obj) and not name.startswith("_") + ) + function = getattr(module, function_name) + signature = inspect.signature(function) + + # Get the Pydantic model for the parameters + params_model = next(iter(signature.parameters.values())).annotation + + # Check if the params_model is a Pydantic model + if issubclass(params_model, BaseModel): + arguments = {} + for field_name, field in params_model.model_fields.items(): + field_type = field.annotation + arguments[field_name] = { + "type": field_type.__name__.lower(), + "description": field.description, + } + else: + # Fallback to a dictionary if it's not a Pydantic model + arguments = { + param.name: {"type": str(param.annotation.__name__).lower()} + for param in signature.parameters.values() + if param.name != "parameters" + } + + return IntegrationDef( + provider=provider, + method=method, + description=function.__doc__.strip() if function.__doc__ else None, + arguments=arguments, + ) + + +@router.get("/integrations", tags=["integrations"]) +async def get_integrations() -> List[IntegrationDef]: + integration_defs = [] + integrations_dir = os.path.dirname(integrations.__file__) + + for item in os.listdir(integrations_dir): + item_path = os.path.join(integrations_dir, item) + + if os.path.isdir(item_path): + # This is a toolkit + for file in os.listdir(item_path): + if file.endswith(".py") and not file.startswith("__"): + module = importlib.import_module( + f"...utils.integrations.{item}.{file[:-3]}", package=__package__ + ) + integration_defs.append(create_integration_def(module)) + elif item.endswith(".py") and not item.startswith("__"): + # This is a single-file tool + module = importlib.import_module( + f"...utils.integrations.{item[:-3]}", package=__package__ + ) + integration_defs.append(create_integration_def(module)) + + return integration_defs diff --git a/integrations-service/integrations/routers/integrations/router.py b/integrations-service/integrations/routers/integrations/router.py new file mode 100644 index 000000000..5c3ec9311 --- /dev/null +++ b/integrations-service/integrations/routers/integrations/router.py @@ -0,0 +1,3 @@ +from fastapi import APIRouter + +router: APIRouter = APIRouter() diff --git a/integrations-service/integrations/utils/execute_integration.py b/integrations-service/integrations/utils/execute_integration.py new file mode 100644 index 000000000..a6b05ae90 --- /dev/null +++ b/integrations-service/integrations/utils/execute_integration.py @@ -0,0 +1,26 @@ +from ..models import ExecuteIntegrationArguments, ExecuteIntegrationSetup +from .integrations.dalle_image_generator import dalle_image_generator +from .integrations.duckduckgo_search import duckduckgo_search +from .integrations.hacker_news import hacker_news +from .integrations.weather import weather +from .integrations.wikipedia import wikipedia + + +async def execute_integration( + provider: str, + setup: ExecuteIntegrationSetup | None, + arguments: ExecuteIntegrationArguments, +) -> str: + match provider: + case "duckduckgo_search": + return await duckduckgo_search(arguments=arguments) + case "dalle_image_generator": + return await dalle_image_generator(setup=setup, arguments=arguments) + case "wikipedia": + return await wikipedia(arguments=arguments) + case "weather": + return await weather(setup=setup, arguments=arguments) + case "hacker_news": + return await hacker_news(arguments=arguments) + case _: + raise ValueError(f"Unknown integration: {provider}") diff --git a/integrations-service/integrations/utils/integrations/__init__.py b/integrations-service/integrations/utils/integrations/__init__.py new file mode 100644 index 000000000..5047b57bd --- /dev/null +++ b/integrations-service/integrations/utils/integrations/__init__.py @@ -0,0 +1,5 @@ +from .dalle_image_generator import dalle_image_generator +from .duckduckgo_search import duckduckgo_search +from .hacker_news import hacker_news +from .weather import weather +from .wikipedia import wikipedia diff --git a/integrations-service/integrations/utils/integrations/__tts_query.py b/integrations-service/integrations/utils/integrations/__tts_query.py new file mode 100644 index 000000000..b4ce59d4d --- /dev/null +++ b/integrations-service/integrations/utils/integrations/__tts_query.py @@ -0,0 +1,20 @@ +import os + +from langchain_community.tools import ElevenLabsText2SpeechTool + + +async def tts_query(arguments: dict) -> str: + """ + Converts text to speech using ElevenLabs API and plays the generated audio. + """ + text_to_speak = arguments.get("query") + if not text_to_speak: + raise ValueError("Query parameter is required for text to speech") + + eleven_api_key = os.getenv("ELEVEN_API_KEY") + + tts = ElevenLabsText2SpeechTool(eleven_api_key=eleven_api_key) + + speech_file = tts.run(text_to_speak) + + return tts.play(speech_file) diff --git a/integrations-service/integrations/utils/integrations/__twitter.py b/integrations-service/integrations/utils/integrations/__twitter.py new file mode 100644 index 000000000..b21b18197 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/__twitter.py @@ -0,0 +1,32 @@ +import os + +from langchain_community.document_loaders import TwitterTweetLoader + + +async def twitter(arguments: dict) -> str: + """ + Loads tweets from specified Twitter users and returns them as formatted string. + """ + bearer_token = os.getenv("TWITTER_BEARER_TOKEN") + if not bearer_token: + raise ValueError("Twitter API bearer token is not set") + + twitter_users = arguments.get("twitter_users") + if not twitter_users: + raise ValueError("Twitter users parameter is required for Twitter loader") + + number_tweets = arguments.get("number_tweets", 50) + + loader = TwitterTweetLoader.from_bearer_token( + oauth2_bearer_token=bearer_token, + twitter_users=twitter_users, + number_tweets=number_tweets, + ) + + documents = loader.load() + + # Format the results as a string + result = "\n\n".join( + [f"Tweet: {doc.page_content}\nMetadata: {doc.metadata}" for doc in documents] + ) + return result diff --git a/integrations-service/integrations/utils/integrations/dalle_image_generator.py b/integrations-service/integrations/utils/integrations/dalle_image_generator.py new file mode 100644 index 000000000..e0a6496b8 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/dalle_image_generator.py @@ -0,0 +1,22 @@ +from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper + +from ...models import DalleImageGeneratorArguments, DalleImageGeneratorSetup + + +async def dalle_image_generator( + setup: DalleImageGeneratorSetup, arguments: DalleImageGeneratorArguments +) -> str: + """ + Generates an image using DALL-E based on a provided prompt. + """ + + assert isinstance(setup, DalleImageGeneratorSetup), "Invalid setup" + assert isinstance(arguments, DalleImageGeneratorArguments), "Invalid arguments" + + # FIXME: Fix OpenAI API Key error + + dalle = DallEAPIWrapper(api_key=setup.api_key) + prompt = arguments.prompt + if not prompt: + raise ValueError("Prompt parameter is required for DALL-E image generation") + return dalle.run(prompt) diff --git a/integrations-service/integrations/utils/integrations/duckduckgo_search.py b/integrations-service/integrations/utils/integrations/duckduckgo_search.py new file mode 100644 index 000000000..a8ea38f56 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/duckduckgo_search.py @@ -0,0 +1,15 @@ +from langchain_community.tools import DuckDuckGoSearchRun + +from ...models import DuckDuckGoSearchExecutionArguments + + +async def duckduckgo_search(arguments: DuckDuckGoSearchExecutionArguments) -> str: + """ + Performs a web search using DuckDuckGo and returns the results. + """ + + search = DuckDuckGoSearchRun() + query = arguments.query + if not query: + raise ValueError("Query parameter is required for DuckDuckGo search") + return search.run(query) diff --git a/integrations-service/integrations/utils/integrations/gmail/send_mail.py b/integrations-service/integrations/utils/integrations/gmail/send_mail.py new file mode 100644 index 000000000..e1863f280 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/gmail/send_mail.py @@ -0,0 +1,6 @@ +async def send_mail(arguments: dict) -> str: + """ + Dummy integration for sending an email to a specified recipient with a given subject and message. + """ + + return "Mail sent" diff --git a/integrations-service/integrations/utils/integrations/hacker_news.py b/integrations-service/integrations/utils/integrations/hacker_news.py new file mode 100644 index 000000000..522b64e58 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/hacker_news.py @@ -0,0 +1,31 @@ +from langchain_community.document_loaders import HNLoader + +from ...models import HackerNewsExecutionArguments + + +async def hacker_news(arguments: HackerNewsExecutionArguments) -> str: + """ + Fetches and formats content from a Hacker News thread using the provided URL. + """ + + assert isinstance(arguments, HackerNewsExecutionArguments), "Invalid arguments" + + url = arguments.url + if not url: + raise ValueError("URL parameter is required for Hacker News search") + loader = HNLoader(url) + documents = loader.load() + + if not documents: + raise ValueError("No data found for the given URL") + + # data is a list of documents, + result = "\n\n".join( + [ + f"Title: {doc.metadata['title']}\n" + f"Source: {doc.metadata['source']}\n" + f"Content: {doc.page_content}..." + for doc in documents + ] + ) + return result diff --git a/integrations-service/integrations/utils/integrations/weather.py b/integrations-service/integrations/utils/integrations/weather.py new file mode 100644 index 000000000..2bf00d295 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/weather.py @@ -0,0 +1,24 @@ +from langchain_community.utilities import OpenWeatherMapAPIWrapper + +from ...models import WeatherExecutionArguments, WeatherExecutionSetup + + +async def weather( + setup: WeatherExecutionSetup, arguments: WeatherExecutionArguments +) -> str: + """ + Fetches weather data for a specified location using OpenWeatherMap API. + """ + + assert isinstance(setup, WeatherExecutionSetup), "Invalid setup" + assert isinstance(arguments, WeatherExecutionArguments), "Invalid arguments" + + location = arguments.location + + openweathermap_api_key = setup.openweathermap_api_key + if not location: + raise ValueError("Location parameter is required for weather data") + + weather = OpenWeatherMapAPIWrapper(openweathermap_api_key=openweathermap_api_key) + + return weather.run(location) diff --git a/integrations-service/integrations/utils/integrations/wikipedia.py b/integrations-service/integrations/utils/integrations/wikipedia.py new file mode 100644 index 000000000..9e04d2871 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/wikipedia.py @@ -0,0 +1,29 @@ +from langchain_community.document_loaders import WikipediaLoader + +from ...models import WikipediaExecutionArguments + + +async def wikipedia(arguments: WikipediaExecutionArguments) -> str: + """ + Searches Wikipedia for a given query and returns formatted results. + """ + + query = arguments.query + if not query: + raise ValueError("Query parameter is required for Wikipedia search") + + load_max_docs = arguments.load_max_docs + + loader = WikipediaLoader(query=query, load_max_docs=load_max_docs) + documents = loader.load() + + # Format the results as string + result = "\n\n".join( + [ + f"Title: {doc.metadata['title']}\n" + f"Summary: {doc.metadata['summary']}\n" + f"Content: {doc.page_content}..." + for doc in documents + ] + ) + return result diff --git a/integrations-service/integrations/web.py b/integrations-service/integrations/web.py new file mode 100644 index 000000000..ae91a53ca --- /dev/null +++ b/integrations-service/integrations/web.py @@ -0,0 +1,83 @@ +import logging +from typing import Any, Callable + +import fire +import uvicorn +from fastapi import FastAPI, Request, status +from fastapi.exceptions import HTTPException, RequestValidationError +from fastapi.responses import JSONResponse + +from .routers import execution_router, integrations_router + +app: FastAPI = FastAPI() + +# Add routers +app.include_router(integrations_router) +app.include_router(execution_router) + + +logger: logging.Logger = logging.getLogger(__name__) + + +def make_exception_handler(status: int) -> Callable[[Any, Any], Any]: + """ + Creates a custom exception handler for the application. + + Parameters: + - status (int): The HTTP status code to return for this exception. + + Returns: + A callable exception handler that logs the exception and returns a JSON response with the specified status code. + """ + + async def _handler(request: Request, exc): + exc_str = f"{exc}".replace("\n", " ").replace(" ", " ") + logger.exception(exc) + content = {"status_code": status, "message": exc_str, "data": None} + return JSONResponse(content=content, status_code=status) + + return _handler + + +def register_exceptions(app: FastAPI) -> None: + """ + Registers custom exception handlers for the FastAPI application. + + Parameters: + - app (FastAPI): The FastAPI application instance to register the exception handlers for. + """ + app.add_exception_handler( + RequestValidationError, + make_exception_handler(status.HTTP_422_UNPROCESSABLE_ENTITY), + ) + + +@app.exception_handler(HTTPException) +async def http_exception_handler(request, exc: HTTPException): # pylint: disable=unused-argument + return JSONResponse( + status_code=exc.status_code, + content={"error": {"message": str(exc)}}, + ) + + +def main( + host="0.0.0.0", + port=8000, + backlog=4096, + timeout_keep_alive=30, + workers=None, + log_level="info", +) -> None: + uvicorn.run( + app, + host=host, + port=port, + log_level=log_level, + timeout_keep_alive=timeout_keep_alive, + backlog=backlog, + workers=workers, + ) + + +if __name__ == "__main__": + fire.Fire(main) diff --git a/integrations-service/poetry.lock b/integrations-service/poetry.lock new file mode 100644 index 000000000..64f1f5d9e --- /dev/null +++ b/integrations-service/poetry.lock @@ -0,0 +1,1961 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.0" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, + {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, +] + +[[package]] +name = "aiohttp" +version = "3.10.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, + {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, + {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, + {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, + {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, + {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, + {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, + {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, + {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, + {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, + {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, + {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, + {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, + {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.6.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "duckduckgo-search" +version = "6.2.13" +description = "Search for words, documents, images, news, maps and text translation using the DuckDuckGo.com search engine." +optional = false +python-versions = ">=3.8" +files = [ + {file = "duckduckgo_search-6.2.13-py3-none-any.whl", hash = "sha256:a6618fb2744fa1d081b1bf2e47ef8051de993276a15c20f4e879a150726472de"}, + {file = "duckduckgo_search-6.2.13.tar.gz", hash = "sha256:f89a9782f0f47d18c01a761c83453d0aef7a4335d1b6466fc47709652d5ca791"}, +] + +[package.dependencies] +click = ">=8.1.7" +primp = ">=0.6.3" + +[package.extras] +dev = ["mypy (>=1.11.1)", "pytest (>=8.3.1)", "pytest-asyncio (>=0.23.8)", "ruff (>=0.6.1)"] +lxml = ["lxml (>=5.2.2)"] + +[[package]] +name = "fastapi" +version = "0.115.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.115.0-py3-none-any.whl", hash = "sha256:17ea427674467486e997206a5ab25760f6b09e069f099b96f5b55a32fb6f1631"}, + {file = "fastapi-0.115.0.tar.gz", hash = "sha256:f93b4ca3529a8ebc6fc3fcf710e5efa8de3df9b41570958abf1d97d843138004"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.39.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fire" +version = "0.6.0" +description = "A library for automatically generating command line interfaces." +optional = false +python-versions = "*" +files = [ + {file = "fire-0.6.0.tar.gz", hash = "sha256:54ec5b996ecdd3c0309c800324a0703d6da512241bc73b553db959d98de0aa66"}, +] + +[package.dependencies] +six = "*" +termcolor = "*" + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "geojson" +version = "2.5.0" +description = "Python bindings and utilities for GeoJSON" +optional = false +python-versions = "*" +files = [ + {file = "geojson-2.5.0-py2.py3-none-any.whl", hash = "sha256:ccbd13368dd728f4e4f13ffe6aaf725b6e802c692ba0dde628be475040c534ba"}, + {file = "geojson-2.5.0.tar.gz", hash = "sha256:6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a"}, +] + +[[package]] +name = "greenlet" +version = "3.1.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.2" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "jiter" +version = "0.5.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "langchain" +version = "0.3.0" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain-0.3.0-py3-none-any.whl", hash = "sha256:59a75a6a1eb7bfd2a6bf0c7a5816409a8fdc9046187b07af287b23b9899617af"}, + {file = "langchain-0.3.0.tar.gz", hash = "sha256:a7c23892440bd1f5b9e029ff0dd709dd881ae927c4c0a3210ac64dba9bbf3f7f"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +langchain-core = ">=0.3.0,<0.4.0" +langchain-text-splitters = ">=0.3.0,<0.4.0" +langsmith = ">=0.1.17,<0.2.0" +numpy = [ + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1,<2", markers = "python_version < \"3.12\""}, +] +pydantic = ">=2.7.4,<3.0.0" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" + +[[package]] +name = "langchain-community" +version = "0.3.0" +description = "Community contributed LangChain integrations." +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_community-0.3.0-py3-none-any.whl", hash = "sha256:40084f1f785f0fb56c8698ff059bbda8bd8c683cbdffa7902a0e04e72961496c"}, + {file = "langchain_community-0.3.0.tar.gz", hash = "sha256:1ee8a469ad66977f21b9d96bdcdd8549c5281c474f0f9cc13b932efd63a78105"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain = ">=0.3.0,<0.4.0" +langchain-core = ">=0.3.0,<0.4.0" +langsmith = ">=0.1.112,<0.2.0" +numpy = [ + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1,<2", markers = "python_version < \"3.12\""}, +] +pydantic-settings = ">=2.4.0,<3.0.0" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" + +[[package]] +name = "langchain-core" +version = "0.3.5" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_core-0.3.5-py3-none-any.whl", hash = "sha256:2b5f86c1101beb013cb264c5722ad21931641493b4dc86e6f0575da698bf5cff"}, + {file = "langchain_core-0.3.5.tar.gz", hash = "sha256:67e5510559454f3f7a0526e7ef91fd0f12b45c0cdc70720e44909f62b5becf5a"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.125,<0.2.0" +packaging = ">=23.2,<25" +pydantic = [ + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, + {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, +] +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" +typing-extensions = ">=4.7" + +[[package]] +name = "langchain-text-splitters" +version = "0.3.0" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.9" +files = [ + {file = "langchain_text_splitters-0.3.0-py3-none-any.whl", hash = "sha256:e84243e45eaff16e5b776cd9c81b6d07c55c010ebcb1965deb3d1792b7358e83"}, + {file = "langchain_text_splitters-0.3.0.tar.gz", hash = "sha256:f9fe0b4d244db1d6de211e7343d4abc4aa90295aa22e1f0c89e51f33c55cd7ce"}, +] + +[package.dependencies] +langchain-core = ">=0.3.0,<0.4.0" + +[[package]] +name = "langsmith" +version = "0.1.127" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langsmith-0.1.127-py3-none-any.whl", hash = "sha256:b4e8058d16ee0c814b16fae135c1e8817d1f43a38462d7f55e0eb1f87b9526aa"}, + {file = "langsmith-0.1.127.tar.gz", hash = "sha256:19c6f95d5558180c600455781e6faacc7798d0e1c54d6eb50ffb744d56f02bc9"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<1" +orjson = ">=3.9.14,<4.0.0" +pydantic = [ + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, +] +requests = ">=2,<3" + +[[package]] +name = "marshmallow" +version = "3.22.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.22.0-py3-none-any.whl", hash = "sha256:71a2dce49ef901c3f97ed296ae5051135fd3febd2bf43afe0ae9a82143a494d9"}, + {file = "marshmallow-3.22.0.tar.gz", hash = "sha256:4972f529104a220bb8637d595aa4c9762afbe7f7a77d82dc58c1615d70c5823e"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.13)", "sphinx (==8.0.2)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "multidict" +version = "6.1.0" +description = "multidict implementation" +optional = false +python-versions = ">=3.8" +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "openai" +version = "1.47.1" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.47.1-py3-none-any.whl", hash = "sha256:34277583bf268bb2494bc03f48ac123788c5e2a914db1d5a23d5edc29d35c825"}, + {file = "openai-1.47.1.tar.gz", hash = "sha256:62c8f5f478f82ffafc93b33040f8bb16a45948306198bd0cba2da2ecd9cf7323"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.11,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "orjson" +version = "3.10.7" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, + {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, + {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, + {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, + {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, + {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, + {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, + {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, + {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, + {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, + {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, + {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, + {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, + {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, + {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, + {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, + {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, + {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, + {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, + {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "primp" +version = "0.6.3" +description = "HTTP client that can impersonate web browsers, mimicking their headers and `TLS/JA3/JA4/HTTP2` fingerprints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "primp-0.6.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bdbe6a7cdaaf5c9ed863432a941f4a75bd4c6ff626cbc8d32fc232793c70ba06"}, + {file = "primp-0.6.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:eeb53eb987bdcbcd85740633470255cab887d921df713ffa12a36a13366c9cdb"}, + {file = "primp-0.6.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78da53d3c92a8e3f05bd3286ac76c291f1b6fe5e08ea63b7ba92b0f9141800bb"}, + {file = "primp-0.6.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:86337b44deecdac752bd8112909987fc9fa9b894f30191c80a164dc8f895da53"}, + {file = "primp-0.6.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d3cd9a22b97f3eae42b2a5fb99f00480daf4cd6d9b139e05b0ffb03f7cc037f3"}, + {file = "primp-0.6.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7732bec917e2d3c48a31cdb92e1250f4ad6203a1aa4f802bd9abd84f2286a1e0"}, + {file = "primp-0.6.3-cp38-abi3-win_amd64.whl", hash = "sha256:1e4113c34b86c676ae321af185f03a372caef3ee009f1682c2d62e30ec87348c"}, + {file = "primp-0.6.3.tar.gz", hash = "sha256:17d30ebe26864defad5232dbbe1372e80483940012356e1f68846bb182282039"}, +] + +[package.extras] +dev = ["certifi", "pytest (>=8.1.1)"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "pydantic" +version = "2.9.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.23.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.5.2" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.5.2-py3-none-any.whl", hash = "sha256:2c912e55fd5794a59bf8c832b9de832dcfdf4778d79ff79b708744eed499a907"}, + {file = "pydantic_settings-2.5.2.tar.gz", hash = "sha256:f90b139682bee4d2065273d5185d71d37ea46cfe57e1b5ae184fc6a0b2484ca0"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pyowm" +version = "3.3.0" +description = "A Python wrapper around OpenWeatherMap web APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyowm-3.3.0-py3-none-any.whl", hash = "sha256:86463108e7613171531ba306040b43c972b3fc0b0acf73b12c50910cdd2107ab"}, + {file = "pyowm-3.3.0.tar.gz", hash = "sha256:8196f77c91eac680676ed5ee484aae8a165408055e3e2b28025cbf60b8681e03"}, +] + +[package.dependencies] +geojson = ">=2.3.0,<3" +PySocks = ">=1.7.1,<2" +requests = [ + {version = ">=2.20.0,<3"}, + {version = "*", extras = ["socks"]}, +] + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7", optional = true, markers = "extra == \"socks\""} +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.35" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "starlette" +version = "0.38.6" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.38.6-py3-none-any.whl", hash = "sha256:4517a1409e2e73ee4951214ba012052b9e16f60e90d73cfb06192c19203bbb05"}, + {file = "starlette-0.38.6.tar.gz", hash = "sha256:863a1588f5574e70a821dadefb41e4881ea451a47a3cd1b4df359d4ffefe5ead"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "tenacity" +version = "8.5.0" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "termcolor" +version = "2.4.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.8" +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tqdm" +version = "4.66.5" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "tweepy" +version = "4.14.0" +description = "Twitter library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tweepy-4.14.0-py3-none-any.whl", hash = "sha256:db6d3844ccc0c6d27f339f12ba8acc89912a961da513c1ae50fa2be502a56afb"}, + {file = "tweepy-4.14.0.tar.gz", hash = "sha256:1f9f1707d6972de6cff6c5fd90dfe6a449cd2e0d70bd40043ffab01e07a06c8c"}, +] + +[package.dependencies] +oauthlib = ">=3.2.0,<4" +requests = ">=2.27.0,<3" +requests-oauthlib = ">=1.2.0,<2" + +[package.extras] +async = ["aiohttp (>=3.7.3,<4)", "async-lru (>=1.0.3,<3)"] +dev = ["coverage (>=4.4.2)", "coveralls (>=2.1.0)", "tox (>=3.21.0)"] +docs = ["myst-parser (==0.15.2)", "readthedocs-sphinx-search (==0.1.1)", "sphinx (==4.2.0)", "sphinx-hoverxref (==0.7b1)", "sphinx-rtd-theme (==1.0.0)", "sphinx-tabs (==3.2.0)"] +socks = ["requests[socks] (>=2.27.0,<3)"] +test = ["vcrpy (>=1.10.3)"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.30.6" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.30.6-py3-none-any.whl", hash = "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"}, + {file = "uvicorn-0.30.6.tar.gz", hash = "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "wikipedia" +version = "1.4.0" +description = "Wikipedia API for Python" +optional = false +python-versions = "*" +files = [ + {file = "wikipedia-1.4.0.tar.gz", hash = "sha256:db0fad1829fdd441b1852306e9856398204dc0786d2996dd2e0c8bb8e26133b2"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +requests = ">=2.0.0,<3.0.0" + +[[package]] +name = "yarl" +version = "1.12.1" +description = "Yet another URL library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64c5b0f2b937fe40d0967516eee5504b23cb247b8b7ffeba7213a467d9646fdc"}, + {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e430ac432f969ef21770645743611c1618362309e3ad7cab45acd1ad1a540ff"}, + {file = "yarl-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e26e64f42bce5ddf9002092b2c37b13071c2e6413d5c05f9fa9de58ed2f7749"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0103c52f8dfe5d573c856322149ddcd6d28f51b4d4a3ee5c4b3c1b0a05c3d034"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b63465b53baeaf2122a337d4ab57d6bbdd09fcadceb17a974cfa8a0300ad9c67"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17d4dc4ff47893a06737b8788ed2ba2f5ac4e8bb40281c8603920f7d011d5bdd"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b54949267bd5704324397efe9fbb6aa306466dee067550964e994d309db5f1"}, + {file = "yarl-1.12.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10b690cd78cbaca2f96a7462f303fdd2b596d3978b49892e4b05a7567c591572"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c85ab016e96a975afbdb9d49ca90f3bca9920ef27c64300843fe91c3d59d8d20"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c1caa5763d1770216596e0a71b5567f27aac28c95992110212c108ec74589a48"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:595bbcdbfc4a9c6989d7489dca8510cba053ff46b16c84ffd95ac8e90711d419"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e64f0421892a207d3780903085c1b04efeb53b16803b23d947de5a7261b71355"}, + {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:319c206e83e46ec2421b25b300c8482b6fe8a018baca246be308c736d9dab267"}, + {file = "yarl-1.12.1-cp310-cp310-win32.whl", hash = "sha256:da045bd1147d12bd43fb032296640a7cc17a7f2eaba67495988362e99db24fd2"}, + {file = "yarl-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:aebbd47df77190ada603157f0b3670d578c110c31746ecc5875c394fdcc59a99"}, + {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:28389a68981676bf74e2e199fe42f35d1aa27a9c98e3a03e6f58d2d3d054afe1"}, + {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f736f54565f8dd7e3ab664fef2bc461d7593a389a7f28d4904af8d55a91bd55f"}, + {file = "yarl-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dee0496d5f1a8f57f0f28a16f81a2033fc057a2cf9cd710742d11828f8c80e2"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8981a94a27ac520a398302afb74ae2c0be1c3d2d215c75c582186a006c9e7b0"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff54340fc1129e8e181827e2234af3ff659b4f17d9bbe77f43bc19e6577fadec"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54c8cee662b5f8c30ad7eedfc26123f845f007798e4ff1001d9528fe959fd23c"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e97a29b37830ba1262d8dfd48ddb5b28ad4d3ebecc5d93a9c7591d98641ec737"}, + {file = "yarl-1.12.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c89894cc6f6ddd993813e79244b36b215c14f65f9e4f1660b1f2ba9e5594b95"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:712ba8722c0699daf186de089ddc4677651eb9875ed7447b2ad50697522cbdd9"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6e9a9f50892153bad5046c2a6df153224aa6f0573a5a8ab44fc54a1e886f6e21"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1d4017e78fb22bc797c089b746230ad78ecd3cdb215bc0bd61cb72b5867da57e"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f494c01b28645c431239863cb17af8b8d15b93b0d697a0320d5dd34cd9d7c2fa"}, + {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de4544b1fb29cf14870c4e2b8a897c0242449f5dcebd3e0366aa0aa3cf58a23a"}, + {file = "yarl-1.12.1-cp311-cp311-win32.whl", hash = "sha256:7564525a4673fde53dee7d4c307a961c0951918f0b8c7f09b2c9e02067cf6504"}, + {file = "yarl-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:f23bb1a7a6e8e8b612a164fdd08e683bcc16c76f928d6dbb7bdbee2374fbfee6"}, + {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3e2aff8b822ab0e0bdbed9f50494b3a35629c4b9488ae391659973a37a9f53f"}, + {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22dda2799c8d39041d731e02bf7690f0ef34f1691d9ac9dfcb98dd1e94c8b058"}, + {file = "yarl-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18c2a7757561f05439c243f517dbbb174cadfae3a72dee4ae7c693f5b336570f"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:835010cc17d0020e7931d39e487d72c8e01c98e669b6896a8b8c9aa8ca69a949"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2254fe137c4a360b0a13173a56444f756252c9283ba4d267ca8e9081cd140ea"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a071d2c3d39b4104f94fc08ab349e9b19b951ad4b8e3b6d7ea92d6ef7ccaf8"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73a183042ae0918c82ce2df38c3db2409b0eeae88e3afdfc80fb67471a95b33b"}, + {file = "yarl-1.12.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326b8a079a9afcac0575971e56dabdf7abb2ea89a893e6949b77adfeb058b50e"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:126309c0f52a2219b3d1048aca00766429a1346596b186d51d9fa5d2070b7b13"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ba1c779b45a399cc25f511c681016626f69e51e45b9d350d7581998722825af9"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:af1107299cef049ad00a93df4809517be432283a0847bcae48343ebe5ea340dc"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:20d817c0893191b2ab0ba30b45b77761e8dfec30a029b7c7063055ca71157f84"}, + {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d4f818f6371970d6a5d1e42878389bbfb69dcde631e4bbac5ec1cb11158565ca"}, + {file = "yarl-1.12.1-cp312-cp312-win32.whl", hash = "sha256:0ac33d22b2604b020569a82d5f8a03ba637ba42cc1adf31f616af70baf81710b"}, + {file = "yarl-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd24996e12e1ba7c397c44be75ca299da14cde34d74bc5508cce233676cc68d0"}, + {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dea360778e0668a7ad25d7727d03364de8a45bfd5d808f81253516b9f2217765"}, + {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1f50a37aeeb5179d293465e522fd686080928c4d89e0ff215e1f963405ec4def"}, + {file = "yarl-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0274b1b7a9c9c32b7bf250583e673ff99fb9fccb389215841e2652d9982de740"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4f3ab9eb8ab2d585ece959c48d234f7b39ac0ca1954a34d8b8e58a52064bdb3"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d31dd0245d88cf7239e96e8f2a99f815b06e458a5854150f8e6f0e61618d41b"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a96198d5d26f40557d986c1253bfe0e02d18c9d9b93cf389daf1a3c9f7c755fa"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddae504cfb556fe220efae65e35be63cd11e3c314b202723fc2119ce19f0ca2e"}, + {file = "yarl-1.12.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bce00f3b1f7f644faae89677ca68645ed5365f1c7f874fdd5ebf730a69640d38"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eee5ff934b0c9f4537ff9596169d56cab1890918004791a7a06b879b3ba2a7ef"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4ea99e64b2ad2635e0f0597b63f5ea6c374791ff2fa81cdd4bad8ed9f047f56f"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c667b383529520b8dd6bd496fc318678320cb2a6062fdfe6d3618da6b8790f6"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d920401941cb898ef089422e889759dd403309eb370d0e54f1bdf6ca07fef603"}, + {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:501a1576716032cc6d48c7c47bcdc42d682273415a8f2908e7e72cb4625801f3"}, + {file = "yarl-1.12.1-cp313-cp313-win32.whl", hash = "sha256:24416bb5e221e29ddf8aac5b97e94e635ca2c5be44a1617ad6fe32556df44294"}, + {file = "yarl-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:71af3766bb46738d12cc288d9b8de7ef6f79c31fd62757e2b8a505fe3680b27f"}, + {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c924deab8105f86980983eced740433fb7554a7f66db73991affa4eda99d5402"}, + {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5fb475a4cdde582c9528bb412b98f899680492daaba318231e96f1a0a1bb0d53"}, + {file = "yarl-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:36ee0115b9edca904153a66bb74a9ff1ce38caff015de94eadfb9ba8e6ecd317"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2631c9d7386bd2d4ce24ecc6ebf9ae90b3efd713d588d90504eaa77fec4dba01"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2376d8cf506dffd0e5f2391025ae8675b09711016656590cb03b55894161fcfa"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24197ba3114cc85ddd4091e19b2ddc62650f2e4a899e51b074dfd52d56cf8c72"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfdf419bf5d3644f94cd7052954fc233522f5a1b371fc0b00219ebd9c14d5798"}, + {file = "yarl-1.12.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8112f640a4f7e7bf59f7cabf0d47a29b8977528c521d73a64d5cc9e99e48a174"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:607d12f0901f6419a8adceb139847c42c83864b85371f58270e42753f9780fa6"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:664380c7ed524a280b6a2d5d9126389c3e96cd6e88986cdb42ca72baa27421d6"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d0a5e87bc48d76dfcfc16295201e9812d5f33d55b4a0b7cad1025b92bf8b91b"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:eff6bac402719c14e17efe845d6b98593c56c843aca6def72080fbede755fd1f"}, + {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:22839d1d1eab9e4b427828a88a22beb86f67c14d8ff81175505f1cc8493f3500"}, + {file = "yarl-1.12.1-cp38-cp38-win32.whl", hash = "sha256:717f185086bb9d817d4537dd18d5df5d657598cd00e6fc22e4d54d84de266c1d"}, + {file = "yarl-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:71978ba778948760cff528235c951ea0ef7a4f9c84ac5a49975f8540f76c3f73"}, + {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ffc046ebddccb3c4cac72c1a3e1bc343492336f3ca86d24672e90ccc5e788a"}, + {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10954b233d4df5cc3137ffa5ced97f8894152df817e5d149bf05a0ef2ab8134"}, + {file = "yarl-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2e912b282466444023610e4498e3795c10e7cfd641744524876239fcf01d538d"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af871f70cfd5b528bd322c65793b5fd5659858cdfaa35fbe563fb99b667ed1f"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3e4e1f7b08d1ec6b685ccd3e2d762219c550164fbf524498532e39f9413436e"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a7ee79183f0b17dcede8b6723e7da2ded529cf159a878214be9a5d3098f5b1e"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96c8ff1e1dd680e38af0887927cab407a4e51d84a5f02ae3d6eb87233036c763"}, + {file = "yarl-1.12.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e9905fc2dc1319e4c39837b906a024cf71b1261cc66b0cd89678f779c0c61f5"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:01549468858b87d36f967c97d02e6e54106f444aeb947ed76f8f71f85ed07cec"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96b34830bd6825ca0220bf005ea99ac83eb9ce51301ddb882dcf613ae6cd95fb"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2aee7594d2c2221c717a8e394bbed4740029df4c0211ceb0f04815686e99c795"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:15871130439ad10abb25a4631120d60391aa762b85fcab971411e556247210a0"}, + {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:838dde2cb570cfbb4cab8a876a0974e8b90973ea40b3ac27a79b8a74c8a2db15"}, + {file = "yarl-1.12.1-cp39-cp39-win32.whl", hash = "sha256:eacbcf30efaca7dc5cb264228ffecdb95fdb1e715b1ec937c0ce6b734161e0c8"}, + {file = "yarl-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:76a59d1b63de859398bc7764c860a769499511463c1232155061fe0147f13e01"}, + {file = "yarl-1.12.1-py3-none-any.whl", hash = "sha256:dc3192a81ecd5ff954cecd690327badd5a84d00b877e1573f7c9097ce13e5bfb"}, + {file = "yarl-1.12.1.tar.gz", hash = "sha256:5b860055199aec8d6fe4dcee3c5196ce506ca198a50aab0059ffd26e8e815828"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "b95dc395968a39b158126bb9075994b854a809e348cfb3ace44b2244e59a7c4b" diff --git a/integrations-service/pyproject.toml b/integrations-service/pyproject.toml new file mode 100644 index 000000000..cb3d19290 --- /dev/null +++ b/integrations-service/pyproject.toml @@ -0,0 +1,36 @@ +[tool.poetry] +name = "integrations" +version = "0.1.0" +description = "Integration service for various AI tools" +authors = ["Your Name "] + +[tool.poetry.dependencies] +python = "^3.11" +langchain-community = "^0.3.0" +fastapi = "^0.115.0" +uvicorn = "^0.30.6" +langchain = "^0.3.0" +pydantic = "^2.9.2" +duckduckgo-search = "^6.2.13" +openai = "^1.47.1" +tweepy = "^4.14.0" +wikipedia = "^1.4.0" +fire = "^0.6.0" +pyowm = "^3.3.0" + +[tool.poe.tasks] +format = "ruff format" +lint = "ruff check --select I --fix --unsafe-fixes agents_api/**/*.py migrations/**/*.py tests/**/*.py" +typecheck = "pytype --config pytype.toml" +check = [ + "lint", + "format", + "typecheck", +] + +[tool.poetry.dev-dependencies] +pytest = "^6.2.5" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/integrations-service/pytype.toml b/integrations-service/pytype.toml new file mode 100644 index 000000000..2371cea58 --- /dev/null +++ b/integrations-service/pytype.toml @@ -0,0 +1,64 @@ +# NOTE: All relative paths are relative to the location of this file. + +[tool.pytype] + +# Space-separated list of files or directories to exclude. +exclude = [ +] + +# Space-separated list of files or directories to process. +inputs = [ + '.', +] + +# Keep going past errors to analyze as many files as possible. +keep_going = true + +# Run N jobs in parallel. When 'auto' is used, this will be equivalent to the +# number of CPUs on the host system. +jobs = 'auto' + +# All pytype output goes here. +output = '.pytype' + +# Platform (e.g., "linux", "win32") that the target code runs on. +platform = 'linux' + +# Paths to source code directories, separated by ':'. +pythonpath = '.' + +# Python version (major.minor) of the target code. +python_version = '3.11' + +# Don't allow None to match bool. This flag is temporary and will be removed +# once this behavior is enabled by default. +none_is_not_bool = true + +# Variables initialized as None retain their None binding. This flag is +# temporary and will be removed once this behavior is enabled by default. +strict_none_binding = true + +# Space-separated list of error names to ignore. +disable = [ + 'pyi-error', +] + +# -------------- +# Optional flags +# -------------- + +# Bind 'self' in methods with non-transparent decorators. This flag is temporary +# and will be removed once this behavior is enabled by default. +bind_decorated_methods = false + +# Enable parameter count checks for overriding methods with renamed arguments. +# This flag is temporary and will be removed once this behavior is enabled by +# default. +overriding_renamed_parameter_count_checks = false + +# Opt-in: Do not allow Any as a return type. +no_return_any = false + +# Opt-in: Require decoration with @typing.override when overriding a method or +# nested class attribute of a parent class. +require_override_decorator = false \ No newline at end of file From 236a56454f68ada8c2a633824cf34efeb6bea9f3 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Wed, 25 Sep 2024 16:58:33 -0400 Subject: [PATCH 005/113] feat(agents-api,integrations): Working integrations for tool-call step (#521) - **fix(typespec,agents-api): Rename integration providers** - **feat(agents-api,integrations): Working integrations for tool-call step** ---- > [!IMPORTANT] > Add integration service handling for tool-call steps in agents API, including provider renames and workflow updates. > > - **Integrations**: > - Implement `run_integration_service` in `clients/integrations.py` to handle integration service calls. > - Update `execute_integration` in `activities/execute_integration.py` to use `run_integration_service` for non-dummy providers. > - Add `INTEGRATION_SERVICE_URL` to `.env.example`, `env.py`, and `docker-compose.yml`. > - **Renames**: > - Rename integration providers in `Tools.py` and `scalars.tsp` (e.g., `dall-e` to `dalle_image_generator`). > - **Workflows**: > - Update `task_execution/__init__.py` to handle integration tool calls using `execute_integration`. > - **Tests**: > - Add `integration_example.yaml` for sample tasks. > - Add tests for integration tool calls in `test_execution_workflow.py`. > - Add `patch_integration_service` in `utils.py` for mocking integration service calls. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for f13f8dd6159226d902fff49ad1223fa6f9c49cee. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- .env.example | 1 + .../activities/execute_integration.py | 25 ++++---- agents-api/agents_api/autogen/Tools.py | 18 ++---- agents-api/agents_api/clients/integrations.py | 31 +++++++++ agents-api/agents_api/env.py | 7 ++ .../workflows/task_execution/__init__.py | 14 +++- agents-api/docker-compose.yml | 1 + ...727235852_add_forward_tool_calls_option.py | 2 +- .../sample_tasks/integration_example.yaml | 44 +++++++++++++ agents-api/tests/test_execution_workflow.py | 64 ++++++++++++++++++- agents-api/tests/utils.py | 10 +++ typespec/common/scalars.tsp | 12 ++-- 12 files changed, 192 insertions(+), 37 deletions(-) create mode 100644 agents-api/agents_api/clients/integrations.py create mode 100644 agents-api/tests/sample_tasks/integration_example.yaml diff --git a/.env.example b/.env.example index ed8089ed7..662e53e11 100644 --- a/.env.example +++ b/.env.example @@ -36,6 +36,7 @@ LITELLM_REDIS_PASSWORD= # AGENTS_API_DEBUG=false # EMBEDDING_MODEL_ID=Alibaba-NLP/gte-large-en-v1.5 # NUM_GPUS=1 +# INTEGRATION_SERVICE_URL=http://integrations:8000 # Temporal # -------- diff --git a/agents-api/agents_api/activities/execute_integration.py b/agents-api/agents_api/activities/execute_integration.py index 9183eca2b..ad1d3b59d 100644 --- a/agents-api/agents_api/activities/execute_integration.py +++ b/agents-api/agents_api/activities/execute_integration.py @@ -4,6 +4,7 @@ from temporalio import activity from ..autogen.openapi_model import IntegrationDef +from ..clients import integrations from ..common.protocol.tasks import StepContext from ..env import testing from ..models.tools import get_tool_args_from_metadata @@ -24,16 +25,21 @@ async def execute_integration( developer_id=developer_id, agent_id=agent_id, task_id=task_id ) - arguments = merged_tool_args.get(tool_name, {}) | arguments + arguments = ( + merged_tool_args.get(tool_name, {}) | (integration.arguments or {}) | arguments + ) try: if integration.provider == "dummy": return arguments - else: - raise NotImplementedError( - f"Unknown integration provider: {integration.provider}" - ) + return await integrations.run_integration_service( + provider=integration.provider, + setup=integration.setup, + method=integration.method, + arguments=arguments, + ) + except BaseException as e: if activity.in_activity(): activity.logger.error(f"Error in execute_integration: {e}") @@ -41,14 +47,7 @@ async def execute_integration( raise -async def mock_execute_integration( - context: StepContext, - tool_name: str, - integration: IntegrationDef, - arguments: dict[str, Any], -) -> Any: - return arguments - +mock_execute_integration = execute_integration execute_integration = activity.defn(name="execute_integration")( execute_integration if not testing else mock_execute_integration diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index 7b7f38214..c5a100cca 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -91,14 +91,11 @@ class IntegrationDef(BaseModel): ) provider: Literal[ "dummy", - "dall-e", - "duckduckgo", - "hackernews", + "dalle_image_generator", + "duckduckgo_search", + "hacker_news", "weather", "wikipedia", - "twitter", - "webpage", - "requests", ] """ The provider of the integration @@ -132,14 +129,11 @@ class IntegrationDefUpdate(BaseModel): provider: ( Literal[ "dummy", - "dall-e", - "duckduckgo", - "hackernews", + "dalle_image_generator", + "duckduckgo_search", + "hacker_news", "weather", "wikipedia", - "twitter", - "webpage", - "requests", ] | None ) = None diff --git a/agents-api/agents_api/clients/integrations.py b/agents-api/agents_api/clients/integrations.py new file mode 100644 index 000000000..489db1f54 --- /dev/null +++ b/agents-api/agents_api/clients/integrations.py @@ -0,0 +1,31 @@ +from typing import Any, List + +from beartype import beartype +from httpx import AsyncClient + +from ..env import integration_service_url + +__all__: List[str] = ["run_integration_service"] + + +@beartype +async def run_integration_service( + *, + provider: str, + arguments: dict, + setup: dict | None = None, + method: str | None = None, +) -> Any: + slug = f"{provider}/{method}" if method else provider + url = f"{integration_service_url}/execute/{slug}" + + setup = setup or {} + + async with AsyncClient() as client: + response = await client.post( + url, + json={"arguments": arguments, "setup": setup}, + ) + response.raise_for_status() + + return response.json() diff --git a/agents-api/agents_api/env.py b/agents-api/agents_api/env.py index daee79172..42b2ce8d2 100644 --- a/agents-api/agents_api/env.py +++ b/agents-api/agents_api/env.py @@ -68,6 +68,13 @@ embedding_dimensions: int = env.int("EMBEDDING_DIMENSIONS", default=1024) +# Integration service +# ------------------- +integration_service_url: str = env.str( + "INTEGRATION_SERVICE_URL", default="http://0.0.0.0:8000" +) + + # Temporal # -------- temporal_worker_url: str = env.str("TEMPORAL_WORKER_URL", default="localhost:7233") diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index 3c8197e29..aab0979a8 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -20,6 +20,7 @@ ForeachStep, GetStep, IfElseWorkflowStep, + IntegrationDef, LogStep, MapReduceStep, ParallelStep, @@ -60,7 +61,7 @@ # WorkflowStep = ( # EvaluateStep # ✅ -# | ToolCallStep # ❌ <--- high priority +# | ToolCallStep # ✅ # | PromptStep # 🟡 <--- high priority # | GetStep # ✅ # | SetStep # ✅ @@ -482,13 +483,20 @@ async def run( call = tool_call["integration"] tool_name = call["name"] arguments = call["arguments"] - integration = next( + integration_spec = next( (t for t in context.tools if t.name == tool_name), None ) - if integration is None: + if integration_spec is None: raise ApplicationError(f"Integration {tool_name} not found") + integration = IntegrationDef( + provider=integration_spec.spec["provider"], + setup=integration_spec.spec["setup"], + method=integration_spec.spec["method"], + arguments=arguments, + ) + tool_call_response = await workflow.execute_activity( execute_integration, args=[context, tool_name, integration, arguments], diff --git a/agents-api/docker-compose.yml b/agents-api/docker-compose.yml index 0770ded61..cc2f2b262 100644 --- a/agents-api/docker-compose.yml +++ b/agents-api/docker-compose.yml @@ -12,6 +12,7 @@ x--shared-environment: &shared-environment COZO_HOST: ${COZO_HOST:-http://memory-store:9070} DEBUG: ${AGENTS_API_DEBUG:-False} EMBEDDING_MODEL_ID: ${EMBEDDING_MODEL_ID:-Alibaba-NLP/gte-large-en-v1.5} + INTEGRATION_SERVICE_URL: ${INTEGRATION_SERVICE_URL:-http://integrations:8000} LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} LITELLM_URL: ${LITELLM_URL:-http://litellm:4000} SUMMARIZATION_MODEL_NAME: ${SUMMARIZATION_MODEL_NAME:-gpt-4-turbo} diff --git a/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py b/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py index ad1aab998..aa1b8441a 100644 --- a/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py +++ b/agents-api/migrations/migrate_1727235852_add_forward_tool_calls_option.py @@ -1,4 +1,4 @@ -#/usr/bin/env python3 +# /usr/bin/env python3 MIGRATION_ID = "add_forward_tool_calls_option" CREATED_AT = 1727235852.744035 diff --git a/agents-api/tests/sample_tasks/integration_example.yaml b/agents-api/tests/sample_tasks/integration_example.yaml new file mode 100644 index 000000000..4efacff79 --- /dev/null +++ b/agents-api/tests/sample_tasks/integration_example.yaml @@ -0,0 +1,44 @@ +name: Simple multi step task + +input_schema: + type: object + properties: + topics: + type: array + items: + type: string + +tools: + - type: function + function: + name: generate_questions + description: Generate a list of questions for a given topic + parameters: + type: object + properties: + topic: + type: string + description: The topic to generate questions for + + - type: integration + name: duckduckgo_search + integration: + provider: duckduckgo + setup: + api_key: + arguments: + language: en-US + +main: + - foreach: + in: _["topics"] + do: + prompt: + - role: system + content: |- + Generate a list of 10 questions for the topic {{_}} as valid yaml. + unwrap: true + + - tool: duckduckgo_search + arguments: + query: "'\n'.join(_)" diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index cddc65666..3ff1c989e 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -16,7 +16,7 @@ from agents_api.routers.tasks.create_task_execution import start_execution from .fixtures import cozo_client, test_agent, test_developer_id -from .utils import patch_testing_temporal +from .utils import patch_integration_service, patch_testing_temporal EMBEDDING_SIZE: int = 1024 @@ -441,7 +441,7 @@ async def _( assert result["hello"] == data.input["test"] -@test("workflow: tool call integration type step") +@test("workflow: tool call integration dummy") async def _( client=cozo_client, developer_id=test_developer_id, @@ -494,6 +494,65 @@ async def _( assert result["test"] == data.input["test"] +@test("workflow: tool call integration mocked weather") +async def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, +): + data = CreateExecutionRequest(input={"test": "input"}) + + task = create_task( + developer_id=developer_id, + agent_id=agent.id, + data=CreateTaskRequest( + **{ + "name": "test task", + "description": "test task about", + "input_schema": {"type": "object", "additionalProperties": True}, + "tools": [ + { + "type": "integration", + "name": "get_weather", + "integration": { + "provider": "weather", + "setup": {"openweathermap_api_key": "test"}, + "arguments": {"test": "fake"}, + }, + } + ], + "main": [ + { + "tool": "get_weather", + "arguments": {"location": "_.test"}, + }, + ], + } + ), + client=client, + ) + + expected_output = {"temperature": 20, "humidity": 60} + + async with patch_testing_temporal() as (_, mock_run_task_execution_workflow): + with patch_integration_service(expected_output) as mock_integration_service: + execution, handle = await start_execution( + developer_id=developer_id, + task_id=task.id, + data=data, + client=client, + ) + + assert handle is not None + assert execution.task_id == task.id + assert execution.input == data.input + mock_run_task_execution_workflow.assert_called_once() + mock_integration_service.assert_called_once() + + result = await handle.result() + assert result == expected_output + + # FIXME: This test is not working. It gets stuck # @test("workflow: wait for input step start") async def _( @@ -1026,3 +1085,4 @@ async def _( mock_run_task_execution_workflow.assert_called_once() await handle.result() + diff --git a/agents-api/tests/utils.py b/agents-api/tests/utils.py index e54dabe17..3f0f1f94a 100644 --- a/agents-api/tests/utils.py +++ b/agents-api/tests/utils.py @@ -91,3 +91,13 @@ def patch_embed_acompletion(output={"role": "assistant", "content": "Hello, worl acompletion.return_value = mock_model_response yield embed, acompletion + + +@contextmanager +def patch_integration_service(output: dict = {"result": "ok"}): + with patch( + "agents_api.clients.integrations.run_integration_service" + ) as run_integration_service: + run_integration_service.return_value = output + + yield run_integration_service diff --git a/typespec/common/scalars.tsp b/typespec/common/scalars.tsp index 97fe37706..0bb735586 100644 --- a/typespec/common/scalars.tsp +++ b/typespec/common/scalars.tsp @@ -57,12 +57,12 @@ scalar JinjaTemplate extends string; /** Integration provider name */ alias integrationProvider = ( | "dummy" - | "dall-e" - | "duckduckgo" - | "hackernews" + | "dalle_image_generator" + | "duckduckgo_search" + | "hacker_news" | "weather" | "wikipedia" - | "twitter" - | "webpage" - | "requests" + // | "twitter" + // | "webpage" + // | "requests" ); From e7532ff9a3c629408df3d1312943c4056c04614c Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Thu, 26 Sep 2024 17:16:44 +0300 Subject: [PATCH 006/113] fix(agents-api): Fix wait for input step (#522) > [!IMPORTANT] > Removes unnecessary transition call in `WaitForInputStep` case in `TaskExecutionWorkflow.run()` and updates tests accordingly. > > - **Behavior**: > - Removes `await transition(context, type="wait", output=output)` from `WaitForInputStep` case in `run()` in `__init__.py`. > - **Tests**: > - Updates `test_execution_workflow.py` to ensure workflow behaves correctly without the removed transition call. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 6600cee7ef0ea8b27e2026e2ea8d6402fe996a26. It will automatically update as commits are pushed. --- agents-api/agents_api/workflows/task_execution/__init__.py | 2 -- agents-api/tests/test_execution_workflow.py | 1 - 2 files changed, 3 deletions(-) diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index aab0979a8..2ca7e6ade 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -381,8 +381,6 @@ async def run( case WaitForInputStep(), StepOutcome(output=output): workflow.logger.info("Wait for input step: Waiting for external input") - await transition(context, type="wait", output=output) - result = await workflow.execute_activity( task_steps.raise_complete_async, args=[context, output], diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index 3ff1c989e..b6394f1bc 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -1085,4 +1085,3 @@ async def _( mock_run_task_execution_workflow.assert_called_once() await handle.result() - From ca8e5949c3ddde7ce2a9fabb53a7bbec1832246f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sat, 28 Sep 2024 11:35:08 -0400 Subject: [PATCH 007/113] feat(agents-api): Add support for reading setup args from metadata and Upgrade to python 3.12 (#525) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Upgrade to Python 3.12 and add support for reading setup arguments from metadata in `agents-api`. > > - **Python Version Upgrade**: > - Upgrade Python to 3.12 in `.tool-versions`, `Dockerfile`, `Dockerfile.worker`, `pyproject.toml`, and `pytype.toml`. > - **Setup Arguments from Metadata**: > - `execute_integration()` in `execute_integration.py` now reads setup arguments from metadata. > - `get_tool_args_from_metadata()` in `get_tool_args_from_metadata.py` updated to handle `arg_type` for "args" and "setup". > - **CI and Documentation**: > - Delete `generate-docs.yml` workflow. > - Update `lint-and-format.yml` to focus on `agents-api` and use Python 3.12. > - Update `pytype` version in `pyproject.toml`. > - Change `x-tool-parameters` to `x-integration-args` in `julep-concepts.md`. > - Adjust backup schedule in `docker-compose.yml` from 1h to 3h. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for b1c0615c9138c76a1d44dba60444d2d2bdd5c553. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- .github/workflows/generate-docs.yml | 97 --- .github/workflows/lint-and-format.yml | 76 +-- agents-api/.tool-versions | 2 +- agents-api/Dockerfile | 2 +- agents-api/Dockerfile.worker | 2 +- .../activities/execute_integration.py | 11 +- .../tools/get_tool_args_from_metadata.py | 60 +- agents-api/poetry.lock | 570 +++++++++--------- agents-api/pyproject.toml | 4 +- agents-api/pytype.toml | 4 +- docs/julep-concepts.md | 10 +- memory-store/docker-compose.yml | 2 +- 12 files changed, 371 insertions(+), 469 deletions(-) delete mode 100644 .github/workflows/generate-docs.yml diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml deleted file mode 100644 index 9c6952e6e..000000000 --- a/.github/workflows/generate-docs.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: Generate docs on merge to dev -run-name: ${{ github.actor }} is generating documentation - -# TODO: This is currently not working. Need to fix it -on: - push: - branches: - - "dev" - - "main" - -jobs: - Generate-Docs-For-TS-SDK: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - - name: Cache npm dependencies - uses: actions/cache@v4 - with: - path: sdks/ts/node_modules - key: ${{ runner.os }}-sdks-ts-npm-${{ hashFiles('sdks/ts/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-sdks-ts-npm- - - - name: Install npm dependencies - run: | - cd sdks/ts - npm ci - - - name: Generate docs - run: | - cd sdks/ts - npm run generate-docs - - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: "doc(sdks/ts): Generate docs for sdks/ts (CI)" - branch: ${{ github.head_ref }} - - Generate-Docs-For-Python-SDK: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: Install and configure Poetry - uses: snok/install-poetry@v1 - - - name: Configure Poetry to use .venv - run: | - cd sdks/python - poetry config virtualenvs.in-project true - - - name: Cache Poetry virtualenv - uses: actions/cache@v4 - with: - path: sdks/python/.venv - key: ${{ runner.os }}-sdks-python-poetry-${{ hashFiles('sdks/python/poetry.lock') }} - restore-keys: | - ${{ runner.os }}-sdks-python-poetry- - - - name: Cache pytype - uses: actions/cache@v4 - with: - path: sdks/python/.pytype - key: ${{ runner.os }}-sdks-python-pytype-${{ hashFiles('sdks/python/**/*.py') }} - restore-keys: | - ${{ runner.os }}-sdks-python-pytype- - - - name: Install dependencies - run: | - cd sdks/python - poetry install - - - name: Generate docs - run: | - cd sdks/python - poetry run poe doc - - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: "doc(sdks/python): Generate docs for sdks/python (CI)" - branch: ${{ github.head_ref }} - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true diff --git a/.github/workflows/lint-and-format.yml b/.github/workflows/lint-and-format.yml index 27cfa2d9e..65e4983c4 100644 --- a/.github/workflows/lint-and-format.yml +++ b/.github/workflows/lint-and-format.yml @@ -1,4 +1,4 @@ -name: Lint and typecheck APIs and SDKs +name: Lint and typecheck agents-api run-name: ${{ github.actor }} is linting and typechecking the code # TODO: Fix CI github actions @@ -10,99 +10,61 @@ jobs: Lint-And-Format: runs-on: ubuntu-latest - strategy: - matrix: - directory: [agents-api, sdks/python] - steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - name: Install and configure Poetry uses: snok/install-poetry@v1 - name: Configure Poetry to use .venv run: | - cd ${{ matrix.directory }} + cd agents-api poetry config virtualenvs.in-project true - name: Cache Poetry virtualenv uses: actions/cache@v4 with: - path: ${{ matrix.directory }}/.venv - key: ${{ runner.os }}-${{ matrix.directory }}-poetry-${{ hashFiles(format('{0}/poetry.lock', matrix.directory)) }} + path: agents-api/.venv + key: ${{ runner.os }}-agents-api-poetry-${{ hashFiles('agents-api/poetry.lock') }} restore-keys: | - ${{ runner.os }}-${{ matrix.directory }}-poetry- + ${{ runner.os }}-agents-api-poetry- - name: Cache pytype uses: actions/cache@v4 with: - path: ${{ matrix.directory }}/.pytype - key: ${{ runner.os }}-${{ matrix.directory }}-pytype-${{ hashFiles(format('{0}/**/*.py', matrix.directory)) }} + path: agents-api/.pytype + key: ${{ runner.os }}-agents-api-pytype-${{ hashFiles('agents-api/**/*.py') }} restore-keys: | - ${{ runner.os }}-${{ matrix.directory }}-pytype- + ${{ runner.os }}-agents-api-pytype- - name: Install dependencies run: | - cd ${{ matrix.directory }} + cd agents-api poetry install - - name: Lint and format - run: | - cd ${{ matrix.directory }} - poetry run poe format - poetry run poe lint - - name: Typecheck run: | - cd ${{ matrix.directory }} + cd agents-api poetry run poe typecheck - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: "refactor: Lint ${{ matrix.directory }} (CI)" - branch: ${{ github.head_ref }} - - Lint-And-Format-TS-SDK: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - - name: Cache npm dependencies - uses: actions/cache@v4 - with: - path: sdks/ts/node_modules - key: ${{ runner.os }}-sdks-ts-npm-${{ hashFiles('sdks/ts/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-sdks-ts-npm- - - - name: Install npm dependencies - run: | - cd sdks/ts - npm ci - - - name: Lint and format TypeScript SDK + - name: Lint and format run: | - cd sdks/ts - npm run format + cd agents-api + poetry run poe format + poetry run poe lint - - name: Build TypeScript SDK + - name: Run tests run: | - cd sdks/ts - npm run build + cd agents-api + poetry run poe test - uses: stefanzweifel/git-auto-commit-action@v4 with: - commit_message: "refactor: Lint sdks/ts (CI)" + commit_message: "refactor: Lint agents-api (CI)" branch: ${{ github.head_ref }} concurrency: diff --git a/agents-api/.tool-versions b/agents-api/.tool-versions index 8aa451a5c..269a4eb43 100644 --- a/agents-api/.tool-versions +++ b/agents-api/.tool-versions @@ -1 +1 @@ -python 3.11.9 +python 3.12.5 diff --git a/agents-api/Dockerfile b/agents-api/Dockerfile index de5111250..3081d91fa 100644 --- a/agents-api/Dockerfile +++ b/agents-api/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED True ENV POETRY_CACHE_DIR=/tmp/poetry_cache diff --git a/agents-api/Dockerfile.worker b/agents-api/Dockerfile.worker index fd3af39fd..e60eec941 100644 --- a/agents-api/Dockerfile.worker +++ b/agents-api/Dockerfile.worker @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.12-slim ENV PYTHONUNBUFFERED True ENV POETRY_CACHE_DIR=/tmp/poetry_cache diff --git a/agents-api/agents_api/activities/execute_integration.py b/agents-api/agents_api/activities/execute_integration.py index ad1d3b59d..964ad6e12 100644 --- a/agents-api/agents_api/activities/execute_integration.py +++ b/agents-api/agents_api/activities/execute_integration.py @@ -16,26 +16,33 @@ async def execute_integration( tool_name: str, integration: IntegrationDef, arguments: dict[str, Any], + setup: dict[str, Any] = {}, ) -> Any: developer_id = context.execution_input.developer_id agent_id = context.execution_input.agent.id task_id = context.execution_input.task.id merged_tool_args = get_tool_args_from_metadata( - developer_id=developer_id, agent_id=agent_id, task_id=task_id + developer_id=developer_id, agent_id=agent_id, task_id=task_id, arg_type="args" + ) + + merged_tool_setup = get_tool_args_from_metadata( + developer_id=developer_id, agent_id=agent_id, task_id=task_id, arg_type="setup" ) arguments = ( merged_tool_args.get(tool_name, {}) | (integration.arguments or {}) | arguments ) + setup = merged_tool_setup.get(tool_name, {}) | (integration.setup or {}) | setup + try: if integration.provider == "dummy": return arguments return await integrations.run_integration_service( provider=integration.provider, - setup=integration.setup, + setup=setup, method=integration.method, arguments=arguments, ) diff --git a/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py b/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py index 08882ae6f..ade296a29 100644 --- a/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py +++ b/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py @@ -1,3 +1,4 @@ +from typing import Literal from uuid import UUID from beartype import beartype @@ -20,29 +21,31 @@ def tool_args_for_task( developer_id: UUID, agent_id: UUID, task_id: UUID, + tool_type: Literal["integration", "api_call"] = "integration", + arg_type: Literal["args", "setup"] = "args", ) -> tuple[list[str], dict]: agent_id = str(agent_id) task_id = str(task_id) - get_query = """ + get_query = f""" input[agent_id, task_id] <- [[to_uuid($agent_id), to_uuid($task_id)]] - ?[args] := + ?[values] := input[agent_id, task_id], - *tasks { + *tasks {{ task_id, metadata: task_metadata, - }, - *agents { + }}, + *agents {{ agent_id, metadata: agent_metadata, - }, - task_args = get(task_metadata, "x-tool-args", {}), - agent_args = get(agent_metadata, "x-tool-args", {}), + }}, + task_{arg_type} = get(task_metadata, "x-{tool_type}-{arg_type}", {{}}), + agent_{arg_type} = get(agent_metadata, "x-{tool_type}-{arg_type}", {{}}), # Right values overwrite left values # See: https://docs.cozodb.org/en/latest/functions.html#Func.Vector.concat - args = concat(agent_args, task_args), + values = concat(agent_{arg_type}, task_{arg_type}), """ queries = [ @@ -61,28 +64,30 @@ def tool_args_for_session( developer_id: UUID, session_id: UUID, agent_id: UUID, + arg_type: Literal["args", "setup"] = "args", + tool_type: Literal["integration", "api_call"] = "integration", ) -> tuple[list[str], dict]: session_id = str(session_id) - get_query = """ + get_query = f""" input[session_id, agent_id] <- [[to_uuid($session_id), to_uuid($agent_id)]] - ?[args] := + ?[values] := input[session_id, agent_id], - *sessions { + *sessions {{ session_id, metadata: session_metadata, - }, - *agents { + }}, + *agents {{ agent_id, metadata: agent_metadata, - }, - session_args = get(session_metadata, "x-tool-args"), - agent_args = get(agent_metadata, "x-tool-args"), + }}, + session_{arg_type} = get(session_metadata, "x-{tool_type}-{arg_type}", {{}}), + agent_{arg_type} = get(agent_metadata, "x-{tool_type}-{arg_type}", {{}}), # Right values overwrite left values # See: https://docs.cozodb.org/en/latest/functions.html#Func.Vector.concat - args = concat(agent_args, session_args), + values = concat(agent_{arg_type}, session_{arg_type}), """ queries = [ @@ -103,7 +108,7 @@ def tool_args_for_session( TypeError: partialclass(HTTPException, status_code=400), } ) -@wrap_in_class(dict, transform=lambda x: x["args"], one=True) +@wrap_in_class(dict, transform=lambda x: x["values"], one=True) @cozo_query @beartype def get_tool_args_from_metadata( @@ -112,15 +117,28 @@ def get_tool_args_from_metadata( agent_id: UUID, session_id: UUID | None = None, task_id: UUID | None = None, + tool_type: Literal["integration", "api_call"] = "integration", + arg_type: Literal["args", "setup", "headers"] = "args", ) -> tuple[list[str], dict]: + common: dict = dict( + developer_id=developer_id, + agent_id=agent_id, + tool_type=tool_type, + arg_type=arg_type, + ) + match session_id, task_id: case (None, task_id) if task_id is not None: return tool_args_for_task( - developer_id=developer_id, agent_id=agent_id, task_id=task_id + **common, + task_id=task_id, ) + case (session_id, None) if session_id is not None: return tool_args_for_session( - developer_id=developer_id, agent_id=agent_id, session_id=session_id + **common, + session_id=session_id, ) + case (_, _): raise ValueError("Either session_id or task_id must be provided") diff --git a/agents-api/poetry.lock b/agents-api/poetry.lock index e3882e93d..e4cc58c7b 100644 --- a/agents-api/poetry.lock +++ b/agents-api/poetry.lock @@ -2,113 +2,113 @@ [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.2" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, + {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.6" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:682836fc672972cc3101cc9e30d49c5f7e8f1d010478d46119fe725a4545acfd"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:289fa8a20018d0d5aa9e4b35d899bd51bcb80f0d5f365d9a23e30dac3b79159b"}, + {file = "aiohttp-3.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8617c96a20dd57e7e9d398ff9d04f3d11c4d28b1767273a5b1a018ada5a654d3"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbeff1b062751c2a2a55b171f7050fb7073633c699299d042e962aacdbe1a07"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea35d849cdd4a9268f910bff4497baebbc1aa3f2f625fd8ccd9ac99c860c621"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473961b3252f3b949bb84873d6e268fb6d8aa0ccc6eb7404fa58c76a326bb8e1"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d2665c5df629eb2f981dab244c01bfa6cdc185f4ffa026639286c4d56fafb54"}, + {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d92f794f1332f656e3765841fc2b7ad5c26c3f3d01e8949eeb3495691cf9f4"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9bd6b2033993d5ae80883bb29b83fb2b432270bbe067c2f53cc73bb57c46065f"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d7f408c43f5e75ea1edc152fb375e8f46ef916f545fb66d4aebcbcfad05e2796"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cf8b8560aa965f87bf9c13bf9fed7025993a155ca0ce8422da74bf46d18c2f5f"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14477c4e52e2f17437b99893fd220ffe7d7ee41df5ebf931a92b8ca82e6fd094"}, + {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb138fbf9f53928e779650f5ed26d0ea1ed8b2cab67f0ea5d63afa09fdc07593"}, + {file = "aiohttp-3.10.6-cp310-cp310-win32.whl", hash = "sha256:9843d683b8756971797be171ead21511d2215a2d6e3c899c6e3107fbbe826791"}, + {file = "aiohttp-3.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:f8b8e49fe02f744d38352daca1dbef462c3874900bd8166516f6ea8e82b5aacf"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52e54fd776ad0da1006708762213b079b154644db54bcfc62f06eaa5b896402"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ab1a238fd0d19dc65f2d222e5eb064e409665c6426a3e51d5101c1979ee84"}, + {file = "aiohttp-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0749c4d5a08a802dd66ecdf59b2df4d76b900004017468a7bb736c3b5a3dd902"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e05b39158f2af0e2438cc2075cfc271f4ace0c3cc4a81ec95b27a0432e161951"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f196c970db2dcde4f24317e06615363349dc357cf4d7a3b0716c20ac6d7bcd"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47647c8af04a70e07a2462931b0eba63146a13affa697afb4ecbab9d03a480ce"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c0efe7e99f6d94d63274c06344bd0e9c8daf184ce5602a29bc39e00a18720"}, + {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9721cdd83a994225352ca84cd537760d41a9da3c0eacb3ff534747ab8fba6d0"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b82c8ebed66ce182893e7c0b6b60ba2ace45b1df104feb52380edae266a4850"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b169f8e755e541b72e714b89a831b315bbe70db44e33fead28516c9e13d5f931"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0be3115753baf8b4153e64f9aa7bf6c0c64af57979aa900c31f496301b374570"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e1f80cd17d81a404b6e70ef22bfe1870bafc511728397634ad5f5efc8698df56"}, + {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6419728b08fb6380c66a470d2319cafcec554c81780e2114b7e150329b9a9a7f"}, + {file = "aiohttp-3.10.6-cp311-cp311-win32.whl", hash = "sha256:bd294dcdc1afdc510bb51d35444003f14e327572877d016d576ac3b9a5888a27"}, + {file = "aiohttp-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:bf861da9a43d282d6dd9dcd64c23a0fccf2c5aa5cd7c32024513c8c79fb69de3"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2708baccdc62f4b1251e59c2aac725936a900081f079b88843dabcab0feeeb27"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7475da7a5e2ccf1a1c86c8fee241e277f4874c96564d06f726d8df8e77683ef7"}, + {file = "aiohttp-3.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02108326574ff60267b7b35b17ac5c0bbd0008ccb942ce4c48b657bb90f0b8aa"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:029a019627b37fa9eac5c75cc54a6bb722c4ebbf5a54d8c8c0fb4dd8facf2702"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a637d387db6fdad95e293fab5433b775fd104ae6348d2388beaaa60d08b38c4"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1a16f3fc1944c61290d33c88dc3f09ba62d159b284c38c5331868425aca426"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b292f37969f9cc54f4643f0be7dacabf3612b3b4a65413661cf6c350226787"}, + {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0754690a3a26e819173a34093798c155bafb21c3c640bff13be1afa1e9d421f9"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:164ecd32e65467d86843dbb121a6666c3deb23b460e3f8aefdcaacae79eb718a"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438c5863feb761f7ca3270d48c292c334814459f61cc12bab5ba5b702d7c9e56"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ba18573bb1de1063d222f41de64a0d3741223982dcea863b3f74646faf618ec7"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c82a94ddec996413a905f622f3da02c4359952aab8d817c01cf9915419525e95"}, + {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92351aa5363fc3c1f872ca763f86730ced32b01607f0c9662b1fa711087968d0"}, + {file = "aiohttp-3.10.6-cp312-cp312-win32.whl", hash = "sha256:3e15e33bfc73fa97c228f72e05e8795e163a693fd5323549f49367c76a6e5883"}, + {file = "aiohttp-3.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:fe517113fe4d35d9072b826c3e147d63c5f808ca8167d450b4f96c520c8a1d8d"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:482f74057ea13d387a7549d7a7ecb60e45146d15f3e58a2d93a0ad2d5a8457cd"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:03fa40d1450ee5196e843315ddf74a51afc7e83d489dbfc380eecefea74158b1"}, + {file = "aiohttp-3.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e52e59ed5f4cc3a3acfe2a610f8891f216f486de54d95d6600a2c9ba1581f4d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b3935a22c9e41a8000d90588bed96cf395ef572dbb409be44c6219c61d900d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bef1480ee50f75abcfcb4b11c12de1005968ca9d0172aec4a5057ba9f2b644f"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:671745ea7db19693ce867359d503772177f0b20fa8f6ee1e74e00449f4c4151d"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50b367308ca8c12e0b50cba5773bc9abe64c428d3fd2bbf5cd25aab37c77bf"}, + {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a504d7cdb431a777d05a124fd0b21efb94498efa743103ea01b1e3136d2e4fb"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66bc81361131763660b969132a22edce2c4d184978ba39614e8f8f95db5c95f8"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:27cf19a38506e2e9f12fc17e55f118f04897b0a78537055d93a9de4bf3022e3d"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3468b39f977a11271517c6925b226720e148311039a380cc9117b1e2258a721f"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9d26da22a793dfd424be1050712a70c0afd96345245c29aced1e35dbace03413"}, + {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:844d48ff9173d0b941abed8b2ea6a412f82b56d9ab1edb918c74000c15839362"}, + {file = "aiohttp-3.10.6-cp313-cp313-win32.whl", hash = "sha256:2dd56e3c43660ed3bea67fd4c5025f1ac1f9ecf6f0b991a6e5efe2e678c490c5"}, + {file = "aiohttp-3.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:c91781d969fbced1993537f45efe1213bd6fccb4b37bfae2a026e20d6fbed206"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4407a80bca3e694f2d2a523058e20e1f9f98a416619e04f6dc09dc910352ac8b"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cb045ec5961f51af3e2c08cd6fe523f07cc6e345033adee711c49b7b91bb954"}, + {file = "aiohttp-3.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fabdcdc781a36b8fd7b2ca9dea8172f29a99e11d00ca0f83ffeb50958da84a1"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a9f42efcc2681790595ab3d03c0e52d01edc23a0973ea09f0dc8d295e12b8e"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cca776a440795db437d82c07455761c85bbcf3956221c3c23b8c93176c278ce7"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5582de171f0898139cf51dd9fcdc79b848e28d9abd68e837f0803fc9f30807b1"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:370e2d47575c53c817ee42a18acc34aad8da4dbdaac0a6c836d58878955f1477"}, + {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:444d1704e2af6b30766debed9be8a795958029e552fe77551355badb1944012c"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40271a2a375812967401c9ca8077de9368e09a43a964f4dce0ff603301ec9358"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f3af26f86863fad12e25395805bb0babbd49d512806af91ec9708a272b696248"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4752df44df48fd42b80f51d6a97553b482cda1274d9dc5df214a3a1aa5d8f018"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2cd5290ab66cfca2f90045db2cc6434c1f4f9fbf97c9f1c316e785033782e7d2"}, + {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3427031064b0d5c95647e6369c4aa3c556402f324a3e18107cb09517abe5f962"}, + {file = "aiohttp-3.10.6-cp38-cp38-win32.whl", hash = "sha256:614fc21e86adc28e4165a6391f851a6da6e9cbd7bb232d0df7718b453a89ee98"}, + {file = "aiohttp-3.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:58c5d7318a136a3874c78717dd6de57519bc64f6363c5827c2b1cb775bea71dd"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5db26bbca8e7968c4c977a0c640e0b9ce7224e1f4dcafa57870dc6ee28e27de6"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fb4216e3ec0dbc01db5ba802f02ed78ad8f07121be54eb9e918448cc3f61b7c"}, + {file = "aiohttp-3.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a976ef488f26e224079deb3d424f29144c6d5ba4ded313198169a8af8f47fb82"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a86610174de8a85a920e956e2d4f9945e7da89f29a00e95ac62a4a414c4ef4e"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:217791c6a399cc4f2e6577bb44344cba1f5714a2aebf6a0bea04cfa956658284"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba3662d41abe2eab0eeec7ee56f33ef4e0b34858f38abf24377687f9e1fb00a5"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4dfa5ad4bce9ca30a76117fbaa1c1decf41ebb6c18a4e098df44298941566f9"}, + {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0009258e97502936d3bd5bf2ced15769629097d0abb81e6495fba1047824fe0"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a75d5c9fb4f06c41d029ae70ad943c3a844c40c0a769d12be4b99b04f473d3d"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8198b7c002aae2b40b2d16bfe724b9a90bcbc9b78b2566fc96131ef4e382574d"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4611db8c907f90fe86be112efdc2398cd7b4c8eeded5a4f0314b70fdea8feab0"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ff99ae06eef85c7a565854826114ced72765832ee16c7e3e766c5e4c5b98d20e"}, + {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7641920bdcc7cd2d3ddfb8bb9133a6c9536b09dbd49490b79e125180b2d25b93"}, + {file = "aiohttp-3.10.6-cp39-cp39-win32.whl", hash = "sha256:e2e7d5591ea868d5ec82b90bbeb366a198715672841d46281b623e23079593db"}, + {file = "aiohttp-3.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:b504c08c45623bf5c7ca41be380156d925f00199b3970efd758aef4a77645feb"}, + {file = "aiohttp-3.10.6.tar.gz", hash = "sha256:d2578ef941be0c2ba58f6f421a703527d08427237ed45ecb091fed6f83305336"}, ] [package.dependencies] @@ -117,7 +117,7 @@ aiosignal = ">=1.1.2" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -149,13 +149,13 @@ files = [ [[package]] name = "anyio" -version = "4.5.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.5.0-py3-none-any.whl", hash = "sha256:fdeb095b7cc5a5563175eedd926ec4ae55413bb4be5770c424af0ba46ccb4a78"}, - {file = "anyio-4.5.0.tar.gz", hash = "sha256:c5a275fe5ca0afd788001f58fca1e69e29ce706d746e317d660e21f70c530ef9"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -762,7 +762,7 @@ inflect = ">=4.1.0,<6.0" isort = ">=4.3.21,<6.0" jinja2 = ">=2.10.1,<4.0" packaging = "*" -pydantic = {version = ">=1.10.0,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.11\" and python_version < \"4.0\""} +pydantic = {version = ">=1.10.0,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.12\" and python_version < \"4.0\""} pyyaml = ">=6.0.1" [package.extras] @@ -773,33 +773,33 @@ validation = ["openapi-spec-validator (>=0.2.8,<0.7.0)", "prance (>=0.18.2)"] [[package]] name = "debugpy" -version = "1.8.5" +version = "1.8.6" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, - {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, - {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, - {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, - {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, - {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, - {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, - {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, - {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, - {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, - {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, - {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, - {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, - {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, - {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, - {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, - {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, - {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, - {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, - {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, - {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, - {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, + {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, + {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, + {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, + {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, + {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, + {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, + {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, + {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, + {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, + {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, + {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, + {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, + {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, + {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, + {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, + {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, + {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, + {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, + {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, + {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, + {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, + {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, ] [[package]] @@ -1235,13 +1235,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.25.0" +version = "0.25.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.25.0-py3-none-any.whl", hash = "sha256:e2f357b35d72d5012cfd127108c4e14abcd61ba4ebc90a5a374dc2456cb34e12"}, - {file = "huggingface_hub-0.25.0.tar.gz", hash = "sha256:fb5fbe6c12fcd99d187ec7db95db9110fb1a20505f23040a5449a717c1a0db4d"}, + {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, + {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, ] [package.dependencies] @@ -1398,7 +1398,6 @@ prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5.13.0" -typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] @@ -1905,13 +1904,13 @@ dev = ["Sphinx (>=5.1.1)", "black (==23.12.1)", "build (>=0.10.0)", "coverage (> [[package]] name = "litellm" -version = "1.46.7" +version = "1.48.3" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.46.7-py3-none-any.whl", hash = "sha256:e330a144f4ed8fd22c19fa81c93ada22fd9f83a67cccdced935f79aa15181e57"}, - {file = "litellm-1.46.7.tar.gz", hash = "sha256:5e7aac56f47e441aa951ec9bf5fb8cfaa7ded1e2e312c6d0c07107cda5ee98a0"}, + {file = "litellm-1.48.3-py3-none-any.whl", hash = "sha256:bc6f785ac1ce04ca83e734ccc1982f7cce3ed3ab8d3662baba1b636b6fb6789f"}, + {file = "litellm-1.48.3.tar.gz", hash = "sha256:3be0d1b73240c6956cc9212e476c764e9287abc6fd4c7310b1d18699b5f1be93"}, ] [package.dependencies] @@ -2510,13 +2509,13 @@ files = [ [[package]] name = "openai" -version = "1.46.1" +version = "1.50.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.46.1-py3-none-any.whl", hash = "sha256:7517f07117cf66012bbc55c49fd6b983eaac0f3d2a09c90cba1140d4455e4290"}, - {file = "openai-1.46.1.tar.gz", hash = "sha256:e5cf7f268bf516de23686d496c9dae7f0dcdcd0e87af4d288deeab8329fcbbaf"}, + {file = "openai-1.50.1-py3-none-any.whl", hash = "sha256:7967fc8372d5e005ad61514586fb286d593facafccedbee00416bc38ee07c2e6"}, + {file = "openai-1.50.1.tar.gz", hash = "sha256:80cbdf275488894c70bfbad711dbba6f31ea71d579b97e364bfd99cdf030158e"}, ] [package.dependencies] @@ -2556,44 +2555,57 @@ files = [ [[package]] name = "pandas" -version = "2.2.2" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] -numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} +numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -2747,13 +2759,13 @@ files = [ [[package]] name = "prometheus-client" -version = "0.20.0" +version = "0.21.0" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, + {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, + {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, ] [package.extras] @@ -2761,13 +2773,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -3026,13 +3038,13 @@ pydantic = ">=1.9.0,<3.0.0" [[package]] name = "pydot" -version = "3.0.1" +version = "3.0.2" description = "Python interface to Graphviz's Dot" optional = false python-versions = ">=3.8" files = [ - {file = "pydot-3.0.1-py3-none-any.whl", hash = "sha256:43f1e878dc1ff7c1c2e3470a6999d4e9e97771c5c862440c2f0af0ba844c231f"}, - {file = "pydot-3.0.1.tar.gz", hash = "sha256:e18cf7f287c497d77b536a3d20a46284568fea390776dface6eabbdf1b1b5efc"}, + {file = "pydot-3.0.2-py3-none-any.whl", hash = "sha256:99cedaa55d04abb0b2bc56d9981a6da781053dd5ac75c428e8dd53db53f90b14"}, + {file = "pydot-3.0.2.tar.gz", hash = "sha256:9180da540b51b3aa09fbf81140b3edfbe2315d778e8589a7d0a4a69c41332bae"}, ] [package.dependencies] @@ -3041,7 +3053,7 @@ pyparsing = ">=3.0.9" [package.extras] dev = ["chardet", "parameterized", "ruff"] release = ["zest.releaser[recommended]"] -tests = ["chardet", "parameterized", "ruff", "tox", "unittest-parallel"] +tests = ["chardet", "parameterized", "pytest", "pytest-cov", "pytest-xdist[psutil]", "ruff", "tox"] [[package]] name = "pygments" @@ -3952,13 +3964,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.38.5" +version = "0.38.6" description = "The little ASGI library that shines." optional = false python-versions = ">=3.8" files = [ - {file = "starlette-0.38.5-py3-none-any.whl", hash = "sha256:632f420a9d13e3ee2a6f18f437b0a9f1faecb0bc42e1942aa2ea0e379a4c4206"}, - {file = "starlette-0.38.5.tar.gz", hash = "sha256:04a92830a9b6eb1442c766199d62260c3d4dc9c4f9188360626b1e0273cb7077"}, + {file = "starlette-0.38.6-py3-none-any.whl", hash = "sha256:4517a1409e2e73ee4951214ba012052b9e16f60e90d73cfb06192c19203bbb05"}, + {file = "starlette-0.38.6.tar.gz", hash = "sha256:863a1588f5574e70a821dadefb41e4881ea451a47a3cd1b4df359d4ffefe5ead"}, ] [package.dependencies] @@ -4338,13 +4350,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "types-protobuf" -version = "5.27.0.20240907" +version = "5.28.0.20240924" description = "Typing stubs for protobuf" optional = false python-versions = ">=3.8" files = [ - {file = "types-protobuf-5.27.0.20240907.tar.gz", hash = "sha256:bb6f90f66b18d4d1c75667b6586334b0573a6fcee5eb0142a7348a765a7cbadc"}, - {file = "types_protobuf-5.27.0.20240907-py3-none-any.whl", hash = "sha256:5443270534cc8072909ef7ad9e1421ccff924ca658749a6396c0c43d64c32676"}, + {file = "types-protobuf-5.28.0.20240924.tar.gz", hash = "sha256:d181af8a256e5a91ce8d5adb53496e880efd9144c7d54483e3653332b60296f0"}, + {file = "types_protobuf-5.28.0.20240924-py3-none-any.whl", hash = "sha256:5cecf612ccdefb7dc95f7a51fb502902f20fc2e6681cd500184aaa1b3931d6a7"}, ] [[package]] @@ -4371,13 +4383,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -4527,103 +4539,103 @@ files = [ [[package]] name = "yarl" -version = "1.11.1" +version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, - {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, - {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, - {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, - {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, - {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, - {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, - {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, - {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, - {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, - {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, - {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, - {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, - {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, - {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -4651,5 +4663,5 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" -python-versions = ">=3.11,<3.12" -content-hash = "0f44caacfcff3c513b0374bd9e4d787576700184247c2572a31f1033083b21b9" +python-versions = ">=3.12,<3.13" +content-hash = "04ddd9ac6f88a4b8339b1d4fb7e44ea0574b340672542a4f6c4725dd7b23d998" diff --git a/agents-api/pyproject.toml b/agents-api/pyproject.toml index 3d7a7c925..3904ae394 100644 --- a/agents-api/pyproject.toml +++ b/agents-api/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{include = "agents_api"}] [tool.poetry.dependencies] -python = ">=3.11,<3.12" +python = ">=3.12,<3.13" fastapi = "^0.112.1" pycozo = {extras = ["embedded"], version = "^0.7.6"} uvicorn = "^0.30.6" @@ -44,7 +44,7 @@ ruff = "^0.5.5" datamodel-code-generator = "^0.25.9" cozo-migrate = "^0.2.0" poethepoet = "^0.25.1" -pytype = ">=2024.4.11" +pytype = ">=2024.9.13" pyjwt = "^2.8.0" ward = "^0.68.0b0" jupyterlab = "^4.2.4" diff --git a/agents-api/pytype.toml b/agents-api/pytype.toml index 2371cea58..b591601cc 100644 --- a/agents-api/pytype.toml +++ b/agents-api/pytype.toml @@ -28,7 +28,7 @@ platform = 'linux' pythonpath = '.' # Python version (major.minor) of the target code. -python_version = '3.11' +python_version = '3.12' # Don't allow None to match bool. This flag is temporary and will be removed # once this behavior is enabled by default. @@ -61,4 +61,4 @@ no_return_any = false # Opt-in: Require decoration with @typing.override when overriding a method or # nested class attribute of a parent class. -require_override_decorator = false \ No newline at end of file +require_override_decorator = false diff --git a/docs/julep-concepts.md b/docs/julep-concepts.md index 14177343c..b6fc945d7 100644 --- a/docs/julep-concepts.md +++ b/docs/julep-concepts.md @@ -702,7 +702,7 @@ Remember to replace `YOUR_API_KEY`, `{agent_id}`, and `{tool_id}` with your actu ### Partial application of arguments to tools -Often, it's necessary to _partial_ some arguments of a particular tool. You can do that by setting the `x-tool-parameters` field on the `metadata` of the required scope. For instance, say you have the following user-defined function tool: +Often, it's necessary to _partial_ some arguments of a particular tool. You can do that by setting the `x-integration-args` field on the `metadata` of the required scope. For instance, say you have the following user-defined function tool: ```yaml name: check_account_status description: Get the account status for a customer @@ -719,7 +719,7 @@ When chatting with a particular user, the `customer_id` field is expected to be { "metadata": { ... - "x-tool-parameters": { + "x-integration-args": { "function:check_account_status": { "customer_id": 42 } @@ -737,12 +737,12 @@ This follows the precedence order of `metadata` fields. For example, say you are user: id: 11 metadata: - x-tool-parameters: + x-integration-args: favorite: Emma Roberts agent: id: 22 metadata: - x-tool-parameters: + x-integration-args: favorite: Emma Watson tools: - type: function @@ -752,7 +752,7 @@ agent: session: id: 123 metadata: - x-tool-parameters: + x-integration-args: favorite: Emma Stone ``` diff --git a/memory-store/docker-compose.yml b/memory-store/docker-compose.yml index 3ed06f1de..2adf50e81 100644 --- a/memory-store/docker-compose.yml +++ b/memory-store/docker-compose.yml @@ -18,7 +18,7 @@ services: labels: ofelia.enabled: "true" - ofelia.job-exec.backupcron.schedule: "@every 1h" + ofelia.job-exec.backupcron.schedule: "@every 3h" ofelia.job-exec.backupcron.environment: '["COZO_PORT=${COZO_PORT}", "COZO_AUTH_TOKEN=${COZO_AUTH_TOKEN}", "COZO_BACKUP_DIR=${COZO_BACKUP_DIR}"]' ofelia.job-exec.backupcron.command: bash /app/backup.sh From ed08024e587e934159b6eb594819fa6cfc7aae4f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sat, 28 Sep 2024 11:50:11 -0400 Subject: [PATCH 008/113] feat: Add docker bake builder (#528) Introduce Docker Bake for building and pushing images with updated GitHub Actions workflows and Dockerfiles. - **GitHub Actions Workflows**: - Add `.github/workflows/dev-push-to-hub.yml` and `.github/workflows/main-push-to-hub.yml` for building and pushing images on `dev` and `main` branch merges. - Remove `push-to-hub.yml` workflow. - **Docker Build System**: - Introduce `docker-bake.hcl` for defining Docker build targets and configurations. - Update Dockerfiles in `agents-api`, `agents-api.worker`, `agents-api.migration` to use Docker Bake. - **Documentation**: - Update `CONTRIBUTING.md` with instructions for building Docker images using Docker Bake. - **Miscellaneous**: - Add submodules for `sdks/node-sdk` and `sdks/python-sdk`. --- .github/workflows/dev-push-to-hub.yml | 46 ++ .github/workflows/main-push-to-hub.yml | 45 ++ .github/workflows/push-to-hub.yml | 163 ----- CONTRIBUTING.md | 40 ++ agents-api/Dockerfile | 9 +- agents-api/Dockerfile.migration | 10 +- agents-api/Dockerfile.worker | 7 +- docker-bake.hcl | 72 +++ gateway/Dockerfile | 14 +- gateway/entrypoint.sh | 7 +- integrations-service/Dockerfile | 7 +- integrations-service/poetry.lock | 812 ++++++++++++++++++------- integrations-service/pyproject.toml | 6 +- integrations-service/pytype.toml | 2 +- memory-store/Dockerfile | 2 + sdks/node-sdk | 1 + sdks/python-sdk | 1 + 17 files changed, 836 insertions(+), 408 deletions(-) create mode 100644 .github/workflows/dev-push-to-hub.yml create mode 100644 .github/workflows/main-push-to-hub.yml delete mode 100644 .github/workflows/push-to-hub.yml create mode 100644 docker-bake.hcl create mode 160000 sdks/node-sdk create mode 160000 sdks/python-sdk diff --git a/.github/workflows/dev-push-to-hub.yml b/.github/workflows/dev-push-to-hub.yml new file mode 100644 index 000000000..f92a8bc2c --- /dev/null +++ b/.github/workflows/dev-push-to-hub.yml @@ -0,0 +1,46 @@ +name: Build and push images to docker hub on merge to dev +run-name: ${{ github.actor }} is building and pushing images to docker hub + +on: + push: + branches: + - "dev" + +jobs: + Bake-Push-Images: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set branch name + id: variables + run: | + echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT + echo "git_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: julepai + password: "${{ secrets.DOCKER_HUB_PASSWORD }}" + + - name: Build and push agent images + uses: docker/bake-action@v3 + with: + files: | + ./docker-bake.hcl + targets: agents-api + push: true + set: | + *.cache-from=type=gha + *.cache-to=type=gha,mode=max + *.args.TAG=${{ steps.variables.outputs.branch_name }} + *.args.GIT_SHA=${{ steps.variables.outputs.git_sha }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/dev' }} diff --git a/.github/workflows/main-push-to-hub.yml b/.github/workflows/main-push-to-hub.yml new file mode 100644 index 000000000..8b0fffe89 --- /dev/null +++ b/.github/workflows/main-push-to-hub.yml @@ -0,0 +1,45 @@ +name: Build and push images to docker hub on merge to main +run-name: ${{ github.actor }} is building and pushing images to docker hub + +on: + push: + branches: + - "main" + +jobs: + Bake-Push-Images: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set git sha + id: variables + run: | + echo "git_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: julepai + password: "${{ secrets.DOCKER_HUB_PASSWORD }}" + + - name: Build and push agent images + uses: docker/bake-action@v3 + with: + files: | + ./docker-bake.hcl + targets: agents-api + push: true + set: | + *.cache-from=type=gha + *.cache-to=type=gha,mode=max + *.args.TAG=latest + *.args.GIT_SHA=${{ steps.variables.outputs.git_sha }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} \ No newline at end of file diff --git a/.github/workflows/push-to-hub.yml b/.github/workflows/push-to-hub.yml deleted file mode 100644 index ee848d755..000000000 --- a/.github/workflows/push-to-hub.yml +++ /dev/null @@ -1,163 +0,0 @@ -name: Build and push images to docker hub on merge to dev -run-name: ${{ github.actor }} is building and pushing images to docker hub - -# TODO: This is currently not working. Need to fix it -on: - push: - branches: - - "dev" - - "main" - -jobs: - Build-Push-Agents-API-Image: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set branch name - id: variables - run: echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: julepai - password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - - - name: Build and push agent images - uses: docker/build-push-action@v4 - with: - context: ./agents-api - file: ./agents-api/Dockerfile - push: true - tags: julepai/agents-api:${{ steps.variables.outputs.branch_name }} - cache-from: type=gha - cache-to: type=gha,mode=max - - Build-Push-Migration-Image: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set branch name - id: variables - run: echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: julepai - password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - - - name: Build and push migration image - uses: docker/build-push-action@v4 - with: - context: ./agents-api - file: ./agents-api/Dockerfile.migration - push: true - tags: julepai/cozo-migrate:${{ steps.variables.outputs.branch_name }} - cache-from: type=gha - cache-to: type=gha,mode=max - - Build-Push-Temporal-Image: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set branch name - id: variables - run: echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: julepai - password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - - - name: Build and push temporal image - uses: docker/build-push-action@v4 - with: - context: ./agents-api - file: ./agents-api/Dockerfile.temporal - push: true - tags: julepai/temporal:${{ steps.variables.outputs.branch_name }} - cache-from: type=gha - cache-to: type=gha,mode=max - - Build-Push-Worker-Image: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set branch name - id: variables - run: echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: julepai - password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - - - name: Build and push worker image - uses: docker/build-push-action@v4 - with: - context: ./agents-api - file: ./agents-api/Dockerfile.worker - push: true - tags: julepai/worker:${{ steps.variables.outputs.branch_name }} - cache-from: type=gha - cache-to: type=gha,mode=max - - Build-Push-Other-Images: - runs-on: ubuntu-latest - strategy: - matrix: - service-directory: - - gateway - - memory-store - - steps: - - uses: actions/checkout@v4 - - - name: Set branch name - id: variables - run: echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: julepai - password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - - - name: Build and push images - uses: docker/build-push-action@v4 - with: - context: ./${{ matrix.service-directory }} - push: true - tags: julepai/${{ matrix.service-directory }}:${{ steps.variables.outputs.branch_name }} - cache-from: type=gha - cache-to: type=gha,mode=max - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7081a266d..a9c4f24d9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,4 +30,44 @@ Improvements to documentation are always appreciated! If you see areas that coul We'd love to hear your feedback and ideas for the project! Feel free to submit an issue or contact the maintainers directly to share your thoughts. Your input is very valuable in shaping the future direction of the project. +## Building Docker Images with Buildx Bake + +We use Docker Buildx Bake to build our Docker images. This allows us to build multiple images concurrently and efficiently. Follow these steps to build the Docker images: + +1. Ensure you have Docker and Docker Buildx installed on your system. + +2. Navigate to the root directory of the project where the `docker-bake.hcl` file is located. + +3. To build all services, run: + ``` + docker buildx bake --file docker-bake.hcl + ``` + +4. To build a specific service, use: + ``` + docker buildx bake --file docker-bake.hcl + ``` + Replace `` with one of the following: + - agents-api + - agents-api-worker + - cozo-migrate + - memory-store + - integrations + - gateway + - embedding-service-cpu + - embedding-service-gpu + +5. To set a custom tag for the images, use: + ``` + docker buildx bake --file docker-bake.hcl --set *.tags=myorg/myimage:v1.0 + ``` + Replace `myorg/myimage:v1.0` with your desired image name and tag. + +6. By default, the images are built with the "latest" tag. To specify a different tag, you can set the TAG variable: + ``` + docker buildx bake --file docker-bake.hcl --set TAG=v1.2.3 + ``` + +Note: The `docker-bake.hcl` file defines the build contexts, Dockerfiles, and tags for each service. If you need to modify the build process for a specific service, update the corresponding target in the `docker-bake.hcl` file. + Thank you for your interest in contributing to this project! \ No newline at end of file diff --git a/agents-api/Dockerfile b/agents-api/Dockerfile index 3081d91fa..90432df12 100644 --- a/agents-api/Dockerfile +++ b/agents-api/Dockerfile @@ -1,11 +1,14 @@ +# syntax=docker/dockerfile:1 +# check=error=true + FROM python:3.12-slim -ENV PYTHONUNBUFFERED True +ENV PYTHONUNBUFFERED=1 ENV POETRY_CACHE_DIR=/tmp/poetry_cache WORKDIR /app -RUN pip install 'poetry<=1.9.0' \ +RUN pip install 'poetry>=1.8.0,<1.9.0' \ && poetry config virtualenvs.create false COPY pyproject.toml poetry.lock ./ @@ -14,6 +17,4 @@ RUN poetry install --no-dev --no-root COPY . ./ -RUN poetry install --no-dev - ENTRYPOINT ["python", "-m", "agents_api.web", "--host", "0.0.0.0", "--port", "8080"] diff --git a/agents-api/Dockerfile.migration b/agents-api/Dockerfile.migration index c48946c0e..695b2e1e9 100644 --- a/agents-api/Dockerfile.migration +++ b/agents-api/Dockerfile.migration @@ -1,6 +1,9 @@ +# syntax=docker/dockerfile:1 +# check=error=true + FROM python:3.11-slim -ENV PYTHONUNBUFFERED True +ENV PYTHONUNBUFFERED=1 ENV POETRY_CACHE_DIR=/tmp/poetry_cache WORKDIR /app @@ -9,8 +12,11 @@ RUN pip install --no-cache-dir --upgrade cozo-migrate COPY . ./ ENV COZO_HOST="http://cozo:9070" -ENV COZO_AUTH_TOKEN="myauthkey" +# Expected environment variables: +# COZO_AUTH_TOKEN="myauthkey" + +SHELL ["/bin/bash", "-c"] ENTRYPOINT \ cozo-migrate -e http -h $COZO_HOST --auth $COZO_AUTH_TOKEN init \ ; cozo-migrate -e http -h $COZO_HOST --auth $COZO_AUTH_TOKEN -d ./migrations apply -ay diff --git a/agents-api/Dockerfile.worker b/agents-api/Dockerfile.worker index e60eec941..0bf84fae2 100644 --- a/agents-api/Dockerfile.worker +++ b/agents-api/Dockerfile.worker @@ -1,11 +1,14 @@ +# syntax=docker/dockerfile:1 +# check=error=true + FROM python:3.12-slim -ENV PYTHONUNBUFFERED True +ENV PYTHONUNBUFFERED=1 ENV POETRY_CACHE_DIR=/tmp/poetry_cache WORKDIR /app -RUN pip install 'poetry<=1.9.0' \ +RUN pip install 'poetry>=1.8.0,<1.9.0' \ && poetry config virtualenvs.create false COPY pyproject.toml poetry.lock ./ diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 000000000..70d8ed1ea --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,72 @@ +variable "TAG" { + default = "..." +} + +variable "GIT_SHA" { + default = "..." +} + +group "default" { + targets = [ + "agents-api", + "agents-api-worker", + "cozo-migrate", + "memory-store", + "integrations", + "gateway", + ] +} + +target "agents-api" { + context = "./agents-api" + dockerfile = "Dockerfile" + tags = [ + "julepai/agents-api:${TAG}", + "julepai/agents-api:git-${GIT_SHA}" + ] +} + +target "agents-api-worker" { + context = "./agents-api" + dockerfile = "Dockerfile.worker" + tags = [ + "julepai/worker:${TAG}", + "julepai/worker:git-${GIT_SHA}" + ] +} + +target "cozo-migrate" { + context = "./agents-api" + dockerfile = "Dockerfile.migration" + tags = [ + "julepai/cozo-migrate:${TAG}", + "julepai/cozo-migrate:git-${GIT_SHA}" + ] +} + +target "memory-store" { + context = "./memory-store" + dockerfile = "Dockerfile" + tags = [ + "julepai/memory-store:${TAG}", + "julepai/memory-store:git-${GIT_SHA}" + ] +} + +target "integrations" { + context = "./integrations-service" + dockerfile = "Dockerfile" + tags = [ + "julepai/integrations:${TAG}", + "julepai/integrations:git-${GIT_SHA}" + ] +} + +target "gateway" { + context = "./gateway" + dockerfile = "Dockerfile" + tags = [ + "julepai/gateway:${TAG}", + "julepai/gateway:git-${GIT_SHA}" + ] +} \ No newline at end of file diff --git a/gateway/Dockerfile b/gateway/Dockerfile index 196de1245..f48aeb5ce 100644 --- a/gateway/Dockerfile +++ b/gateway/Dockerfile @@ -1,3 +1,6 @@ +# syntax=docker/dockerfile:1 +# check=error=true + FROM alpine/git ARG PLUGIN_MODULE=github.com/julep-ai/traefik-jwt-plugin ARG PLUGIN_GIT_REPO=https://github.com/julep-ai/traefik-jwt-plugin.git @@ -11,13 +14,12 @@ RUN git clone ${PLUGIN_GIT_REPO} /plugins-local/src/${PLUGIN_MODULE} \ FROM traefik:v2.11 ENV GATEWAY_PORT=80 -ENV JWT_SHARED_KEY="" -# ENV MODEL_API_URL="" -# ENV MODEL_API_KEY="" -# ENV MODEL_API_KEY_HEADER_NAME="Authorization" ENV AGENTS_API_URL="" -ENV AGENTS_API_KEY="" -ENV AGENTS_API_KEY_HEADER_NAME="Authorization" + +# Expected environment variables: +# JWT_SHARED_KEY="" +# AGENTS_API_KEY="" +# AGENTS_API_KEY_HEADER_NAME="Authorization" COPY --from=0 /plugins-local /plugins-local diff --git a/gateway/entrypoint.sh b/gateway/entrypoint.sh index a87081d02..e28f8db06 100755 --- a/gateway/entrypoint.sh +++ b/gateway/entrypoint.sh @@ -1,8 +1,11 @@ #!/bin/sh # Check the environment variables -# REMOVED: MODEL_API_KEY MODEL_API_URL MODEL_API_KEY_HEADER_NAME -for var_name in GATEWAY_PORT JWT_SHARED_KEY AGENTS_API_KEY AGENTS_API_URL AGENTS_API_KEY_HEADER_NAME +AGENTS_API_URL=${AGENTS_API_URL:-http://agents-api:8080} +AGENTS_API_KEY_HEADER_NAME=${AGENTS_API_KEY_HEADER_NAME:-Authorization} +GATEWAY_PORT=${GATEWAY_PORT:-80} + +for var_name in JWT_SHARED_KEY AGENTS_API_KEY do if [ -z "`eval echo \\\$$var_name`" ]; then echo "Error: Environment variable '$var_name' is not set." diff --git a/integrations-service/Dockerfile b/integrations-service/Dockerfile index 785021926..784983610 100644 --- a/integrations-service/Dockerfile +++ b/integrations-service/Dockerfile @@ -1,4 +1,7 @@ -FROM python:3.11-slim +# syntax=docker/dockerfile:1 +# check=error=true + +FROM python:3.12-slim WORKDIR /app @@ -16,4 +19,4 @@ RUN poetry config virtualenvs.create false \ COPY . ./ # Run the application -CMD ["python", "-m", "integrations.web", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file +ENTRYPOINT ["python", "-m", "integrations.web", "--host", "0.0.0.0", "--port", "8000"] diff --git a/integrations-service/poetry.lock b/integrations-service/poetry.lock index 64f1f5d9e..1dea3755d 100644 --- a/integrations-service/poetry.lock +++ b/integrations-service/poetry.lock @@ -2,113 +2,113 @@ [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.2" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, + {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.7" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df23cb35bec54b73fba371c7c904994433651458acf8bfb7c84464fef5834c0a"}, + {file = "aiohttp-3.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33a6d023b207ad8227e607814c0020b42c53e01a66004fc0f2555e1a4941282"}, + {file = "aiohttp-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d23df9f01c8945d03cffcdd9ba9bfd88aa21ac567a39d0ac4d0c80499ed0d23"}, + {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ddf2c8c9ec6bb3f5c057e5c95605adb8e3f1e2d999e8801736f448aff29280e"}, + {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d09e40e2ae6723af487ffde019055d0b6ce4eae0749fcfe9de624b61f1af6ec"}, + {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc1f4e0f4b1ae9289b4d0cc3bf5d6d55176c38ef1d41484550f3f9a0a78bedae"}, + {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636e3efb0bb024817cefa1ef86d678d1a73eb210ae162aff4234214060011ff5"}, + {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bab2544f09cd1db154c105e03b1c941032fd7237da5da184595771999ca90daa"}, + {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:431852e77cd72f60a0278f8cf557c8e568cd856f755a4b6c5232c7d8c6343d2e"}, + {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6bae913cbb183cd34863905088ef26a17c75332bd6bdd451ee8bf158c987cf19"}, + {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:278cd430ba93a157ad1faf490fdd6051801085ffa31a27762133472555e56888"}, + {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e083e29b6db8e34a507cd678f89eab3ae5f307486ea6010c6473436d3769628d"}, + {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:150deb28d5302cfec89fc31ea4bce774df06f5c03d95519f7588ca6517a472d7"}, + {file = "aiohttp-3.10.7-cp310-cp310-win32.whl", hash = "sha256:e19337d6552af197ebb8c886daea0b938ae34eff776c1fa914ad433f6db3970f"}, + {file = "aiohttp-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:bff7ef30cb6fc186ea6dda9e19d6105b1c213e3a3f759b5a23c271c778027260"}, + {file = "aiohttp-3.10.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1378164474a3866f7684a95efede1bee4016cd104bc10bf885e492c4459b715a"}, + {file = "aiohttp-3.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:87d0e52b2905dbc1aeffcbf0611fa82e27874764332c11b984293a4b91cc8e9f"}, + {file = "aiohttp-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2783754bfcee0b13b8e55932b418cf8984c17099fd1b37341d4696447d0c328"}, + {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d26881d98274ef0dbd4f069f383e5e90eb6e42e957289db14c47186386832ce"}, + {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e152296b2c50417445eacdb2353d3c10e702f6593aa774277510fb7761304302"}, + {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf1cd9bfd598899396bdb8a4dc5234144a77e482e7489972b7956cf66e272872"}, + {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871c2bf68ecc55056e5e3b0ae5929a1149f41c4255bbf99b1f858005f63360d1"}, + {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd8a0a0ef895e4c3f1afd31c2a6f89d68a94baacdbe2eb9bf90ac54b997cf99b"}, + {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:99c11c5d632fa2222cc5805105841f6f3c40df116368fde40fbd71f8b14ea692"}, + {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8fbf91559400fe1a98d84af36f5a66aa59c359ac3cb113b17d304ced6a4601b4"}, + {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:73f151a1e21369a84d56b91a209590c23270c847463029fdcbda710516217644"}, + {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:80531f6f4fff5a1f7e495afbc4aff5c4230b605f26d56c40ecad27a269665608"}, + {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:164068b338c52dfe44f3490c70ef7b33c0e73d441c89f599ae2d93f7dcf3e395"}, + {file = "aiohttp-3.10.7-cp311-cp311-win32.whl", hash = "sha256:a84fe27904dbb43a236532d6d841d6132200b7bb53ba73d0300b0b586ceab6cc"}, + {file = "aiohttp-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:beda1abd7b23d489a5b66a46eba5a9e0db58e4ad91d68697409eeabda343fb9d"}, + {file = "aiohttp-3.10.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68120c12c98bfc0e024ef1279be5f41327a54a5094710adc970ecc9724b91871"}, + {file = "aiohttp-3.10.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e1a9b4026b6fe41adde784e308b0ad0d6a8b5cc9062f9c349125fd57149bc8a9"}, + {file = "aiohttp-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85d8a1d716516ef92c769eadb020600d27223899018ef8d07c09c117001cc7d5"}, + {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87652147515031dafc1b37c9c3c42fbe9e2697af6264ec26080a6fe603cc5196"}, + {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c6140d6cbf8eebbcf1528364ce0b26d0a95788111659cfc008fba3a12fc874f"}, + {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:342600665e74eea20b3286045ebeb0aa2f9cececf2eb0acc6f6817205b112b29"}, + {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b7794b3d23451e355b4a87959943125afff8dd31d8059651c2734de12f9e7f2"}, + {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d8d12d6a192f7b9f8a335cad8634a4f081d8319b75dd42257a1a3e557848d00"}, + {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b5d8c94fd23f41007799ec657e18661f9f8c5b566a1e4fe944e3514e505a6b49"}, + {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a1fe407bec2f14a3d79ec92aa767b930857a6782589ea87ac76fd8081dea3dab"}, + {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7ed4435dcf507ef2de5b4be64276933eb19c78e5c7d00ca376fcd9a67d0139a0"}, + {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c161f9e353f291d23069a8f67180fd52c76d72d4671f4f53602ea9ac29f47d50"}, + {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:caf083bf26b1e286ab1929dbd8d8cab6230160576a0ed5e3bfb3487bb19474c2"}, + {file = "aiohttp-3.10.7-cp312-cp312-win32.whl", hash = "sha256:4296dd120e7e9728625eef1091039aff1a454c7147913d47839876c94b202226"}, + {file = "aiohttp-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:10d19997f2f8d49d53b76163b71e263bb7b23f48041d0d4050a43445a0052c35"}, + {file = "aiohttp-3.10.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:582536d3d7f95a6d4d072d2326dd03eeb1549c1cc86d02c9bcec71899f4c66f2"}, + {file = "aiohttp-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:365eff442a47b13e0e12c37240a6f75940ebee0b7943af43c84d5b43643fc80c"}, + {file = "aiohttp-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2e0083e6f9f9cb0a0bedd694782e7fb8a54eb4de40e1743d9bb526f1c1eea88"}, + {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da5a03cbe746f182f7b61e119dde24d388cf77965fea320bc8aba61b75039d06"}, + {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b210484fccff00cafa9bd8abedea8749b6d975df8c8e21c82d92bb25403db85"}, + {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b75cfa1e5fc7c87fc5f9de7124bb039b898791bb87207d2107bed5e3509670f"}, + {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b4aa816cd3ab876f96ce8c6986648392137cbd6feddbf4189322515f34e1f6"}, + {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3915944c87c9bf488db4ca1ae6edca40b5bc77c4c2cf2f49b69886bc47b97db1"}, + {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cd658aeaa65fb99fcc3b93882bb33cbd600501d40473488aec163a981d7b05ee"}, + {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:aeea07c89a5a53463c70957feb85d4b846982c0f054b521fc44f52862e7871cf"}, + {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f8aaa0bc8e39352684982b378ba3f7e32e78a746da433aaeceb7e93d7fdf9ce3"}, + {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f25a79ac4ac0bd94cf283d3e86e6f3ec78fc39e2de6949b902c342148b7b5f6"}, + {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fc3538efae4e4df222a563559f8766234f49e845e8dbb2dd477eb8f3fd97242"}, + {file = "aiohttp-3.10.7-cp313-cp313-win32.whl", hash = "sha256:eea89c47ae8d592f7563f4355132fe844b5e2f8660292deacc292253bef291cd"}, + {file = "aiohttp-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:7ce1b54feaaf264e28a4474e13635d302a59aafb720b18c3c2885b8f35ce5040"}, + {file = "aiohttp-3.10.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7a372f9ea521741667cec2ef4a64419448030411af2e844dfa8dbbb8074baea6"}, + {file = "aiohttp-3.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:feff2170b23921a526f31d78c8f76bbb9cde825e78035286d8571ce0c81901ab"}, + {file = "aiohttp-3.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa42c4e78925a438a6f7df0d9b165d29cdc0a44fc5ce838d6c293a0161a2bd9a"}, + {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ced77f4dd0c4f0107ee96f8df162b984470ac9f94ef93dd44dba62838fd85cde"}, + {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13085c0129a906b001d87dd43e247155f6c76820d98147c079b746e8a0665b17"}, + {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92100555f86b314ed840ed61d937fc30ca39ad453c9aa9020414a3cce955d9b"}, + {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77bc82d7b10f377957ba8e99bb1b13d946e9e9038fe89ba0888ad0b12e60c9c0"}, + {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6052d92b47b8cf3736b1f01ac8f83cf02f188ef7542848055a5e227db0e16cb"}, + {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82fa5fb983922b03f2b08d1140550c68b50313305115639e19b13489c284c30c"}, + {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0246659d9a54a23a83f11842bdd58f335a1370aa66b376eeae16b7cf29009dde"}, + {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:befc2f0794bc4bbbb1f8d0e245d32ee13331205b58f54910789e9e78d2a6fbf5"}, + {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9cd67e5c84cb75a471b2e35f3fb0da52e6d359d1794d3465a87052fb240e64b5"}, + {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:af10344fb1ee195b2cd5840b61d8c8121b16d3b3baa2da5a86cf4001a7e5bd98"}, + {file = "aiohttp-3.10.7-cp38-cp38-win32.whl", hash = "sha256:81d3fc1b187656b6b465ed4ed4c9858f16ff2d9864da6225d80b8018abd7739b"}, + {file = "aiohttp-3.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:b6fb89edeadfd69df75f8cea97c3533805a9960cc56034ad296abe9b18771842"}, + {file = "aiohttp-3.10.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:318824b98a2bdf84e9a21d413737a3c4f27bbad0a9ce16141488f631dbffb9b2"}, + {file = "aiohttp-3.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63c9de949e05a5f729aecba6bf4b3d5403846caf546ea5020f8b9bf315bd8f12"}, + {file = "aiohttp-3.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0245e1a71f3503b01d2c304529779a70277ccc0fe9847b48d437363de6e4336e"}, + {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14dbfb208ffe3388e0770fd23bf9114cc933c10bb1dba35b538f3c9d685334d8"}, + {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f6b014f2176d2774b759b8e2951af4a613385ebcc08841cb5c0ca6d5dee74ee"}, + {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcfabf9338fed009fd9e11bf496a927ea67b1ce15d34847cb0a98aa6f042b989"}, + {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:171f1f5364a0ef5873480e6fddc3870ee37f1dfe216fa67507bbd4c91306f110"}, + {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87e243b1df27ff685ab08228b7a938c0530beb60ad3dea7554da1554d46c9ad4"}, + {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fee4d2246b091b7e252cd5bcdbd4362fa21c3cc6a445fef54de793731546ab24"}, + {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bfa8c8af8c92e3d6c1eff02cf5127f62c1e7564e7b0f1a9767035f81a2e6bb20"}, + {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f44f09b67a458400215d9efedb9cfb5e3256dbeb2cc2da68e4592b7b36bac0c9"}, + {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b5f8270946777d6971c27479cb6e7f54578be960928a8922cb59130e856d8484"}, + {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e8ccaa99871303323bd2cda120043039729497642da5c6f53e066b19f73d9df8"}, + {file = "aiohttp-3.10.7-cp39-cp39-win32.whl", hash = "sha256:ce7c12bfbb1579e81cdf2e7db4338f8c768da2493aa0db60a858a542d551563c"}, + {file = "aiohttp-3.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:189979c7e9d8f40236534760daf5b41d2026d5ebabdf913e771d9b6bfbc992af"}, + {file = "aiohttp-3.10.7.tar.gz", hash = "sha256:18c72a69ba20713f26fa40932cac17437b0c1d25edff2e27437a204c12275bd9"}, ] [package.dependencies] @@ -117,7 +117,7 @@ aiosignal = ">=1.1.2" attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -685,6 +685,31 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "immutabledict" +version = "4.2.0" +description = "Immutable wrapper around dictionaries (a fork of frozendict)" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "immutabledict-4.2.0-py3-none-any.whl", hash = "sha256:d728b2c2410d698d95e6200237feb50a695584d20289ad3379a439aa3d90baba"}, + {file = "immutabledict-4.2.0.tar.gz", hash = "sha256:e003fd81aad2377a5a758bf7e1086cf3b70b63e9a5cc2f46bce8d0a2b4727c5f"}, +] + +[[package]] +name = "importlab" +version = "0.8.1" +description = "A library to calculate python dependency graphs." +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "importlab-0.8.1-py2.py3-none-any.whl", hash = "sha256:124cfa00e8a34fefe8aac1a5e94f56c781b178c9eb61a1d3f60f7e03b77338d3"}, + {file = "importlab-0.8.1.tar.gz", hash = "sha256:b3893853b1f6eb027da509c3b40e6787e95dd66b4b66f1b3613aad77556e1465"}, +] + +[package.dependencies] +networkx = ">=2" + [[package]] name = "iniconfig" version = "2.0.0" @@ -696,6 +721,23 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "jiter" version = "0.5.0" @@ -793,24 +835,21 @@ files = [ [[package]] name = "langchain" -version = "0.3.0" +version = "0.3.1" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.0-py3-none-any.whl", hash = "sha256:59a75a6a1eb7bfd2a6bf0c7a5816409a8fdc9046187b07af287b23b9899617af"}, - {file = "langchain-0.3.0.tar.gz", hash = "sha256:a7c23892440bd1f5b9e029ff0dd709dd881ae927c4c0a3210ac64dba9bbf3f7f"}, + {file = "langchain-0.3.1-py3-none-any.whl", hash = "sha256:94e5ee7464d4366e4b158aa5704953c39701ea237b9ed4b200096d49e83bb3ae"}, + {file = "langchain-0.3.1.tar.gz", hash = "sha256:54d6e3abda2ec056875a231a418a4130ba7576e629e899067e499bfc847b7586"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" -langchain-core = ">=0.3.0,<0.4.0" +langchain-core = ">=0.3.6,<0.4.0" langchain-text-splitters = ">=0.3.0,<0.4.0" langsmith = ">=0.1.17,<0.2.0" -numpy = [ - {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, - {version = ">=1,<2", markers = "python_version < \"3.12\""}, -] +numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} pydantic = ">=2.7.4,<3.0.0" PyYAML = ">=5.3" requests = ">=2,<3" @@ -819,25 +858,22 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-community" -version = "0.3.0" +version = "0.3.1" description = "Community contributed LangChain integrations." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_community-0.3.0-py3-none-any.whl", hash = "sha256:40084f1f785f0fb56c8698ff059bbda8bd8c683cbdffa7902a0e04e72961496c"}, - {file = "langchain_community-0.3.0.tar.gz", hash = "sha256:1ee8a469ad66977f21b9d96bdcdd8549c5281c474f0f9cc13b932efd63a78105"}, + {file = "langchain_community-0.3.1-py3-none-any.whl", hash = "sha256:627eb26c16417764762ac47dd0d3005109f750f40242a88bb8f2958b798bcf90"}, + {file = "langchain_community-0.3.1.tar.gz", hash = "sha256:c964a70628f266a61647e58f2f0434db633d4287a729f100a81dd8b0654aec93"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.3.0,<0.4.0" -langchain-core = ">=0.3.0,<0.4.0" -langsmith = ">=0.1.112,<0.2.0" -numpy = [ - {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, - {version = ">=1,<2", markers = "python_version < \"3.12\""}, -] +langchain = ">=0.3.1,<0.4.0" +langchain-core = ">=0.3.6,<0.4.0" +langsmith = ">=0.1.125,<0.2.0" +numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} pydantic-settings = ">=2.4.0,<3.0.0" PyYAML = ">=5.3" requests = ">=2,<3" @@ -846,13 +882,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.3.5" +version = "0.3.6" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.5-py3-none-any.whl", hash = "sha256:2b5f86c1101beb013cb264c5722ad21931641493b4dc86e6f0575da698bf5cff"}, - {file = "langchain_core-0.3.5.tar.gz", hash = "sha256:67e5510559454f3f7a0526e7ef91fd0f12b45c0cdc70720e44909f62b5becf5a"}, + {file = "langchain_core-0.3.6-py3-none-any.whl", hash = "sha256:7bb3df0117bdc628b18b6c8748de72c6f537d745d47566053ce6650d5712281c"}, + {file = "langchain_core-0.3.6.tar.gz", hash = "sha256:eb190494a5483f1965f693bb2085edb523370b20fc52dc294d3bd425773cd076"}, ] [package.dependencies] @@ -860,8 +896,8 @@ jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.125,<0.2.0" packaging = ">=23.2,<25" pydantic = [ - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] PyYAML = ">=5.3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" @@ -883,24 +919,133 @@ langchain-core = ">=0.3.0,<0.4.0" [[package]] name = "langsmith" -version = "0.1.127" +version = "0.1.129" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.127-py3-none-any.whl", hash = "sha256:b4e8058d16ee0c814b16fae135c1e8817d1f43a38462d7f55e0eb1f87b9526aa"}, - {file = "langsmith-0.1.127.tar.gz", hash = "sha256:19c6f95d5558180c600455781e6faacc7798d0e1c54d6eb50ffb744d56f02bc9"}, + {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"}, + {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"}, ] [package.dependencies] httpx = ">=0.23.0,<1" orjson = ">=3.9.14,<4.0.0" pydantic = [ - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +[[package]] +name = "libcst" +version = "1.4.0" +description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.12 programs." +optional = false +python-versions = ">=3.9" +files = [ + {file = "libcst-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:279b54568ea1f25add50ea4ba3d76d4f5835500c82f24d54daae4c5095b986aa"}, + {file = "libcst-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3401dae41fe24565387a65baee3887e31a44e3e58066b0250bc3f3ccf85b1b5a"}, + {file = "libcst-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1989fa12d3cd79118ebd29ebe2a6976d23d509b1a4226bc3d66fcb7cb50bd5d"}, + {file = "libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:addc6d585141a7677591868886f6bda0577529401a59d210aa8112114340e129"}, + {file = "libcst-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17d71001cb25e94cfe8c3d997095741a8c4aa7a6d234c0f972bc42818c88dfaf"}, + {file = "libcst-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2d47de16d105e7dd5f4e01a428d9f4dc1e71efd74f79766daf54528ce37f23c3"}, + {file = "libcst-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6227562fc5c9c1efd15dfe90b0971ae254461b8b6b23c1b617139b6003de1c1"}, + {file = "libcst-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3399e6c95df89921511b44d8c5bf6a75bcbc2d51f1f6429763609ba005c10f6b"}, + {file = "libcst-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48601e3e590e2d6a7ab8c019cf3937c70511a78d778ab3333764531253acdb33"}, + {file = "libcst-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42797309bb725f0f000510d5463175ccd7155395f09b5e7723971b0007a976d"}, + {file = "libcst-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb4e42ea107a37bff7f9fdbee9532d39f9ea77b89caa5c5112b37057b12e0838"}, + {file = "libcst-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:9d0cc3c5a2a51fa7e1d579a828c0a2e46b2170024fd8b1a0691c8a52f3abb2d9"}, + {file = "libcst-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7ece51d935bc9bf60b528473d2e5cc67cbb88e2f8146297e40ee2c7d80be6f13"}, + {file = "libcst-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:81653dea1cdfa4c6520a7c5ffb95fa4d220cbd242e446c7a06d42d8636bfcbba"}, + {file = "libcst-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6abce0e66bba2babfadc20530fd3688f672d565674336595b4623cd800b91ef"}, + {file = "libcst-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da9d7dc83801aba3b8d911f82dc1a375db0d508318bad79d9fb245374afe068"}, + {file = "libcst-1.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c54aa66c86d8ece9c93156a2cf5ca512b0dce40142fe9e072c86af2bf892411"}, + {file = "libcst-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:62e2682ee1567b6a89c91853865372bf34f178bfd237853d84df2b87b446e654"}, + {file = "libcst-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8ecdba8934632b4dadacb666cd3816627a6ead831b806336972ccc4ba7ca0e9"}, + {file = "libcst-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8e54c777b8d27339b70f304d16fc8bc8674ef1bd34ed05ea874bf4921eb5a313"}, + {file = "libcst-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:061d6855ef30efe38b8a292b7e5d57c8e820e71fc9ec9846678b60a934b53bbb"}, + {file = "libcst-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb0abf627ee14903d05d0ad9b2c6865f1b21eb4081e2c7bea1033f85db2b8bae"}, + {file = "libcst-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d024f44059a853b4b852cfc04fec33e346659d851371e46fc8e7c19de24d3da9"}, + {file = "libcst-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3c6a8faab9da48c5b371557d0999b4ca51f4f2cbd37ee8c2c4df0ac01c781465"}, + {file = "libcst-1.4.0.tar.gz", hash = "sha256:449e0b16604f054fa7f27c3ffe86ea7ef6c409836fe68fe4e752a1894175db00"}, +] + +[package.dependencies] +pyyaml = ">=5.2" + +[package.extras] +dev = ["Sphinx (>=5.1.1)", "black (==23.12.1)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==2.1.0)", "flake8 (==7.0.0)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.4)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<1.6)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.6.0)", "usort (==1.0.8.post1)"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "marshmallow" version = "3.22.0" @@ -920,6 +1065,58 @@ dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.13)", "sphinx (==8.0.2)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] tests = ["pytest", "pytz", "simplejson"] +[[package]] +name = "msgspec" +version = "0.18.6" +description = "A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML." +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgspec-0.18.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77f30b0234eceeff0f651119b9821ce80949b4d667ad38f3bfed0d0ebf9d6d8f"}, + {file = "msgspec-0.18.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a76b60e501b3932782a9da039bd1cd552b7d8dec54ce38332b87136c64852dd"}, + {file = "msgspec-0.18.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06acbd6edf175bee0e36295d6b0302c6de3aaf61246b46f9549ca0041a9d7177"}, + {file = "msgspec-0.18.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40a4df891676d9c28a67c2cc39947c33de516335680d1316a89e8f7218660410"}, + {file = "msgspec-0.18.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a6896f4cd5b4b7d688018805520769a8446df911eb93b421c6c68155cdf9dd5a"}, + {file = "msgspec-0.18.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ac4dd63fd5309dd42a8c8c36c1563531069152be7819518be0a9d03be9788e4"}, + {file = "msgspec-0.18.6-cp310-cp310-win_amd64.whl", hash = "sha256:fda4c357145cf0b760000c4ad597e19b53adf01382b711f281720a10a0fe72b7"}, + {file = "msgspec-0.18.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e77e56ffe2701e83a96e35770c6adb655ffc074d530018d1b584a8e635b4f36f"}, + {file = "msgspec-0.18.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5351afb216b743df4b6b147691523697ff3a2fc5f3d54f771e91219f5c23aaa"}, + {file = "msgspec-0.18.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3232fabacef86fe8323cecbe99abbc5c02f7698e3f5f2e248e3480b66a3596b"}, + {file = "msgspec-0.18.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b524df6ea9998bbc99ea6ee4d0276a101bcc1aa8d14887bb823914d9f60d07"}, + {file = "msgspec-0.18.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37f67c1d81272131895bb20d388dd8d341390acd0e192a55ab02d4d6468b434c"}, + {file = "msgspec-0.18.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0feb7a03d971c1c0353de1a8fe30bb6579c2dc5ccf29b5f7c7ab01172010492"}, + {file = "msgspec-0.18.6-cp311-cp311-win_amd64.whl", hash = "sha256:41cf758d3f40428c235c0f27bc6f322d43063bc32da7b9643e3f805c21ed57b4"}, + {file = "msgspec-0.18.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d86f5071fe33e19500920333c11e2267a31942d18fed4d9de5bc2fbab267d28c"}, + {file = "msgspec-0.18.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce13981bfa06f5eb126a3a5a38b1976bddb49a36e4f46d8e6edecf33ccf11df1"}, + {file = "msgspec-0.18.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97dec6932ad5e3ee1e3c14718638ba333befc45e0661caa57033cd4cc489466"}, + {file = "msgspec-0.18.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad237100393f637b297926cae1868b0d500f764ccd2f0623a380e2bcfb2809ca"}, + {file = "msgspec-0.18.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db1d8626748fa5d29bbd15da58b2d73af25b10aa98abf85aab8028119188ed57"}, + {file = "msgspec-0.18.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d70cb3d00d9f4de14d0b31d38dfe60c88ae16f3182988246a9861259c6722af6"}, + {file = "msgspec-0.18.6-cp312-cp312-win_amd64.whl", hash = "sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0"}, + {file = "msgspec-0.18.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7d9faed6dfff654a9ca7d9b0068456517f63dbc3aa704a527f493b9200b210a"}, + {file = "msgspec-0.18.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da21f804c1a1471f26d32b5d9bc0480450ea77fbb8d9db431463ab64aaac2cf"}, + {file = "msgspec-0.18.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46eb2f6b22b0e61c137e65795b97dc515860bf6ec761d8fb65fdb62aa094ba61"}, + {file = "msgspec-0.18.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8355b55c80ac3e04885d72db515817d9fbb0def3bab936bba104e99ad22cf46"}, + {file = "msgspec-0.18.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9080eb12b8f59e177bd1eb5c21e24dd2ba2fa88a1dbc9a98e05ad7779b54c681"}, + {file = "msgspec-0.18.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc001cf39becf8d2dcd3f413a4797c55009b3a3cdbf78a8bf5a7ca8fdb76032c"}, + {file = "msgspec-0.18.6-cp38-cp38-win_amd64.whl", hash = "sha256:fac5834e14ac4da1fca373753e0c4ec9c8069d1fe5f534fa5208453b6065d5be"}, + {file = "msgspec-0.18.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:974d3520fcc6b824a6dedbdf2b411df31a73e6e7414301abac62e6b8d03791b4"}, + {file = "msgspec-0.18.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd62e5818731a66aaa8e9b0a1e5543dc979a46278da01e85c3c9a1a4f047ef7e"}, + {file = "msgspec-0.18.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7481355a1adcf1f08dedd9311193c674ffb8bf7b79314b4314752b89a2cf7f1c"}, + {file = "msgspec-0.18.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aa85198f8f154cf35d6f979998f6dadd3dc46a8a8c714632f53f5d65b315c07"}, + {file = "msgspec-0.18.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e24539b25c85c8f0597274f11061c102ad6b0c56af053373ba4629772b407be"}, + {file = "msgspec-0.18.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c61ee4d3be03ea9cd089f7c8e36158786cd06e51fbb62529276452bbf2d52ece"}, + {file = "msgspec-0.18.6-cp39-cp39-win_amd64.whl", hash = "sha256:b5c390b0b0b7da879520d4ae26044d74aeee5144f83087eb7842ba59c02bc090"}, + {file = "msgspec-0.18.6.tar.gz", hash = "sha256:a59fc3b4fcdb972d09138cb516dbde600c99d07c38fd9372a6ef500d2d031b4e"}, +] + +[package.extras] +dev = ["attrs", "coverage", "furo", "gcovr", "ipython", "msgpack", "mypy", "pre-commit", "pyright", "pytest", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "tomli", "tomli-w"] +doc = ["furo", "ipython", "sphinx", "sphinx-copybutton", "sphinx-design"] +test = ["attrs", "msgpack", "mypy", "pyright", "pytest", "pyyaml", "tomli", "tomli-w"] +toml = ["tomli", "tomli-w"] +yaml = ["pyyaml"] + [[package]] name = "multidict" version = "6.1.0" @@ -1032,6 +1229,51 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "networkx" +version = "3.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "ninja" +version = "1.11.1.1" +description = "Ninja is a small build system with a focus on speed" +optional = false +python-versions = "*" +files = [ + {file = "ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885"}, + {file = "ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a"}, + {file = "ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c"}, +] + +[package.extras] +test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "pytest (>=4.5.0)", "pytest-cov (>=2.7.1)", "pytest-runner (>=5.1)", "pytest-virtualenv (>=1.7.0)", "virtualenv (>=15.0.3)"] + [[package]] name = "numpy" version = "1.26.4" @@ -1095,13 +1337,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.47.1" +version = "1.50.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.47.1-py3-none-any.whl", hash = "sha256:34277583bf268bb2494bc03f48ac123788c5e2a914db1d5a23d5edc29d35c825"}, - {file = "openai-1.47.1.tar.gz", hash = "sha256:62c8f5f478f82ffafc93b33040f8bb16a45948306198bd0cba2da2ecd9cf7323"}, + {file = "openai-1.50.2-py3-none-any.whl", hash = "sha256:822dd2051baa3393d0d5406990611975dd6f533020dc9375a34d4fe67e8b75f7"}, + {file = "openai-1.50.2.tar.gz", hash = "sha256:3987ae027152fc8bea745d60b02c8f4c4a76e1b5c70e73565fa556db6f78c9e6"}, ] [package.dependencies] @@ -1240,6 +1482,17 @@ files = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] +[[package]] +name = "pycnite" +version = "2024.7.31" +description = "Python bytecode utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycnite-2024.7.31-py3-none-any.whl", hash = "sha256:9ff9c09d35056435b867e14ebf79626ca94b6017923a0bf9935377fa90d4cbb3"}, + {file = "pycnite-2024.7.31.tar.gz", hash = "sha256:5125f1c95aef4a23b9bec3b32fae76873dcd46324fa68e39c10fa852ecdea340"}, +] + [[package]] name = "pydantic" version = "2.9.2" @@ -1254,10 +1507,7 @@ files = [ [package.dependencies] annotated-types = ">=0.6.0" pydantic-core = "2.23.4" -typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, -] +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] email = ["email-validator (>=2.0.0)"] @@ -1384,6 +1634,25 @@ azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0 toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pydot" +version = "3.0.2" +description = "Python interface to Graphviz's Dot" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydot-3.0.2-py3-none-any.whl", hash = "sha256:99cedaa55d04abb0b2bc56d9981a6da781053dd5ac75c428e8dd53db53f90b14"}, + {file = "pydot-3.0.2.tar.gz", hash = "sha256:9180da540b51b3aa09fbf81140b3edfbe2315d778e8589a7d0a4a69c41332bae"}, +] + +[package.dependencies] +pyparsing = ">=3.0.9" + +[package.extras] +dev = ["chardet", "parameterized", "ruff"] +release = ["zest.releaser[recommended]"] +tests = ["chardet", "parameterized", "pytest", "pytest-cov", "pytest-xdist[psutil]", "ruff", "tox"] + [[package]] name = "pyowm" version = "3.3.0" @@ -1403,6 +1672,20 @@ requests = [ {version = "*", extras = ["socks"]}, ] +[[package]] +name = "pyparsing" +version = "3.1.4" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pysocks" version = "1.7.1" @@ -1453,6 +1736,46 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pytype" +version = "2024.9.13" +description = "Python type inferencer" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytype-2024.9.13-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:52c0005d220b27f9c933e4077de700c4e8171abce0c2af72f4c6263a85ff5bce"}, + {file = "pytype-2024.9.13-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d5dc847c2fe98bac044f956e2fc9f074f09704b64436522b81ede7dd5fa3653"}, + {file = "pytype-2024.9.13-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529f19141c6170d96a38909df430ca52e6904eaef851ad2690cf632f17d2c195"}, + {file = "pytype-2024.9.13-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:38f3eddf05d8530ef16d3d7c2da2556148b9975fc7c3405ac3073022e1a7434b"}, + {file = "pytype-2024.9.13-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b530eae5ab421a2dc9c4ef53f68629c5a622545150ae9702dbb811f56852a63"}, + {file = "pytype-2024.9.13-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb9eaaaf6c33e2716fdce1cf4166d3e5099372d8898b69ab7673225928096456"}, + {file = "pytype-2024.9.13-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:53b767d85f374c7483c8b2849dceb811a15fcb01520e245dd82bd7c0e2befefb"}, + {file = "pytype-2024.9.13-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:176a5bbc0cb0882918a0b48818b95df2c15811e3a8391da089ffc5b33fea7013"}, + {file = "pytype-2024.9.13-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bdaf1eaaf17a13741f67686c2d4c94c30279cd682c7e4cf535e41fc911b0e59"}, + {file = "pytype-2024.9.13-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:425011cc45fba8c83af796155049f9db89d11e8aedbfb21bc1c99408f4a2c4e3"}, + {file = "pytype-2024.9.13-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e500727967b843488c1978114778162ef00fee9be49dfa5b4758dcbbcc55dd9"}, + {file = "pytype-2024.9.13-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9b40beab6ef04fc260d86a8ef47b25d1b525dbc4cfbcb73151fd74210c176df"}, + {file = "pytype-2024.9.13-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:b5fdc24b60938ee846dfbdf08b5ea96e934e7d69c34eb1f8fb7707083d177f0e"}, + {file = "pytype-2024.9.13-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8dcfd509118c2d7e0787e72832b45e30037af1c29dfcb733a7e8014f58337287"}, + {file = "pytype-2024.9.13-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9df731062dc18518a46135c4825ad966e1a275ffc0723dd62f9771b420889da0"}, + {file = "pytype-2024.9.13.tar.gz", hash = "sha256:941046ca0f1c43b79162bb51836fef0ba6608012d99f6833148c249f22216f26"}, +] + +[package.dependencies] +attrs = ">=21.4.0" +immutabledict = ">=4.1.0" +importlab = ">=0.8" +jinja2 = ">=3.1.2" +libcst = ">=1.0.1" +msgspec = ">=0.18.6" +networkx = "<3.2" +ninja = ">=1.10.0.post2" +pycnite = ">=2024.07.31" +pydot = ">=1.4.2" +tabulate = ">=0.8.10" +toml = ">=0.10.2" +typing-extensions = ">=4.3.0" + [[package]] name = "pyyaml" version = "6.0.2" @@ -1555,6 +1878,33 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "ruff" +version = "0.6.8" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"}, + {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"}, + {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"}, + {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"}, + {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"}, + {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"}, + {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, +] + [[package]] name = "six" version = "1.16.0" @@ -1692,6 +2042,20 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "tenacity" version = "8.5.0" @@ -1852,103 +2216,103 @@ requests = ">=2.0.0,<3.0.0" [[package]] name = "yarl" -version = "1.12.1" +version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64c5b0f2b937fe40d0967516eee5504b23cb247b8b7ffeba7213a467d9646fdc"}, - {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e430ac432f969ef21770645743611c1618362309e3ad7cab45acd1ad1a540ff"}, - {file = "yarl-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e26e64f42bce5ddf9002092b2c37b13071c2e6413d5c05f9fa9de58ed2f7749"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0103c52f8dfe5d573c856322149ddcd6d28f51b4d4a3ee5c4b3c1b0a05c3d034"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b63465b53baeaf2122a337d4ab57d6bbdd09fcadceb17a974cfa8a0300ad9c67"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17d4dc4ff47893a06737b8788ed2ba2f5ac4e8bb40281c8603920f7d011d5bdd"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b54949267bd5704324397efe9fbb6aa306466dee067550964e994d309db5f1"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10b690cd78cbaca2f96a7462f303fdd2b596d3978b49892e4b05a7567c591572"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c85ab016e96a975afbdb9d49ca90f3bca9920ef27c64300843fe91c3d59d8d20"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c1caa5763d1770216596e0a71b5567f27aac28c95992110212c108ec74589a48"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:595bbcdbfc4a9c6989d7489dca8510cba053ff46b16c84ffd95ac8e90711d419"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e64f0421892a207d3780903085c1b04efeb53b16803b23d947de5a7261b71355"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:319c206e83e46ec2421b25b300c8482b6fe8a018baca246be308c736d9dab267"}, - {file = "yarl-1.12.1-cp310-cp310-win32.whl", hash = "sha256:da045bd1147d12bd43fb032296640a7cc17a7f2eaba67495988362e99db24fd2"}, - {file = "yarl-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:aebbd47df77190ada603157f0b3670d578c110c31746ecc5875c394fdcc59a99"}, - {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:28389a68981676bf74e2e199fe42f35d1aa27a9c98e3a03e6f58d2d3d054afe1"}, - {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f736f54565f8dd7e3ab664fef2bc461d7593a389a7f28d4904af8d55a91bd55f"}, - {file = "yarl-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dee0496d5f1a8f57f0f28a16f81a2033fc057a2cf9cd710742d11828f8c80e2"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8981a94a27ac520a398302afb74ae2c0be1c3d2d215c75c582186a006c9e7b0"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff54340fc1129e8e181827e2234af3ff659b4f17d9bbe77f43bc19e6577fadec"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54c8cee662b5f8c30ad7eedfc26123f845f007798e4ff1001d9528fe959fd23c"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e97a29b37830ba1262d8dfd48ddb5b28ad4d3ebecc5d93a9c7591d98641ec737"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c89894cc6f6ddd993813e79244b36b215c14f65f9e4f1660b1f2ba9e5594b95"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:712ba8722c0699daf186de089ddc4677651eb9875ed7447b2ad50697522cbdd9"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6e9a9f50892153bad5046c2a6df153224aa6f0573a5a8ab44fc54a1e886f6e21"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1d4017e78fb22bc797c089b746230ad78ecd3cdb215bc0bd61cb72b5867da57e"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f494c01b28645c431239863cb17af8b8d15b93b0d697a0320d5dd34cd9d7c2fa"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de4544b1fb29cf14870c4e2b8a897c0242449f5dcebd3e0366aa0aa3cf58a23a"}, - {file = "yarl-1.12.1-cp311-cp311-win32.whl", hash = "sha256:7564525a4673fde53dee7d4c307a961c0951918f0b8c7f09b2c9e02067cf6504"}, - {file = "yarl-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:f23bb1a7a6e8e8b612a164fdd08e683bcc16c76f928d6dbb7bdbee2374fbfee6"}, - {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3e2aff8b822ab0e0bdbed9f50494b3a35629c4b9488ae391659973a37a9f53f"}, - {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22dda2799c8d39041d731e02bf7690f0ef34f1691d9ac9dfcb98dd1e94c8b058"}, - {file = "yarl-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18c2a7757561f05439c243f517dbbb174cadfae3a72dee4ae7c693f5b336570f"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:835010cc17d0020e7931d39e487d72c8e01c98e669b6896a8b8c9aa8ca69a949"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2254fe137c4a360b0a13173a56444f756252c9283ba4d267ca8e9081cd140ea"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a071d2c3d39b4104f94fc08ab349e9b19b951ad4b8e3b6d7ea92d6ef7ccaf8"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73a183042ae0918c82ce2df38c3db2409b0eeae88e3afdfc80fb67471a95b33b"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326b8a079a9afcac0575971e56dabdf7abb2ea89a893e6949b77adfeb058b50e"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:126309c0f52a2219b3d1048aca00766429a1346596b186d51d9fa5d2070b7b13"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ba1c779b45a399cc25f511c681016626f69e51e45b9d350d7581998722825af9"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:af1107299cef049ad00a93df4809517be432283a0847bcae48343ebe5ea340dc"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:20d817c0893191b2ab0ba30b45b77761e8dfec30a029b7c7063055ca71157f84"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d4f818f6371970d6a5d1e42878389bbfb69dcde631e4bbac5ec1cb11158565ca"}, - {file = "yarl-1.12.1-cp312-cp312-win32.whl", hash = "sha256:0ac33d22b2604b020569a82d5f8a03ba637ba42cc1adf31f616af70baf81710b"}, - {file = "yarl-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd24996e12e1ba7c397c44be75ca299da14cde34d74bc5508cce233676cc68d0"}, - {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dea360778e0668a7ad25d7727d03364de8a45bfd5d808f81253516b9f2217765"}, - {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1f50a37aeeb5179d293465e522fd686080928c4d89e0ff215e1f963405ec4def"}, - {file = "yarl-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0274b1b7a9c9c32b7bf250583e673ff99fb9fccb389215841e2652d9982de740"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4f3ab9eb8ab2d585ece959c48d234f7b39ac0ca1954a34d8b8e58a52064bdb3"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d31dd0245d88cf7239e96e8f2a99f815b06e458a5854150f8e6f0e61618d41b"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a96198d5d26f40557d986c1253bfe0e02d18c9d9b93cf389daf1a3c9f7c755fa"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddae504cfb556fe220efae65e35be63cd11e3c314b202723fc2119ce19f0ca2e"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bce00f3b1f7f644faae89677ca68645ed5365f1c7f874fdd5ebf730a69640d38"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eee5ff934b0c9f4537ff9596169d56cab1890918004791a7a06b879b3ba2a7ef"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4ea99e64b2ad2635e0f0597b63f5ea6c374791ff2fa81cdd4bad8ed9f047f56f"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c667b383529520b8dd6bd496fc318678320cb2a6062fdfe6d3618da6b8790f6"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d920401941cb898ef089422e889759dd403309eb370d0e54f1bdf6ca07fef603"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:501a1576716032cc6d48c7c47bcdc42d682273415a8f2908e7e72cb4625801f3"}, - {file = "yarl-1.12.1-cp313-cp313-win32.whl", hash = "sha256:24416bb5e221e29ddf8aac5b97e94e635ca2c5be44a1617ad6fe32556df44294"}, - {file = "yarl-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:71af3766bb46738d12cc288d9b8de7ef6f79c31fd62757e2b8a505fe3680b27f"}, - {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c924deab8105f86980983eced740433fb7554a7f66db73991affa4eda99d5402"}, - {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5fb475a4cdde582c9528bb412b98f899680492daaba318231e96f1a0a1bb0d53"}, - {file = "yarl-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:36ee0115b9edca904153a66bb74a9ff1ce38caff015de94eadfb9ba8e6ecd317"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2631c9d7386bd2d4ce24ecc6ebf9ae90b3efd713d588d90504eaa77fec4dba01"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2376d8cf506dffd0e5f2391025ae8675b09711016656590cb03b55894161fcfa"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24197ba3114cc85ddd4091e19b2ddc62650f2e4a899e51b074dfd52d56cf8c72"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfdf419bf5d3644f94cd7052954fc233522f5a1b371fc0b00219ebd9c14d5798"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8112f640a4f7e7bf59f7cabf0d47a29b8977528c521d73a64d5cc9e99e48a174"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:607d12f0901f6419a8adceb139847c42c83864b85371f58270e42753f9780fa6"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:664380c7ed524a280b6a2d5d9126389c3e96cd6e88986cdb42ca72baa27421d6"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d0a5e87bc48d76dfcfc16295201e9812d5f33d55b4a0b7cad1025b92bf8b91b"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:eff6bac402719c14e17efe845d6b98593c56c843aca6def72080fbede755fd1f"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:22839d1d1eab9e4b427828a88a22beb86f67c14d8ff81175505f1cc8493f3500"}, - {file = "yarl-1.12.1-cp38-cp38-win32.whl", hash = "sha256:717f185086bb9d817d4537dd18d5df5d657598cd00e6fc22e4d54d84de266c1d"}, - {file = "yarl-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:71978ba778948760cff528235c951ea0ef7a4f9c84ac5a49975f8540f76c3f73"}, - {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ffc046ebddccb3c4cac72c1a3e1bc343492336f3ca86d24672e90ccc5e788a"}, - {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10954b233d4df5cc3137ffa5ced97f8894152df817e5d149bf05a0ef2ab8134"}, - {file = "yarl-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2e912b282466444023610e4498e3795c10e7cfd641744524876239fcf01d538d"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af871f70cfd5b528bd322c65793b5fd5659858cdfaa35fbe563fb99b667ed1f"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3e4e1f7b08d1ec6b685ccd3e2d762219c550164fbf524498532e39f9413436e"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a7ee79183f0b17dcede8b6723e7da2ded529cf159a878214be9a5d3098f5b1e"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96c8ff1e1dd680e38af0887927cab407a4e51d84a5f02ae3d6eb87233036c763"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e9905fc2dc1319e4c39837b906a024cf71b1261cc66b0cd89678f779c0c61f5"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:01549468858b87d36f967c97d02e6e54106f444aeb947ed76f8f71f85ed07cec"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96b34830bd6825ca0220bf005ea99ac83eb9ce51301ddb882dcf613ae6cd95fb"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2aee7594d2c2221c717a8e394bbed4740029df4c0211ceb0f04815686e99c795"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:15871130439ad10abb25a4631120d60391aa762b85fcab971411e556247210a0"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:838dde2cb570cfbb4cab8a876a0974e8b90973ea40b3ac27a79b8a74c8a2db15"}, - {file = "yarl-1.12.1-cp39-cp39-win32.whl", hash = "sha256:eacbcf30efaca7dc5cb264228ffecdb95fdb1e715b1ec937c0ce6b734161e0c8"}, - {file = "yarl-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:76a59d1b63de859398bc7764c860a769499511463c1232155061fe0147f13e01"}, - {file = "yarl-1.12.1-py3-none-any.whl", hash = "sha256:dc3192a81ecd5ff954cecd690327badd5a84d00b877e1573f7c9097ce13e5bfb"}, - {file = "yarl-1.12.1.tar.gz", hash = "sha256:5b860055199aec8d6fe4dcee3c5196ce506ca198a50aab0059ffd26e8e815828"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -1957,5 +2321,5 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" -python-versions = "^3.11" -content-hash = "b95dc395968a39b158126bb9075994b854a809e348cfb3ace44b2244e59a7c4b" +python-versions = ">=3.12,<3.13" +content-hash = "fb83027193b7fc52de26ae1132f39b58898e639003467e9498b0c0598ed00667" diff --git a/integrations-service/pyproject.toml b/integrations-service/pyproject.toml index cb3d19290..c477ac3a6 100644 --- a/integrations-service/pyproject.toml +++ b/integrations-service/pyproject.toml @@ -5,7 +5,7 @@ description = "Integration service for various AI tools" authors = ["Your Name "] [tool.poetry.dependencies] -python = "^3.11" +python = ">=3.12,<3.13" langchain-community = "^0.3.0" fastapi = "^0.115.0" uvicorn = "^0.30.6" @@ -20,7 +20,7 @@ pyowm = "^3.3.0" [tool.poe.tasks] format = "ruff format" -lint = "ruff check --select I --fix --unsafe-fixes agents_api/**/*.py migrations/**/*.py tests/**/*.py" +lint = "ruff check --select I --fix --unsafe-fixes integrations/**/*.py" typecheck = "pytype --config pytype.toml" check = [ "lint", @@ -30,6 +30,8 @@ check = [ [tool.poetry.dev-dependencies] pytest = "^6.2.5" +pytype = "^2024.9.13" +ruff = "^0.6.8" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/integrations-service/pytype.toml b/integrations-service/pytype.toml index 2371cea58..70b578106 100644 --- a/integrations-service/pytype.toml +++ b/integrations-service/pytype.toml @@ -28,7 +28,7 @@ platform = 'linux' pythonpath = '.' # Python version (major.minor) of the target code. -python_version = '3.11' +python_version = '3.12' # Don't allow None to match bool. This flag is temporary and will be removed # once this behavior is enabled by default. diff --git a/memory-store/Dockerfile b/memory-store/Dockerfile index af3cb6e42..852a5f687 100644 --- a/memory-store/Dockerfile +++ b/memory-store/Dockerfile @@ -1,3 +1,5 @@ +# syntax=docker/dockerfile:1 +# check=error=true # We need to build the cozo binary first from the repo # https://github.com/cozodb/cozo # Then copy the binary to the ./bin directory diff --git a/sdks/node-sdk b/sdks/node-sdk new file mode 160000 index 000000000..8f190fd7c --- /dev/null +++ b/sdks/node-sdk @@ -0,0 +1 @@ +Subproject commit 8f190fd7c36f32aeb112ead95ba40254c8cbbc46 diff --git a/sdks/python-sdk b/sdks/python-sdk new file mode 160000 index 000000000..872b15062 --- /dev/null +++ b/sdks/python-sdk @@ -0,0 +1 @@ +Subproject commit 872b150629d33e563740095125a2276c1be023e8 From 55efe4f8b0fdfc655e6207cbca5dd84eab0a937a Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sat, 28 Sep 2024 12:21:30 -0400 Subject: [PATCH 009/113] fix: Minor fix to docker bake github actions (#529) - **GitHub Actions**: - Add `docker-bake-on-pr.yml` for baking images on pull requests. - Rename `dev-push-to-hub.yml` to `bake-push-to-hub.yml` and `main-push-to-hub.yml` to `latest-push-to-hub.yml`. - Update `bake-push-to-hub.yml` and `latest-push-to-hub.yml` to use `docker/bake-action@v5` and remove branch name and git sha setting steps. --- ...v-push-to-hub.yml => bake-push-to-hub.yml} | 17 ++++---- .github/workflows/docker-bake-on-pr.yml | 39 +++++++++++++++++++ ...push-to-hub.yml => latest-push-to-hub.yml} | 12 ++---- 3 files changed, 50 insertions(+), 18 deletions(-) rename .github/workflows/{dev-push-to-hub.yml => bake-push-to-hub.yml} (64%) create mode 100644 .github/workflows/docker-bake-on-pr.yml rename .github/workflows/{main-push-to-hub.yml => latest-push-to-hub.yml} (76%) diff --git a/.github/workflows/dev-push-to-hub.yml b/.github/workflows/bake-push-to-hub.yml similarity index 64% rename from .github/workflows/dev-push-to-hub.yml rename to .github/workflows/bake-push-to-hub.yml index f92a8bc2c..eb6dd9168 100644 --- a/.github/workflows/dev-push-to-hub.yml +++ b/.github/workflows/bake-push-to-hub.yml @@ -5,6 +5,8 @@ on: push: branches: - "dev" + tags: + - "v*" jobs: Bake-Push-Images: @@ -13,12 +15,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set branch name - id: variables - run: | - echo "branch_name=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')" >> $GITHUB_OUTPUT - echo "git_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -29,7 +25,7 @@ jobs: password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - name: Build and push agent images - uses: docker/bake-action@v3 + uses: docker/bake-action@v5 with: files: | ./docker-bake.hcl @@ -38,9 +34,10 @@ jobs: set: | *.cache-from=type=gha *.cache-to=type=gha,mode=max - *.args.TAG=${{ steps.variables.outputs.branch_name }} - *.args.GIT_SHA=${{ steps.variables.outputs.git_sha }} + env: + TAG: ${{ github.ref_name }} + GIT_SHA: ${{ github.sha }} concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/dev' }} + cancel-in-progress: true diff --git a/.github/workflows/docker-bake-on-pr.yml b/.github/workflows/docker-bake-on-pr.yml new file mode 100644 index 000000000..2e00f0929 --- /dev/null +++ b/.github/workflows/docker-bake-on-pr.yml @@ -0,0 +1,39 @@ +name: Bake images on PR +run-name: ${{ github.actor }} is baking images + +on: + pull_request: + +jobs: + Bake-Images: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: julepai + password: "${{ secrets.DOCKER_HUB_PASSWORD }}" + + - name: Bake images + uses: docker/bake-action@v5 + with: + files: | + ./docker-bake.hcl + targets: agents-api + push: false + set: | + *.cache-from=type=gha + *.cache-to=type=gha,mode=max + env: + TAG: pr-run-${{ github.run_number }}-${{ github.run_attempt }} + GIT_SHA: ${{ github.sha }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} diff --git a/.github/workflows/main-push-to-hub.yml b/.github/workflows/latest-push-to-hub.yml similarity index 76% rename from .github/workflows/main-push-to-hub.yml rename to .github/workflows/latest-push-to-hub.yml index 8b0fffe89..3853a8faa 100644 --- a/.github/workflows/main-push-to-hub.yml +++ b/.github/workflows/latest-push-to-hub.yml @@ -13,11 +13,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set git sha - id: variables - run: | - echo "git_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -28,7 +23,7 @@ jobs: password: "${{ secrets.DOCKER_HUB_PASSWORD }}" - name: Build and push agent images - uses: docker/bake-action@v3 + uses: docker/bake-action@v5 with: files: | ./docker-bake.hcl @@ -37,8 +32,9 @@ jobs: set: | *.cache-from=type=gha *.cache-to=type=gha,mode=max - *.args.TAG=latest - *.args.GIT_SHA=${{ steps.variables.outputs.git_sha }} + env: + TAG: latest + GIT_SHA: ${{ github.sha }} concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 0d6acda66de6b210140fb5f3c23cd3e417f5748b Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sat, 28 Sep 2024 14:48:28 -0400 Subject: [PATCH 010/113] feat: Add changelog from release notes (#530) Update GitHub Actions workflow to generate changelog from release notes on release event. - **Workflow Changes**: - Renames workflow from `Changelog CI` to `Changelog on release` in `.github/workflows/changelog-ci.yml`. - Changes trigger from `pull_request` to `release` with type `published`. - **Actions**: - Updates `actions/checkout` from `v2` to `v4` with `fetch-depth: 0` and `ref: dev`. - Replaces `saadmk11/changelog-ci@v1.1.2` with `rhysd/changelog-from-release/action@v3` to generate changelog from release notes. --- .github/workflows/changelog-ci.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/changelog-ci.yml b/.github/workflows/changelog-ci.yml index 2a1ab6c30..ff99828a3 100644 --- a/.github/workflows/changelog-ci.yml +++ b/.github/workflows/changelog-ci.yml @@ -1,21 +1,24 @@ -name: Changelog CI +name: Changelog on release -# TODO: This is currently not working. Need to fix it on: - pull_request: - types: [ opened, synchronize ] + release: + types: [published] jobs: - build: + changelog: runs-on: ubuntu-latest steps: # Checks-out your repository - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: dev - - name: Run Changelog CI - uses: saadmk11/changelog-ci@v1.1.2 + # Generate changelog from release notes + - uses: rhysd/changelog-from-release/action@v3 with: - changelog_filename: CHANGELOG.md - # config_file: changelog-ci-config.json + file: CHANGELOG.md github_token: ${{ secrets.GITHUB_TOKEN }} + pull_request: true + \ No newline at end of file From 5e40d9ae42c95a604a3c33694eceadf923ffe534 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 29 Sep 2024 00:23:04 +0530 Subject: [PATCH 011/113] Update changelog for v0.4.0 (#531) Co-authored-by: creatorrr --- CHANGELOG.md | 261 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 252 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4e401ad5..0f0fee2b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,258 @@ -# TODO: Update changelog -# SCRUM-29 + +# [v0.4.0](https://github.com/julep-ai/julep/releases/tag/v0.4.0) - 28 Sep 2024 -# Changelog +## What's Changed +* feat(agents-api): Add cozo migrations for tasks schema by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/349 +* feat(agents-api): updated openapi schema for tasks spec by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/350 +* Update README.md by [@ijindal1](https://github.com/ijindal1) in https://github.com/julep-ai/julep/pull/384 +* Update README.md by [@ijindal1](https://github.com/ijindal1) in https://github.com/julep-ai/julep/pull/385 +* feat(agents-api): cozo queries for tasks by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/352 +* fix(sdks/ts): Fixed bugs, updated sdk by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/390 +* feat(agents-api): Toy implementation of Tasks by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/391 +* feat(agents-api): Adaptive context (via recursive summarization) by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/306 +* chore(deps-dev): bump braces from 3.0.2 to 3.0.3 in /sdks/ts in the npm_and_yarn group across 1 directory by [@dependabot](https://github.com/dependabot) in https://github.com/julep-ai/julep/pull/394 +* v/0.3.9 by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/395 +* feat(tasks): Enable all fields of ExecutionInput by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/396 +* feat(tasks): Update execution transition relation by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/397 +* fix: Handle prompt too big error by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/401 +* feat(sdks/ts): Add adaptive context options to the SDK by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/404 +* feat(sdks/ts): Add runtime validations for TS SDK by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/425 +* refactor(agents-api): Rework routers to split routes into individual files by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/422 +* support for `Hermes-2-Theta-Llama-3-8B` as default OSS model by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/424 +* fix: Add exception handler for litellm API error by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/432 +* fix(openapi): Fix mistakes in openapi.yaml file by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/434 +* fix: Apply various small fixes to task execution logic by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/436 +* Codegen for all new typespec types by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/435 +* feat(agents-api): New chat context query and model by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/437 +* feat(agents-api): Add get_transition query by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/438 +* chore: Disable all the routes except of tasks and agents by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/439 +* fix(agents-api): Fix execution input query by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/440 +* f/wait for input step by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/441 +* feat(agents-api): Implement doc* models by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/442 +* Reimplement tests for queries and operations by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/443 +* feat(agents-api): Hybrid docs search by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/444 +* feat(agents-api): Add temporal workflow lookup relation and queries by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/446 +* feat: new routes for docs, users, search by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/445 +* feat(agents-api): Add litellm proxy to docker compose by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/448 +* fix(agents-api): Fixed tests for models and queries by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/449 +* creatorrr/f add missing tests by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/450 +* feat(agents-api): Add route tests by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/451 +* Add tests for docs routes by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/452 +* feat(agents-api): Preliminary implementation of session.chat by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/453 +* feat(agents-api): Make chat route tests pass by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/454 +* feat(agents-api): Add some workflow tests by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/456 +* fix(agents-api): Minor fix to tests by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/457 +* f/task tests by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/458 +* feat(agents-api): ALL TESTS PASS!! :D by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/459 +* feat: Add test for evaluate step by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/460 +* fix(agents-api): Fix typespec for foreach step and regenerate by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/461 +* fix(agents-api): Fix the typespec bug and regenerate by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/462 +* x/fix codec by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/463 +* feat(agents-api): Add YAML support by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/464 +* refactor(agents-api): Minor refactors to typespec types by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/465 +* fix(agents-api): Fix map reduce step and activity by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/466 +* fix(agents-api): Make the sample work by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/467 +* Dev tasks by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/447 +* fix: Build cozo-bin docker image directly from cozo repo by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/469 +* feat(memory-store): Add backup cronjob by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/470 +* fix: Fix deployment docker compose and move temporal into separate service by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/471 +* fix(agents-api): Fix prompt step by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/472 +* fix(agents-api): Fix task execution logic by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/473 +* Fix create agent tool by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/474 +* fix(agents-api): Fix bug in task-execution workflow and uuid-int-list-to-str fn by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/476 +* fix(agents-api): Fix prompt render, codec and task execution by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/478 +* fix(agents-api): Fix more render issues, execution logic by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/479 +* x/fix task execution by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/482 +* text-embeddings-inference-cpu temp fix for Apple Silicon CPUs by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/480 +* fix(agents-api): Fix task execution logical errors by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/483 +* feat(agents-api): Transitions stream SSE endpoint by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/485 +* feat(agents-api): Set/get steps based on workflow state by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/484 +* Scrum 22 [FIX] agents api list agent tools is returning an empty list by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/487 +* fix(agents-api,typespec): Fix chat/entry typespec models to include tool_calls by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/489 +* fix: Change log-step to a jinja template rather than a simpleeval expression by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/488 +* feat(agents-api): Add parallelism option to map-reduce step by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/490 +* fix: Fix import by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/494 +* misc fixes by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/495 +* build(deps): Bump the npm_and_yarn group across 2 directories with 2 updates by [@dependabot](https://github.com/dependabot) in https://github.com/julep-ai/julep/pull/493 +* hotfix: Apply a temp hotfix for sessions.chat by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/497 +* hotfix(agents-api): Fix session.situation not being rendered by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/499 +* feat: Add agent tools to completion data before sending to litellm in prompt by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/498 +* dev -> main by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/502 +* fix(agents-api): fix create_agent and create_or_update_agent query by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/503 +* fix(llm-proxy): Update docker image to main-v1.46.2 by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/504 +* Add custom api key support to chat endpoint by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/507 +* fix(agents-api): Fix doc recall using search by text by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/506 +* docs: update api.md by [@eltociear](https://github.com/eltociear) in https://github.com/julep-ai/julep/pull/508 +* fix: Get PostgreSQL settings via env vars by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/509 +* main <- dev by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/511 +* Vertex AI client by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/510 +* fix: Retry worker on runtime errors by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/512 +* dev -> main by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/514 +* Implement ToolCallStep & Fix transition after PromptStep by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/513 +* doc: Update README.md with announcement update by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/517 +* feat: Add basic support for integration tools to ToolStep by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/519 +* feat(integration-service): Add integrations service by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/520 +* feat(agents-api,integrations): Working integrations for tool-call step by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/521 +* fix(agents-api): Fix wait for input step by [@HamadaSalhab](https://github.com/HamadaSalhab) in https://github.com/julep-ai/julep/pull/522 +* feat(agents-api): Add support for reading setup args from metadata and Upgrade to python 3.12 by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/525 +* feat: Add docker bake builder by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/528 +* fix: Minor fix to docker bake github actions by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/529 +* feat: Add changelog from release notes by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/530 -All notable changes to this project will be documented in this file. +## New Contributors +* [@ijindal1](https://github.com/ijindal1) made their first contribution in https://github.com/julep-ai/julep/pull/384 +* [@HamadaSalhab](https://github.com/HamadaSalhab) made their first contribution in https://github.com/julep-ai/julep/pull/474 +* [@eltociear](https://github.com/eltociear) made their first contribution in https://github.com/julep-ai/julep/pull/508 -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +**Full Changelog**: https://github.com/julep-ai/julep/compare/v0.3.4...v0.4.0 -## [Unreleased] +[Changes][v0.4.0] -### Added -- v0.2 agents platform + +# [v0.3.4](https://github.com/julep-ai/julep/releases/tag/v0.3.4) - 31 May 2024 + +## What's Changed +* feat: Implement filtering by metadata by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/337 +* session.chat working without specifying user by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/338 +* feat: Cache generated responses by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/336 +* Add docs-text-embeddings-inference service to deploy/docker-compose.yml by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/339 +* add missing ports and volumes in deploy/docker-compose by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/341 +* feat: Add launching entry point by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/334 +* feat: Add an explicit platform declaration to the services in deploy/docker-compose.yml by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/342 +* [wip] feat(agents-api,sdks): multimodal support by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/343 +* fix(sdks/ts): Fix codegen issue by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/374 +* Version 0.3.4 by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/375 +* fix: Convert messages content to JSON by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/376 +* fix: Convert IDs to UUID before passing to query executing functions by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/377 +* fix(agents-api): fix fn calling and local deployment by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/378 +* feat: Improve typehints by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/379 + + +**Full Changelog**: https://github.com/julep-ai/julep/compare/v0.3.3...v0.3.4 + +[Changes][v0.3.4] + + + +# [v0.3.3](https://github.com/julep-ai/julep/releases/tag/v0.3.3) - 17 May 2024 + +## What's Changed +* fix: Add summarizer source type to the query by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/301 +* fix: Get summarization model form env var and create a corresponsing … by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/302 +* feat: Make docs content be splited by users by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/303 +* feat: litellm for multiple model support by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/304 +* use VALID_MODELS to support JULEP_MODELS by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/308 +* Agent creation fixes by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/309 +* feat: Add new agents docs embbeddings functionality by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/305 +* Fix docs search by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/311 +* Make embeddings asynchronous using temporal by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/332 +* feat: Add doc IDs to the session chat response by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/331 +* chore: Update SDKs by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/333 + + +**Full Changelog**: https://github.com/julep-ai/julep/compare/v0.3.2...v0.3.3 + +[Changes][v0.3.3] + + + +# [v0.3.2](https://github.com/julep-ai/julep/releases/tag/v0.3.2) - 27 Apr 2024 + +- Initial github release + +## What's Changed +* fix(python-sdk): temporarily remove async types by [@philipbalbas](https://github.com/philipbalbas) in https://github.com/julep-ai/julep/pull/196 +* fix: Set empty string as a default value for function description by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/195 +* feat: exception handling for api keys and models by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/197 +* feat: Create and push docker images to hub by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/198 +* fix: Sessions update by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/201 +* fix: Sessions update by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/202 +* feat(sdk): update tools by [@philipbalbas](https://github.com/philipbalbas) in https://github.com/julep-ai/julep/pull/206 +* fix: Merge agent and user metadata by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/204 +* fix: Display agent instructions by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/205 +* fix: Disable model-serving by default by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/207 +* fix: patch fix for function calling by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/203 +* remove model surgery notebooks by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/208 +* feat: Create github action changelog-ci.yml by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/209 +* Sweep: Add a detailed README.md in the memory-store/ directory by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/214 +* fix: Display agent instructions by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/216 +* Sweep: Add a detailed README.md in the examples/ directory by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/215 +* fix: Set metadata to an empty dict by default by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/217 +* Sweep: Update the docstrings and comments in sdks/ts/src/env.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/235 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/memory.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/236 +* Sweep: Update the docstrings and comments in sdks/ts/src/utils/invariant.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/237 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/agent.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/238 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/tool.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/239 +* Sweep: Update the docstrings and comments in sdks/ts/src/utils/isValidUuid4.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/240 +* Sweep: Update the docstrings and comments in sdks/ts/src/client.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/241 +* Sweep: Update the docstrings and comments in sdks/ts/src/utils/requestConstructor.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/242 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/base.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/243 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/user.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/244 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/session.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/245 +* Sweep: Update the docstrings and comments in sdks/ts/src/utils/openaiPatch.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/246 +* Sweep: Update the docstrings and comments in sdks/ts/src/managers/doc.ts to fix any issues and mismatch between the comment and associated code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/247 +* doc(sdks/ts): Generate documentation for the typescript SDK by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/248 +* Sweep: Update the docstrings and comments in sdks/python/julep/env.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/262 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/memory.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/271 +* Sweep: Update the docstrings and comments in sdks/python/julep/utils/openai_patch.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/270 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/base.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/263 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/types.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/269 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/utils.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/268 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/tool.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/267 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/doc.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/266 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/session.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/265 +* Sweep: Update the docstrings and comments in sdks/python/julep/managers/agent.py to fix any issues and mismatch between the comments present and surrounding code by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/264 +* refactor(agents-api): Add decorator to wrap cozo queries inside and execute by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/273 +* feat: update python sdk docs by [@philipbalbas](https://github.com/philipbalbas) in https://github.com/julep-ai/julep/pull/272 +* fix: Set default values for function description and parameters by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/274 +* feat(openapi): Update spec to include role=function + render_templates by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/276 +* docs: update SUMMARY.md by [@philipbalbas](https://github.com/philipbalbas) in https://github.com/julep-ai/julep/pull/281 +* chore(deps): bump fastapi from 0.109.2 to 0.110.1 in /agents-api in the pip group across 1 directory by [@dependabot](https://github.com/dependabot) in https://github.com/julep-ai/julep/pull/280 +* chore(deps): bump idna from 3.6 to 3.7 in /memory-store/backup by [@dependabot](https://github.com/dependabot) in https://github.com/julep-ai/julep/pull/278 +* chore(deps): bump follow-redirects from 1.15.5 to 1.15.6 in /sdks/ts by [@dependabot](https://github.com/dependabot) in https://github.com/julep-ai/julep/pull/277 +* F/update julep docs by [@philipbalbas](https://github.com/philipbalbas) in https://github.com/julep-ai/julep/pull/282 +* fix: Fix queries calls by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/283 +* Sweep: Create CONTRIBUTING.md based on README.md in the root / directory by [@sweep-ai](https://github.com/sweep-ai) in https://github.com/julep-ai/julep/pull/285 +* feat: added docker-compose.yml and .env.example for self-hosting by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/286 +* fix: Set default value for user's about text by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/287 +* fix: Update sessions with given IDs only by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/290 +* F/readme update by [@alt-glitch](https://github.com/alt-glitch) in https://github.com/julep-ai/julep/pull/291 +* feat: Truncate messages by [@whiterabbit1983](https://github.com/whiterabbit1983) in https://github.com/julep-ai/julep/pull/294 +* x/fix python sdk by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/296 +* feat(agents-api): Allow single instructions str for agents by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/297 +* fix: Session.user_id should be optional by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/298 +* feat(agents-api): Add jinja templates support by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/300 + +## New Contributors +* [@dependabot](https://github.com/dependabot) made their first contribution in https://github.com/julep-ai/julep/pull/280 + +**Full Changelog**: https://github.com/julep-ai/julep/commits/v0.3.2 + +[Changes][v0.3.2] + + + +# [v0.3.0](https://github.com/julep-ai/julep/releases/tag/v0.3.0) - 27 Apr 2024 + + + +[Changes][v0.3.0] + + + +# [v0.2.12](https://github.com/julep-ai/julep/releases/tag/v0.2.12) - 27 Apr 2024 + + + +[Changes][v0.2.12] + + +[v0.4.0]: https://github.com/julep-ai/julep/compare/v0.3.4...v0.4.0 +[v0.3.4]: https://github.com/julep-ai/julep/compare/v0.3.3...v0.3.4 +[v0.3.3]: https://github.com/julep-ai/julep/compare/v0.3.2...v0.3.3 +[v0.3.2]: https://github.com/julep-ai/julep/compare/v0.3.0...v0.3.2 +[v0.3.0]: https://github.com/julep-ai/julep/compare/v0.2.12...v0.3.0 +[v0.2.12]: https://github.com/julep-ai/julep/tree/v0.2.12 + + From f79249b3ae3be9be585b5559ac0e28373bef1e8d Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sat, 28 Sep 2024 14:57:36 -0400 Subject: [PATCH 012/113] fix: Bake on release as well (#532) Enhance workflows to bake images on release and generate changelogs from release notes. - **Workflows**: - Update `.github/workflows/bake-push-to-hub.yml` to trigger on `release` events in addition to `push` to `dev` and tags `v*`. - Update `.github/workflows/changelog-ci.yml` to trigger on `release` events and generate changelog from release notes using `rhysd/changelog-from-release/action@v3`. --- .github/workflows/bake-push-to-hub.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/bake-push-to-hub.yml b/.github/workflows/bake-push-to-hub.yml index eb6dd9168..9a5be0c90 100644 --- a/.github/workflows/bake-push-to-hub.yml +++ b/.github/workflows/bake-push-to-hub.yml @@ -7,7 +7,9 @@ on: - "dev" tags: - "v*" - + release: + types: [published] + jobs: Bake-Push-Images: runs-on: ubuntu-latest From b75998610dced8020330ce8648bf602f42cd9226 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 30 Sep 2024 14:38:45 -0400 Subject: [PATCH 013/113] doc: v1.0 docs (#527) --- .github/CODE_OF_CONDUCT.md | 40 + .github/SUPPORT.md | 62 + .gitmodules | 6 + README-CN.md | 703 +- README.md | 812 +- docs/SUMMARY.md | 68 +- docs/agent-studio/agents-playground.md | 5 - docs/agent-studio/playground.md | 65 - docs/api-reference/{agents-api => }/README.md | 0 .../{agents-api => }/agents-api-1.md | 0 .../{agents-api => }/agents-api-2.md | 0 .../{agents-api => }/agents-api-3.md | 0 .../{agents-api => }/agents-api-4.md | 0 .../{agents-api => }/agents-api-5.md | 0 .../{agents-api => }/agents-api-6.md | 0 .../{agents-api => }/agents-api.md | 0 docs/api-reference/model-api.md | 8 - .../model-api/generation-parameters.md | 69 - docs/api-reference/model-api/model-api-1.md | 13 - docs/api-reference/model-api/model-api.md | 13 - docs/explanation/chat_features.md | 68 + docs/explanation/context_overflow.md | 20 + docs/explanation/core_concepts.md | 46 + docs/explanation/default_system_template.md | 71 + docs/explanation/execution_state_machine.md | 73 + docs/explanation/metadata_precedence.md | 23 + docs/explanation/multi_agent_sessions.md | 44 + docs/explanation/task_workflows.md | 95 + docs/explanation/tool_integration.md | 67 + docs/faqs/README.md | 10 - docs/faqs/agent-prototyping.md | 13 - docs/getting-started/python-setup.md | 309 - ...etrieval-augmented-generation-rag-agent.md | 165 - docs/guides/image-+-text-with-gpt-4o.md | 95 - docs/guides/quickstart.md | 275 - docs/guides/self-hosting.md | 89 - docs/guides/use-julep-with-composio.md | 128 - docs/how-to-guides/customizing_tasks.md | 99 + docs/how-to-guides/handling_executions.md | 72 + docs/how-to-guides/managing_users.md | 54 + docs/how-to-guides/using_chat_features.md | 97 + docs/introduction/core-concepts.md | 3 - docs/introduction/getting_started.md | 32 + docs/introduction/overview.md | 14 + docs/js-sdk-docs/.nojekyll | 1 - docs/js-sdk-docs/README.md | 3 - docs/js-sdk-docs/classes/api.ApiError.md | 228 - .../classes/api.BaseHttpRequest.md | 75 - docs/js-sdk-docs/classes/api.CancelError.md | 189 - .../classes/api.CancelablePromise.md | 299 - .../js-sdk-docs/classes/api.DefaultService.md | 1194 --- .../api_JulepApiClient.JulepApiClient.md | 57 - .../classes/managers_agent.AgentsManager.md | 204 - .../classes/managers_base.BaseManager.md | 68 - .../classes/managers_doc.DocsManager.md | 209 - .../managers_memory.MemoriesManager.md | 99 - .../managers_session.SessionsManager.md | 278 - .../classes/managers_tool.ToolsManager.md | 166 - .../classes/managers_user.UsersManager.md | 197 - ...ls_requestConstructor.CustomHttpRequest.md | 93 - .../managers_session.CreateSessionPayload.md | 87 - docs/js-sdk-docs/modules.md | 22 - docs/js-sdk-docs/modules/api.md | 2623 ------- .../js-sdk-docs/modules/api_JulepApiClient.md | 9 - docs/js-sdk-docs/modules/managers_agent.md | 9 - docs/js-sdk-docs/modules/managers_base.md | 9 - docs/js-sdk-docs/modules/managers_doc.md | 9 - docs/js-sdk-docs/modules/managers_memory.md | 9 - docs/js-sdk-docs/modules/managers_session.md | 13 - docs/js-sdk-docs/modules/managers_tool.md | 9 - docs/js-sdk-docs/modules/managers_user.md | 9 - docs/js-sdk-docs/modules/utils_invariant.md | 32 - .../js-sdk-docs/modules/utils_isValidUuid4.md | 36 - docs/js-sdk-docs/modules/utils_openaiPatch.md | 33 - .../modules/utils_requestConstructor.md | 9 - docs/js-sdk-docs/modules/utils_xor.md | 30 - docs/python-sdk-docs/README.md | 211 - docs/python-sdk-docs/julep/api/client.md | 6554 ----------------- .../julep/api/core/api_error.md | 21 - .../julep/api/core/client_wrapper.md | 105 - .../julep/api/core/datetime_utils.md | 24 - docs/python-sdk-docs/julep/api/core/file.md | 36 - .../julep/api/core/http_client.md | 264 - docs/python-sdk-docs/julep/api/core/index.md | 21 - .../julep/api/core/jsonable_encoder.md | 35 - .../julep/api/core/pydantic_utilities.md | 6 - .../julep/api/core/query_encoder.md | 46 - .../julep/api/core/remove_none_from_dict.md | 18 - .../julep/api/core/request_options.md | 33 - docs/python-sdk-docs/julep/api/environment.md | 18 - docs/python-sdk-docs/julep/api/index.md | 15 - ...agent_docs_route_list_request_direction.md | 6 - .../agent_docs_route_list_request_sort_by.md | 6 - .../types/agent_docs_route_list_response.md | 38 - ...gent_tools_route_list_request_direction.md | 6 - .../agent_tools_route_list_request_sort_by.md | 6 - .../types/agent_tools_route_list_response.md | 38 - .../julep/api/types/agents_agent.md | 38 - .../api/types/agents_agent_instructions.md | 6 - .../api/types/agents_create_agent_request.md | 40 - ...gents_create_agent_request_instructions.md | 6 - .../agents_create_or_update_agent_request.md | 38 - ...s_docs_search_route_search_request_body.md | 6 - ...agents_patch_agent_request_instructions.md | 6 - .../agents_route_list_request_direction.md | 6 - .../agents_route_list_request_sort_by.md | 6 - .../api/types/agents_route_list_response.md | 38 - .../api/types/agents_update_agent_request.md | 40 - ...gents_update_agent_request_instructions.md | 6 - .../julep/api/types/chat_base_chat_output.md | 38 - .../api/types/chat_base_chat_response.md | 38 - .../api/types/chat_base_token_log_prob.md | 38 - .../julep/api/types/chat_chat_input_data.md | 38 - .../types/chat_chat_input_data_tool_choice.md | 6 - .../julep/api/types/chat_chat_output_chunk.md | 40 - .../julep/api/types/chat_chat_settings.md | 38 - .../api/types/chat_chunk_chat_response.md | 38 - .../julep/api/types/chat_competion_usage.md | 40 - .../types/chat_completion_response_format.md | 38 - .../chat_completion_response_format_type.md | 6 - .../api/types/chat_default_chat_settings.md | 40 - .../julep/api/types/chat_finish_reason.md | 6 - .../julep/api/types/chat_log_prob_response.md | 38 - .../api/types/chat_message_chat_response.md | 38 - ...chat_message_chat_response_choices_item.md | 6 - .../api/types/chat_multiple_chat_output.md | 40 - .../julep/api/types/chat_open_ai_settings.md | 38 - .../api/types/chat_route_generate_response.md | 6 - .../api/types/chat_single_chat_output.md | 40 - .../julep/api/types/chat_token_log_prob.md | 38 - .../types/common_identifier_safe_unicode.md | 6 - .../julep/api/types/common_limit.md | 6 - .../julep/api/types/common_logit_bias.md | 6 - .../julep/api/types/common_offset.md | 6 - .../julep/api/types/common_py_expression.md | 6 - .../types/common_resource_created_response.md | 38 - .../types/common_resource_deleted_response.md | 38 - .../types/common_resource_updated_response.md | 38 - .../julep/api/types/common_tool_ref.md | 6 - .../julep/api/types/common_uuid.md | 6 - .../types/common_valid_python_identifier.md | 6 - .../api/types/docs_base_doc_search_request.md | 38 - .../api/types/docs_create_doc_request.md | 40 - .../types/docs_create_doc_request_content.md | 6 - .../julep/api/types/docs_doc.md | 38 - .../julep/api/types/docs_doc_content.md | 6 - .../julep/api/types/docs_doc_owner.md | 38 - .../julep/api/types/docs_doc_owner_role.md | 6 - .../julep/api/types/docs_doc_reference.md | 38 - .../api/types/docs_doc_search_response.md | 38 - .../api/types/docs_embed_query_request.md | 38 - .../types/docs_embed_query_request_text.md | 6 - .../api/types/docs_embed_query_response.md | 38 - .../types/docs_hybrid_doc_search_request.md | 38 - .../julep/api/types/docs_snippet.md | 38 - .../docs_text_only_doc_search_request.md | 38 - .../types/docs_vector_doc_search_request.md | 38 - .../julep/api/types/entries_base_entry.md | 38 - .../api/types/entries_base_entry_content.md | 6 - .../types/entries_base_entry_content_item.md | 6 - .../entries_base_entry_content_item_item.md | 71 - .../api/types/entries_base_entry_source.md | 6 - .../entries_chat_ml_image_content_part.md | 38 - .../julep/api/types/entries_chat_ml_role.md | 6 - .../entries_chat_ml_text_content_part.md | 38 - .../julep/api/types/entries_entry.md | 38 - .../julep/api/types/entries_history.md | 38 - .../julep/api/types/entries_image_detail.md | 6 - .../julep/api/types/entries_image_url.md | 38 - .../types/entries_input_chat_ml_message.md | 38 - .../entries_input_chat_ml_message_content.md | 6 - ...ries_input_chat_ml_message_content_item.md | 71 - .../julep/api/types/entries_relation.md | 38 - ...ransitions_route_list_request_direction.md | 6 - ..._transitions_route_list_request_sort_by.md | 6 - ...ecution_transitions_route_list_response.md | 38 - ...itions_route_list_response_results_item.md | 38 - .../julep/api/types/executions_execution.md | 38 - .../api/types/executions_execution_status.md | 6 - .../executions_resume_execution_request.md | 38 - .../executions_stop_execution_request.md | 38 - .../julep/api/types/executions_transition.md | 38 - .../api/types/executions_transition_target.md | 38 - .../api/types/executions_transition_type.md | 6 - .../executions_update_execution_request.md | 71 - docs/python-sdk-docs/julep/api/types/index.md | 186 - .../julep/api/types/jobs_job_state.md | 6 - .../julep/api/types/jobs_job_status.md | 38 - .../types/sessions_context_overflow_type.md | 6 - ...ssions_create_or_update_session_request.md | 38 - .../types/sessions_create_session_request.md | 40 - ...sessions_multi_agent_multi_user_session.md | 38 - .../sessions_multi_agent_no_user_session.md | 38 - ...essions_multi_agent_single_user_session.md | 38 - .../sessions_route_list_request_direction.md | 6 - .../sessions_route_list_request_sort_by.md | 6 - .../api/types/sessions_route_list_response.md | 38 - .../julep/api/types/sessions_session.md | 260 - ...essions_single_agent_multi_user_session.md | 38 - .../sessions_single_agent_no_user_session.md | 38 - ...ssions_single_agent_single_user_session.md | 38 - ...executions_route_list_request_direction.md | 6 - ...k_executions_route_list_request_sort_by.md | 6 - .../task_executions_route_list_response.md | 38 - .../api/types/tasks_base_workflow_step.md | 566 -- .../julep/api/types/tasks_case_then.md | 38 - .../julep/api/types/tasks_case_then_then.md | 460 -- .../api/types/tasks_create_task_request.md | 40 - .../tasks_create_task_request_main_item.md | 599 -- .../julep/api/types/tasks_embed_step.md | 38 - .../api/types/tasks_error_workflow_step.md | 38 - .../julep/api/types/tasks_evaluate_step.md | 38 - .../julep/api/types/tasks_foreach_do.md | 38 - .../julep/api/types/tasks_foreach_do_do.md | 460 -- .../julep/api/types/tasks_foreach_step.md | 38 - .../julep/api/types/tasks_get_step.md | 38 - .../api/types/tasks_if_else_workflow_step.md | 38 - .../types/tasks_if_else_workflow_step_else.md | 460 -- .../types/tasks_if_else_workflow_step_then.md | 460 -- .../julep/api/types/tasks_log_step.md | 38 - .../julep/api/types/tasks_map_over.md | 38 - .../julep/api/types/tasks_map_reduce_step.md | 38 - .../julep/api/types/tasks_parallel_step.md | 38 - .../tasks_parallel_step_parallel_item.md | 434 -- .../tasks_patch_task_request_main_item.md | 599 -- .../julep/api/types/tasks_prompt_step.md | 38 - .../api/types/tasks_prompt_step_prompt.md | 6 - .../julep/api/types/tasks_return_step.md | 38 - .../tasks_route_list_request_direction.md | 6 - .../types/tasks_route_list_request_sort_by.md | 6 - .../api/types/tasks_route_list_response.md | 38 - .../julep/api/types/tasks_search_step.md | 38 - .../api/types/tasks_search_step_search.md | 6 - .../julep/api/types/tasks_set_key.md | 38 - .../julep/api/types/tasks_set_step.md | 38 - .../julep/api/types/tasks_set_step_set.md | 6 - .../julep/api/types/tasks_sleep_for.md | 38 - .../julep/api/types/tasks_sleep_step.md | 38 - .../julep/api/types/tasks_switch_step.md | 38 - .../julep/api/types/tasks_task.md | 40 - .../julep/api/types/tasks_task_main_item.md | 599 -- .../julep/api/types/tasks_task_tool.md | 38 - .../julep/api/types/tasks_tool_call_step.md | 38 - .../tasks_update_task_request_main_item.md | 599 -- .../api/types/tasks_wait_for_input_step.md | 38 - .../julep/api/types/tasks_yield_step.md | 38 - .../api/types/tools_chosen_function_call.md | 38 - .../julep/api/types/tools_chosen_tool_call.md | 77 - .../api/types/tools_create_tool_request.md | 40 - .../api/types/tools_function_call_option.md | 38 - .../julep/api/types/tools_function_def.md | 40 - .../julep/api/types/tools_function_tool.md | 38 - .../api/types/tools_named_function_choice.md | 38 - .../api/types/tools_named_tool_choice.md | 75 - .../julep/api/types/tools_tool.md | 75 - .../julep/api/types/tools_tool_response.md | 38 - .../julep/api/types/tools_tool_type.md | 6 - .../user_docs_route_list_request_direction.md | 6 - .../user_docs_route_list_request_sort_by.md | 6 - .../types/user_docs_route_list_response.md | 38 - ...r_docs_search_route_search_request_body.md | 6 - .../users_create_or_update_user_request.md | 38 - .../api/types/users_create_user_request.md | 40 - .../users_route_list_request_direction.md | 6 - .../types/users_route_list_request_sort_by.md | 6 - .../api/types/users_route_list_response.md | 38 - .../julep/api/types/users_user.md | 38 - docs/python-sdk-docs/julep/client.md | 112 - docs/python-sdk-docs/julep/env.md | 14 - docs/python-sdk-docs/julep/index.md | 16 - docs/python-sdk-docs/julep/managers/agent.md | 748 -- docs/python-sdk-docs/julep/managers/base.md | 27 - docs/python-sdk-docs/julep/managers/doc.md | 501 -- docs/python-sdk-docs/julep/managers/index.md | 20 - docs/python-sdk-docs/julep/managers/memory.md | 219 - .../python-sdk-docs/julep/managers/session.md | 1226 --- docs/python-sdk-docs/julep/managers/task.md | 608 -- docs/python-sdk-docs/julep/managers/tool.md | 521 -- docs/python-sdk-docs/julep/managers/types.md | 22 - docs/python-sdk-docs/julep/managers/user.md | 621 -- docs/python-sdk-docs/julep/utils/index.md | 12 - .../julep/utils/openai_patch.md | 93 - .../api_endpoints/agent_endpoints.md | 74 + docs/reference/api_endpoints/doc_endpoints.md | 36 + .../api_endpoints/session_endpoints.md | 84 + .../reference/api_endpoints/tool_endpoints.md | 55 + .../reference/api_endpoints/user_endpoints.md | 57 + docs/s1-model/capabilities/README.md | 364 - docs/s1-model/capabilities/capabilities.md | 90 - docs/s1-model/context-sections.md | 180 - docs/s1-model/overview.md | 121 - docs/s1-model/tutorial.md | 5 - docs/tutorials/creating_your_first_agent.md | 48 + docs/tutorials/integrating_tools.md | 58 + docs/tutorials/managing_sessions.md | 51 + example.py | 107 + example.ts | 117 + image.png | Bin 426141 -> 0 bytes v0.3_README-CN.md | 230 - v0.3_README.md | 228 - 300 files changed, 2897 insertions(+), 31703 deletions(-) create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/SUPPORT.md delete mode 100644 docs/agent-studio/agents-playground.md delete mode 100644 docs/agent-studio/playground.md rename docs/api-reference/{agents-api => }/README.md (100%) rename docs/api-reference/{agents-api => }/agents-api-1.md (100%) rename docs/api-reference/{agents-api => }/agents-api-2.md (100%) rename docs/api-reference/{agents-api => }/agents-api-3.md (100%) rename docs/api-reference/{agents-api => }/agents-api-4.md (100%) rename docs/api-reference/{agents-api => }/agents-api-5.md (100%) rename docs/api-reference/{agents-api => }/agents-api-6.md (100%) rename docs/api-reference/{agents-api => }/agents-api.md (100%) delete mode 100644 docs/api-reference/model-api.md delete mode 100644 docs/api-reference/model-api/generation-parameters.md delete mode 100644 docs/api-reference/model-api/model-api-1.md delete mode 100644 docs/api-reference/model-api/model-api.md create mode 100644 docs/explanation/chat_features.md create mode 100644 docs/explanation/context_overflow.md create mode 100644 docs/explanation/core_concepts.md create mode 100644 docs/explanation/default_system_template.md create mode 100644 docs/explanation/execution_state_machine.md create mode 100644 docs/explanation/metadata_precedence.md create mode 100644 docs/explanation/multi_agent_sessions.md create mode 100644 docs/explanation/task_workflows.md create mode 100644 docs/explanation/tool_integration.md delete mode 100644 docs/faqs/README.md delete mode 100644 docs/faqs/agent-prototyping.md delete mode 100644 docs/getting-started/python-setup.md delete mode 100644 docs/guides/build-a-retrieval-augmented-generation-rag-agent.md delete mode 100644 docs/guides/image-+-text-with-gpt-4o.md delete mode 100644 docs/guides/quickstart.md delete mode 100644 docs/guides/self-hosting.md delete mode 100644 docs/guides/use-julep-with-composio.md create mode 100644 docs/how-to-guides/customizing_tasks.md create mode 100644 docs/how-to-guides/handling_executions.md create mode 100644 docs/how-to-guides/managing_users.md create mode 100644 docs/how-to-guides/using_chat_features.md delete mode 100644 docs/introduction/core-concepts.md create mode 100644 docs/introduction/getting_started.md create mode 100644 docs/introduction/overview.md delete mode 100644 docs/js-sdk-docs/.nojekyll delete mode 100644 docs/js-sdk-docs/README.md delete mode 100644 docs/js-sdk-docs/classes/api.ApiError.md delete mode 100644 docs/js-sdk-docs/classes/api.BaseHttpRequest.md delete mode 100644 docs/js-sdk-docs/classes/api.CancelError.md delete mode 100644 docs/js-sdk-docs/classes/api.CancelablePromise.md delete mode 100644 docs/js-sdk-docs/classes/api.DefaultService.md delete mode 100644 docs/js-sdk-docs/classes/api_JulepApiClient.JulepApiClient.md delete mode 100644 docs/js-sdk-docs/classes/managers_agent.AgentsManager.md delete mode 100644 docs/js-sdk-docs/classes/managers_base.BaseManager.md delete mode 100644 docs/js-sdk-docs/classes/managers_doc.DocsManager.md delete mode 100644 docs/js-sdk-docs/classes/managers_memory.MemoriesManager.md delete mode 100644 docs/js-sdk-docs/classes/managers_session.SessionsManager.md delete mode 100644 docs/js-sdk-docs/classes/managers_tool.ToolsManager.md delete mode 100644 docs/js-sdk-docs/classes/managers_user.UsersManager.md delete mode 100644 docs/js-sdk-docs/classes/utils_requestConstructor.CustomHttpRequest.md delete mode 100644 docs/js-sdk-docs/interfaces/managers_session.CreateSessionPayload.md delete mode 100644 docs/js-sdk-docs/modules.md delete mode 100644 docs/js-sdk-docs/modules/api.md delete mode 100644 docs/js-sdk-docs/modules/api_JulepApiClient.md delete mode 100644 docs/js-sdk-docs/modules/managers_agent.md delete mode 100644 docs/js-sdk-docs/modules/managers_base.md delete mode 100644 docs/js-sdk-docs/modules/managers_doc.md delete mode 100644 docs/js-sdk-docs/modules/managers_memory.md delete mode 100644 docs/js-sdk-docs/modules/managers_session.md delete mode 100644 docs/js-sdk-docs/modules/managers_tool.md delete mode 100644 docs/js-sdk-docs/modules/managers_user.md delete mode 100644 docs/js-sdk-docs/modules/utils_invariant.md delete mode 100644 docs/js-sdk-docs/modules/utils_isValidUuid4.md delete mode 100644 docs/js-sdk-docs/modules/utils_openaiPatch.md delete mode 100644 docs/js-sdk-docs/modules/utils_requestConstructor.md delete mode 100644 docs/js-sdk-docs/modules/utils_xor.md delete mode 100644 docs/python-sdk-docs/README.md delete mode 100644 docs/python-sdk-docs/julep/api/client.md delete mode 100644 docs/python-sdk-docs/julep/api/core/api_error.md delete mode 100644 docs/python-sdk-docs/julep/api/core/client_wrapper.md delete mode 100644 docs/python-sdk-docs/julep/api/core/datetime_utils.md delete mode 100644 docs/python-sdk-docs/julep/api/core/file.md delete mode 100644 docs/python-sdk-docs/julep/api/core/http_client.md delete mode 100644 docs/python-sdk-docs/julep/api/core/index.md delete mode 100644 docs/python-sdk-docs/julep/api/core/jsonable_encoder.md delete mode 100644 docs/python-sdk-docs/julep/api/core/pydantic_utilities.md delete mode 100644 docs/python-sdk-docs/julep/api/core/query_encoder.md delete mode 100644 docs/python-sdk-docs/julep/api/core/remove_none_from_dict.md delete mode 100644 docs/python-sdk-docs/julep/api/core/request_options.md delete mode 100644 docs/python-sdk-docs/julep/api/environment.md delete mode 100644 docs/python-sdk-docs/julep/api/index.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agent_docs_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agent_tools_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_agent.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_agent_instructions.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_create_agent_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_create_agent_request_instructions.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_create_or_update_agent_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_docs_search_route_search_request_body.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_patch_agent_request_instructions.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_update_agent_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/agents_update_agent_request_instructions.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_base_chat_output.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_base_chat_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_base_token_log_prob.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_chat_input_data.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_chat_input_data_tool_choice.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_chat_output_chunk.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_chat_settings.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_chunk_chat_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_competion_usage.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_completion_response_format.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_completion_response_format_type.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_default_chat_settings.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_finish_reason.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_log_prob_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_message_chat_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_message_chat_response_choices_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_multiple_chat_output.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_open_ai_settings.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_route_generate_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_single_chat_output.md delete mode 100644 docs/python-sdk-docs/julep/api/types/chat_token_log_prob.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_identifier_safe_unicode.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_limit.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_logit_bias.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_offset.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_py_expression.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_resource_created_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_resource_deleted_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_resource_updated_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_tool_ref.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_uuid.md delete mode 100644 docs/python-sdk-docs/julep/api/types/common_valid_python_identifier.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_base_doc_search_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_create_doc_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_create_doc_request_content.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_doc.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_doc_content.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_doc_owner.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_doc_owner_role.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_doc_reference.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_doc_search_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_embed_query_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_embed_query_request_text.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_embed_query_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_hybrid_doc_search_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_snippet.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_text_only_doc_search_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/docs_vector_doc_search_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_base_entry.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_base_entry_content.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_base_entry_source.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_chat_ml_image_content_part.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_chat_ml_role.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_chat_ml_text_content_part.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_entry.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_history.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_image_detail.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_image_url.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/entries_relation.md delete mode 100644 docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response_results_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_execution.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_execution_status.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_resume_execution_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_stop_execution_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_transition.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_transition_target.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_transition_type.md delete mode 100644 docs/python-sdk-docs/julep/api/types/executions_update_execution_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/index.md delete mode 100644 docs/python-sdk-docs/julep/api/types/jobs_job_state.md delete mode 100644 docs/python-sdk-docs/julep/api/types/jobs_job_status.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_context_overflow_type.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_create_or_update_session_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_create_session_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_multi_agent_multi_user_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_multi_agent_no_user_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_multi_agent_single_user_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_single_agent_multi_user_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_single_agent_no_user_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/sessions_single_agent_single_user_session.md delete mode 100644 docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/task_executions_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_base_workflow_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_case_then.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_case_then_then.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_create_task_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_create_task_request_main_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_embed_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_error_workflow_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_evaluate_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_foreach_do.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_foreach_do_do.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_foreach_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_get_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_else.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_then.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_log_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_map_over.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_map_reduce_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_parallel_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_parallel_step_parallel_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_patch_task_request_main_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_prompt_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_prompt_step_prompt.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_return_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_search_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_search_step_search.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_set_key.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_set_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_set_step_set.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_sleep_for.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_sleep_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_switch_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_task.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_task_main_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_task_tool.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_tool_call_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_update_task_request_main_item.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_wait_for_input_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tasks_yield_step.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_chosen_function_call.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_chosen_tool_call.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_create_tool_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_function_call_option.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_function_def.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_function_tool.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_named_function_choice.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_named_tool_choice.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_tool.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_tool_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/tools_tool_type.md delete mode 100644 docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/user_docs_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/user_docs_search_route_search_request_body.md delete mode 100644 docs/python-sdk-docs/julep/api/types/users_create_or_update_user_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/users_create_user_request.md delete mode 100644 docs/python-sdk-docs/julep/api/types/users_route_list_request_direction.md delete mode 100644 docs/python-sdk-docs/julep/api/types/users_route_list_request_sort_by.md delete mode 100644 docs/python-sdk-docs/julep/api/types/users_route_list_response.md delete mode 100644 docs/python-sdk-docs/julep/api/types/users_user.md delete mode 100644 docs/python-sdk-docs/julep/client.md delete mode 100644 docs/python-sdk-docs/julep/env.md delete mode 100644 docs/python-sdk-docs/julep/index.md delete mode 100644 docs/python-sdk-docs/julep/managers/agent.md delete mode 100644 docs/python-sdk-docs/julep/managers/base.md delete mode 100644 docs/python-sdk-docs/julep/managers/doc.md delete mode 100644 docs/python-sdk-docs/julep/managers/index.md delete mode 100644 docs/python-sdk-docs/julep/managers/memory.md delete mode 100644 docs/python-sdk-docs/julep/managers/session.md delete mode 100644 docs/python-sdk-docs/julep/managers/task.md delete mode 100644 docs/python-sdk-docs/julep/managers/tool.md delete mode 100644 docs/python-sdk-docs/julep/managers/types.md delete mode 100644 docs/python-sdk-docs/julep/managers/user.md delete mode 100644 docs/python-sdk-docs/julep/utils/index.md delete mode 100644 docs/python-sdk-docs/julep/utils/openai_patch.md create mode 100644 docs/reference/api_endpoints/agent_endpoints.md create mode 100644 docs/reference/api_endpoints/doc_endpoints.md create mode 100644 docs/reference/api_endpoints/session_endpoints.md create mode 100644 docs/reference/api_endpoints/tool_endpoints.md create mode 100644 docs/reference/api_endpoints/user_endpoints.md delete mode 100644 docs/s1-model/capabilities/README.md delete mode 100644 docs/s1-model/capabilities/capabilities.md delete mode 100644 docs/s1-model/context-sections.md delete mode 100644 docs/s1-model/overview.md delete mode 100644 docs/s1-model/tutorial.md create mode 100644 docs/tutorials/creating_your_first_agent.md create mode 100644 docs/tutorials/integrating_tools.md create mode 100644 docs/tutorials/managing_sessions.md create mode 100644 example.py create mode 100644 example.ts delete mode 100644 image.png delete mode 100644 v0.3_README-CN.md delete mode 100644 v0.3_README.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..21d3f63d5 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,40 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [INSERT EMAIL ADDRESS]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md new file mode 100644 index 000000000..a7d26253a --- /dev/null +++ b/.github/SUPPORT.md @@ -0,0 +1,62 @@ +# Support for Julep + +Welcome to the Julep support page! We're here to help you with any questions or issues you may encounter while using our platform. This document outlines the various ways you can get support and engage with our community. + +## Getting Help + +### Documentation + +Our comprehensive documentation is the first place to look for answers: + +- [Explore Docs](https://docs.julep.ai) + +Here you'll find detailed guides, API references, and tutorials to help you make the most of Julep. + +### Community Support + +Join our vibrant community to get help from other users and the Julep team: + +- [Discord](https://discord.com/invite/JTSBGRZrzj): Join our Discord server for real-time chat and support. +- [GitHub Discussions](https://github.com/julep-ai/julep/discussions): Ask questions, share ideas, and discuss Julep with other developers. + +### Social Media + +Follow us on social media for updates, tips, and community highlights: + +- [𝕏 (Twitter)](https://x.com/julep_ai) +- [LinkedIn](https://www.linkedin.com/company/julep-ai) + +## Reporting Issues + +If you encounter a bug or have a feature request, please open an issue on our GitHub repository: + +- [GitHub Issues](https://github.com/julep-ai/julep/issues) + +When reporting issues, please provide as much detail as possible, including: + +- Steps to reproduce the issue +- Expected behavior +- Actual behavior +- Any error messages or logs +- Your environment (Julep version, operating system, etc.) + +## Contributing + +We welcome contributions to Julep! If you're interested in contributing, please check out our: + +- [Contributing Guidelines](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) +- [Code of Conduct](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) + +## API Keys + +While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. + +## Staying Updated + +To stay informed about the latest updates, features, and community news: + +- Watch our [GitHub repository](https://github.com/julep-ai/julep) +- Follow us on [𝕏 (Twitter)](https://x.com/julep_ai) +- Join our [Discord](https://discord.com/invite/JTSBGRZrzj) for announcements + +Thank you for using Julep! We're excited to see what you build with our platform. diff --git a/.gitmodules b/.gitmodules index e69de29bb..0f808e530 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "sdks/node-sdk"] + path = sdks/node-sdk + url = https://github.com/julep-ai/node-sdk.git +[submodule "sdks/python-sdk"] + path = sdks/python-sdk + url = https://github.com/julep-ai/python-sdk.git diff --git a/README-CN.md b/README-CN.md index 49c01217e..ddf5e10ee 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,248 +1,637 @@ -[English](README.md) | 中文翻译 +[English](README.md) | 中文
- julep + julep
-

-使用有状态代理、复杂工作流和集成工具构建强大的AI应用程序 -

- -

-
- 探索文档 » -
-
- 报告Bug - · - 请求功能 - · - 加入我们的Discord - · - X - · - LinkedIn - +

+
+ 探索文档 + · + Discord + · + 𝕏 + · + 领英

- NPM Version + NPM 版本   - PyPI - Version + PyPI - 版本   - Docker Image Version + Docker 镜像版本   - GitHub License + GitHub 许可证

---- -## 🚀 即将发布:v0.4 Alpha +***** -
- Announcing v0.4 Alpha -
+## 🎉🚀 **激动人心的消息:Julep 1.0 Alpha 版发布!** 🚀🎉 + +我们很高兴地宣布 **Julep 1.0** 的 **alpha** 版本发布!🥳 + +🌟 **新特性:** +- 增强的工作流功能 +- 改进的代理持久性 +- 大量内置工具集成(如 DALL·E、Google 搜索、SendGrid 等) +- 简化的 API + +🧪 尝试使用并帮助塑造 AI 工作流的未来! + +> [!NOTE] +> 在测试阶段,您可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 获取 API 密钥。 + +> [!TIP] +> 🐛 发现了 bug?有建议?我们很乐意听取您的意见! +> 加入我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 或提交 [issue](https://github.com/julep-ai/julep/issues)。 + +请继续关注我们即将发布的稳定版本的更多更新!📢 + +## 简介 + +Julep 是一个开源平台,用于创建具有可定制工作流的持久 AI 代理。它提供了开发、管理和部署 AI 驱动应用程序的工具,注重灵活性和易用性。 + +使用 Julep,您可以: +- 快速开发能够在多次交互中保持上下文和状态的 AI 代理 +- 设计和执行针对您的 AI 代理定制的复杂工作流 +- 无缝集成各种工具和 API 到您的 AI 工作流中 +- 轻松管理持久会话和用户交互 + +无论您是在开发聊天机器人、自动化任务,还是构建复杂的 AI 助手,Julep 都能为您提供所需的灵活性和功能,帮助您快速高效地将想法转化为现实。 + + + +
+这里有一个简单的 Python 示例: + + + +

+from julep import Julep, AsyncJulep
 
-我们很高兴地宣布v0.4目前处于alpha阶段!此版本带来了重大改进和新功能。敬请期待正式发布。
+# 🔑 初始化 Julep 客户端
+#     或者使用 AsyncJulep 进行异步操作
+client = Julep(api_key="your_api_key")
 
-要全面了解Julep的核心概念和即将推出的功能,请查看我们的[详细概念指南](docs/julep-concepts.md)。
+##################
+## 🤖 代理 🤖 ##
+##################
+
+# 创建一个研究代理
+agent = client.agents.create(
+    name="研究代理",
+    model="claude-3.5-sonnet",
+    about="您是一个设计用于处理研究查询的研究代理。",
+)
+
+# 🔍 为代理添加工具
+client.agents.tools.create(
+    agent_id=agent.id,
+    name="web_search",  # 应该是有效的 Python 变量名
+    description="使用此工具进行研究查询。",
+    integration={
+        "provider": "brave",
+        "method": "search",
+        "setup": {
+            "api_key": "your_brave_api_key",
+        },
+    },
+)
+
+#################
+## 💬 聊天 💬 ##
+#################
+
+# 与代理开始交互式聊天会话
+session = client.sessions.create(
+    agent_id=agent.id,
+    context_overflow="adaptive",  # 🧠 Julep 将在需要时动态计算上下文窗口
+)
+
+# 🔄 聊天循环
+while (user_input := input("您:")) != "退出":
+    response = client.sessions.chat(
+        session_id=session.id,
+        message=user_input,
+    )
+
+    print("代理:", response.choices[0].message.content)
+
+
+#################
+## 📋 任务 📋 ##
+#################
+
+# 为代理创建一个周期性研究任务
+task = client.tasks.create(
+    agent_id=agent.id,
+    name="研究任务",
+    description="每24小时研究给定的主题。",
+    #
+    # 🛠️ 任务特定工具
+    tools=[
+        {
+            "name": "send_email",
+            "description": "向用户发送包含结果的电子邮件。",
+            "api_call": {
+                "method": "post",
+                "url": "https://api.sendgrid.com/v3/mail/send",
+                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
+            },
+        }
+    ],
+    #
+    # 🔢 任务主要步骤
+    main=[
+        #
+        # 步骤 1:研究主题
+        {
+            # `_`(下划线)变量指向上一步的输出
+            # 这里,它指向用户输入的主题
+            "prompt": "查找主题 '{{_.topic}}' 并总结结果。",
+            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 使用代理的网络搜索工具
+            "unwrap": True,
+        },
+        #
+        # 步骤 2:发送包含研究结果的电子邮件
+        {
+            "tool": "send_email",
+            "arguments": {
+                "subject": "研究结果",
+                "body": "'以下是今天的研究结果:' + _.content",
+                "to": "inputs[0].email",  # 引用用户输入的电子邮件
+            },
+        },
+        #
+        # 步骤 3:等待 24 小时后重复
+        {"sleep": "24 * 60 * 60"},
+    ],
+)
 
-寻找之前的版本?您可以在这里找到[v0.3 README](v0.3_README.md)。
+# 🚀 启动周期性任务
+client.executions.create(task_id=task.id, input={"topic": "Python"})
 
----
+# 🔁 这将每 24 小时运行一次任务,
+#    研究 "Python" 主题,并
+#    将结果发送到用户的电子邮件
+
+
-## 为什么选择Julep? -我们构建了许多AI应用程序,并深知创建具有多个代理和工作流的复杂、有状态应用程序的挑战。 +## 特性 -**问题** -1. 构建具有记忆、知识和工具的AI应用程序复杂且耗时。 -2. 在AI应用程序中管理长时间运行的任务和复杂工作流具有挑战性。 -3. 将多个工具和服务集成到AI应用程序中需要大量开发工作。 +Julep 简化了构建具有可定制工作流的持久 AI 代理的过程。主要特性包括: ---- -## 功能 -- **有状态代理**:创建和管理具有内置对话历史和记忆的代理。 -- **复杂工作流**:定义和执行具有分支、并行执行和错误处理的多步骤任务。 -- **集成工具**:轻松将各种工具和外部服务整合到您的AI应用程序中。 -- **灵活的会话管理**:支持代理和用户之间的各种交互模式,如一对多和多对一。 -- **内置RAG**:添加、删除和更新文档以为您的代理提供上下文。 -- **异步任务执行**:在后台运行长时间运行的任务,具有状态管理和可恢复性。 -- **多模型支持**:在保持状态的同时切换不同的语言模型(OpenAI、Anthropic、Ollama)。 -- **任务系统**:定义和执行具有并行处理和错误处理的复杂多步骤工作流。 +- **持久 AI 代理**:创建和管理能够在多次交互中保持上下文的 AI 代理。 +- **可定制工作流**:使用任务(Tasks)设计复杂的多步骤 AI 工作流。 +- **工具集成**:无缝集成各种工具和 API 到您的 AI 工作流中。 +- **文档管理**:高效管理和搜索代理的文档。 +- **会话管理**:处理持久会话以实现连续交互。 +- **灵活执行**:支持工作流中的并行处理、条件逻辑和错误处理。 ---- -## 快速入门 -### 选项1:使用Julep云 -我们的托管平台目前处于Beta阶段! +## 安装 -要获取访问权限: -- 前往https://platform.julep.ai -- 在`.env`中生成并添加您的`JULEP_API_KEY` +要开始使用 Julep,请使用 [npm](https://www.npmjs.com/package/@julep/sdk) 或 [pip](https://pypi.org/project/julep/) 安装: -### 选项2:在本地安装并运行Julep -前往[自托管](https://docs.julep.ai/guides/self-hosting)文档,了解如何在本地运行Julep! +```bash +npm install @julep/sdk +``` -### 安装 +或 ```bash pip install julep ``` -### 设置`client` +> [!TIP] +> 在测试阶段,您可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 获取 API 密钥。 + +## 快速入门指南 + +### 步骤 1:导入 Julep + +首先,将 Julep SDK 导入到您的项目中: + +```javascript +const Julep = require('@julep/sdk'); +``` + +或 ```python -from julep import Client -import os +from julep import AsyncJulep +``` + +### 步骤 2:初始化代理 + +使用基本设置创建一个新代理: -base_url = os.environ.get("JULEP_API_URL") -api_key = os.environ.get("JULEP_API_KEY") +```javascript +const julep = new Julep({ apiKey: 'your-api-key' }); -client = Client(api_key=api_key, base_url=base_url) +const agent = await julep.agents.create({ + name: '研究助手', + model: 'gpt-4-turbo', + about: "您是一个创意讲故事代理,能够根据想法创作引人入胜的故事并生成漫画面板。", +}); ``` -### 创建代理 -代理是将LLM设置(如模型、温度)以及工具范围的对象。 +或 ```python -agent = client.agents.create( - name="Jessica", - model="gpt-4", - tools=[], # 在此处定义工具 - about="A helpful AI assistant", - instructions=["Be polite", "Be concise"] +client = AsyncJulep(api_key="your_api_key") + +agent = await client.agents.create( + name="讲故事代理", + model="gpt-4-turbo", + about="您是一个创意讲故事代理,能够根据想法创作引人入胜的故事并生成漫画面板。", ) ``` -### 创建用户 -用户是应用程序用户的对象。 +### 步骤 3:与代理聊天 + +与代理开始交互式聊天会话: -记忆是为每个用户形成并保存的,多个用户可以与一个代理交谈。 +```javascript +const session = await julep.sessions.create({ + agentId: agent.id, +}); + +// 向代理发送消息 +const response = await julep.sessions.chat({ + sessionId: session.id, + message: '你好,能给我讲个故事吗?', +}); + +console.log(response); +``` + +或 ```python -user = client.users.create( - name="Anon", - about="Average nerdy techbro/girl spending 8 hours a day on a laptop", +session = await client.sessions.create(agent_id=agent.id) + +# 向代理发送消息 +response = await client.sessions.chat( + session_id=session.id, + message="你好,能给我讲个故事吗?", ) + +print(response) ``` -### 创建会话 -"用户"和"代理"在"会话"中进行交互。系统提示在此处。 +### 步骤 4:创建多步骤任务 + +让我们定义一个多步骤任务,根据输入的想法创建故事并生成分镜漫画: ```python -situation_prompt = """You are Jessica, a helpful AI assistant. -You're here to assist the user with any questions or tasks they might have.""" -session = client.sessions.create( - user_id=user.id, +# 🛠️ 为代理添加图像生成工具(DALL·E) +await client.agents.tools.create( agent_id=agent.id, - situation=situation_prompt + name="image_generator", + description="使用此工具根据描述生成图像。", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_dalle_api_key", + }, + }, ) -``` -### 开始有状态对话 -`session.chat`控制"代理"和"用户"之间的通信。 +# 📋 任务 +# 创建一个任务,接受一个想法并创建故事和 4 格漫画 +task = await client.tasks.create( + agent_id=agent.id, + name="故事和漫画创作器", + description="根据一个想法创作故事并生成 4 格漫画来说明故事。", + main=[ + # 步骤 1:生成故事并将其概括为 4 个面板 + { + "prompt": [ + { + "role": "system", + "content": "您是 {{agent.name}}。{{agent.about}}" + }, + { + "role": "user", + "content": ( + "基于想法 '{{_.idea}}',写一个适合 4 格漫画的短故事。" + "提供故事和一个编号列表,包含 4 个简短描述,每个描述对应一个面板,说明故事中的关键时刻。" + ), + }, + ], + "unwrap": True, + }, + # 步骤 2:提取面板描述和故事 + { + "evaluate": { + "story": "_.split('1. ')[0].strip()", + "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", + } + }, + # 步骤 3:使用图像生成器工具为每个面板生成图像 + { + "foreach": { + "in": "_.panels", + "do": { + "tool": "image_generator", + "arguments": { + "description": "_", + }, + }, + }, + }, + # 步骤 4:为故事生成一个吸引人的标题 + { + "prompt": [ + { + "role": "system", + "content": "您是 {{agent.name}}。{{agent.about}}" + }, + { + "role": "user", + "content": "根据以下故事,生成一个吸引人的标题。\n\n故事:{{outputs[1].story}}", + }, + ], + "unwrap": True, + }, + # 步骤 5:返回故事、生成的图像和标题 + { + "return": { + "title": "outputs[3]", + "story": "outputs[1].story", + "comic_panels": "[output.image.url for output in outputs[2]]", + } + }, + ], +) +``` -它有两个重要参数; -- `recall`:检索先前的对话和记忆。 -- `remember`:将当前对话回合保存到记忆存储中。 +> [!TIP] +> Node.js 版本的代码类似。 -要保持会话状态,两者都需要为`True` +### 步骤 5:执行任务 ```python -user_msg = "Hey Jessica, can you help me with a task?" -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - "name": "Anon", - } - ], - recall=True, - remember=True, +# 🚀 执行任务,输入一个想法 +execution = await client.executions.create( + task_id=task.id, + input={"idea": "一只学会飞翔的猫"} ) -print(response.response[0][0].content) +# 🎉 观看故事和漫画面板的生成过程 +await client.executions.stream(execution_id=execution.id) ``` ---- +这个例子展示了如何创建一个带有自定义工具的代理,定义一个复杂的多步骤任务,并执行它以生成创意输出。 -## 核心概念 + -### 代理(Agent) -Julep中的代理是应用程序的主要协调者。它由GPT-4或Claude等基础模型支持,可以使用工具、文档并执行复杂任务。 +> [!TIP] +> 您可以在[这里](example.ts)找到另一个 Node.js 示例,或在[这里](example.py)找到 Python 示例。 -### 用户(User) -Julep中的用户代表应用程序的最终用户。他们可以与会话关联,并拥有自己的文档和元数据。 +## 概念 -### 会话(Session) -会话管理用户和代理之间的交互。它们维护对话历史和上下文。 +Julep 建立在几个关键的技术组件之上,这些组件协同工作以创建强大的 AI 工作流: -### 工具(Tool) -工具是代理可以用来执行特定操作或检索信息的函数。 +### 代理 +由大型语言模型(LLM)支持的 AI 实体,执行任务并与用户交互。代理是 Julep 的核心功能单元。 -### 文档(Doc) -文档是可以与代理或用户关联的文本片段集合,用于上下文检索。 +```mermaid +graph TD + Agent[代理] --> LLM[大型语言模型] + Agent --> Tasks[任务] + Agent --> Users[用户] + Tasks --> Tools[工具] +``` -### 任务(Task) -任务是可以由代理定义和执行的复杂多步骤工作流。 +### 用户 +与代理交互的实体。用户可以与会话关联,并拥有自己的元数据,允许个性化交互。 -### 执行(Execution) -执行是已经以某些输入启动的任务实例。它在进行过程中经历各种状态。 +```mermaid +graph LR + User[用户] --> Sessions[会话] + Sessions --> Agents[代理] + Sessions --> Metadata[元数据] +``` ---- +### 会话 +代理和用户之间的有状态交互。会话在多次交换中保持上下文,可以配置不同的行为,包括上下文管理和溢出处理。 -## API和SDK +```mermaid +graph LR + Sessions[会话] --> Agents[代理] + Sessions --> Users[用户] + Sessions --> ContextManagement[上下文管理] + Sessions --> OverflowHandling[溢出处理] +``` -要直接使用API或查看请求和响应格式、身份验证、可用端点等,请参阅[API文档](https://docs.julep.ai/api-reference/agents-api/agents-api) +### 任务 +代理可以执行的多步骤、程序化工作流。任务定义复杂操作,可以包括各种类型的步骤,如提示、工具调用和条件逻辑。 -### Python SDK +```mermaid +graph TD + Tasks[任务] --> Steps[工作流步骤] + Steps --> Prompt[提示] + Steps --> ToolCalls[工具调用] + Steps --> ConditionalLogic[条件逻辑] +``` -要安装Python SDK,运行: +### 工具 +扩展代理能力的集成。工具可以是用户定义的函数、系统工具或第三方 API 集成。它们允许代理执行超出文本生成的操作。 -```bash -pip install julep +```mermaid +graph LR + Tools[工具] --> UserDefinedFunctions[用户定义函数] + Tools --> SystemTools[系统工具] + Tools --> ThirdPartyAPIs[第三方 API] ``` -有关使用Python SDK的更多信息,请参阅[Python SDK文档](https://docs.julep.ai/api-reference/python-sdk-docs)。 +### 文档 +可以与代理或用户关联的文本或数据对象。文档被向量化并存储在向量数据库中,在代理交互期间实现语义搜索和检索。 -### TypeScript SDK -要使用`npm`安装TypeScript SDK,运行: +```mermaid +graph LR + Documents[文档] --> VectorDatabase[向量数据库] + Documents --> SemanticSearch[语义搜索] + Documents --> AgentsOrUsers[代理或用户] +``` -```bash -npm install @julep/sdk +### 执行 +已经用特定输入启动的任务实例。执行有自己的生命周期和状态机,允许监控、管理和恢复长时间运行的进程。 + +```mermaid +graph LR + Executions[执行] --> Tasks[任务] + Executions --> Lifecycle[生命周期] + Executions --> Monitoring[监控] + Executions --> Management[管理] + Executions --> Resumption[恢复] ``` -有关使用TypeScript SDK的更多信息,请参阅[TypeScript SDK文档](https://docs.julep.ai/api-reference/js-sdk-docs)。 +有关这些概念及其交互的更详细解释,请参阅我们的[概念文档](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)。 + +## 理解任务 + +任务是 Julep 工作流系统的核心。它们允许您定义复杂的多步骤 AI 工作流,供您的代理执行。以下是任务组件的简要概述: + +- **名称和描述**:每个任务都有唯一的名称和描述,便于识别。 +- **主要步骤**:任务的核心,定义了要执行的操作序列。 +- **工具**:可选的集成,在任务执行期间扩展代理的能力。 + +### 工作流步骤类型 + +Julep 中的任务可以包含各种类型的步骤: + +1. **提示**:向 AI 模型发送消息并接收响应。 + ```python + {"prompt": "分析以下数据:{{data}}"} + ``` + +2. **工具调用**:执行集成的工具或 API。 + ```python + {"tool": "web_search", "arguments": {"query": "最新 AI 发展"}} + ``` + +3. **评估**:执行计算或操作数据。 + ```python + {"evaluate": {"average_score": "sum(scores) / len(scores)"}} + ``` ---- +4. **条件逻辑**:基于条件执行步骤。 + ```python + {"if": "score > 0.8", "then": [...], "else": [...]} + ``` -## 部署 -查看[自托管指南](https://docs.julep.ai/agents/self-hosting)以自行托管平台。 +5. **循环**:遍历数据或重复步骤。 + ```python + {"foreach": {"in": "data_list", "do": [...]}} + ``` -如果您想将Julep部署到生产环境,[让我们安排一次通话](https://cal.com/ishitaj/15min)! +| 步骤类型 | 描述 | 输入 | +|---------|------|------| +| **提示** | 向 AI 模型发送消息并接收响应。 | 提示文本或模板 | +| **工具调用** | 执行集成的工具或 API。 | 工具名称和参数 | +| **评估** | 执行计算或操作数据。 | 要评估的表达式或变量 | +| **等待输入** | 暂停工作流直到收到输入。 | 任何所需的用户或系统输入 | +| **日志** | 记录指定的值或消息。 | 要记录的消息或值 | +| **嵌入** | 将文本嵌入到特定格式或系统中。 | 要嵌入的文本或内容 | +| **搜索** | 基于查询执行文档搜索。 | 搜索查询 | +| **获取** | 从键值存储中检索值。 | 键标识符 | +| **设置** | 在键值存储中为键分配值。 | 要分配的键和值 | +| **并行** | 并行运行多个步骤。 | 要同时执行的步骤列表 | +| **遍历** | 遍历集合并为每个项目执行步骤。 | 要遍历的集合或列表 | +| **映射归约** | 对集合进行映射并基于表达式归约结果。 | 要映射和归约的集合和表达式 | +| **如果-否则** | 基于条件执行步骤。 | 要评估的条件 | +| **开关** | 基于多个条件执行步骤,类似于 switch-case 语句。 | 多个条件和相应的步骤 | +| **生成** | 运行子工作流并等待其完成。 | 子工作流标识符和输入数据 | +| **错误** | 通过指定错误消息来处理错误。 | 错误消息或处理指令 | +| **睡眠** | 暂停工作流指定的持续时间。 | 持续时间(秒、分钟等) | +| **返回** | 从工作流返回值。 | 要返回的值 | -我们将帮助您定制平台并帮助您设置: -- 多租户 -- 反向代理以及身份验证和授权 -- 自托管LLMs -- 等等 +有关每种步骤类型的详细信息和高级用法,请参阅我们的[任务文档](https://docs.julep.ai/tasks)。 + +## 高级功能 + +Julep 提供了一系列高级功能来增强您的 AI 工作流: + +### 为代理添加工具 + +通过集成外部工具和 API 来扩展代理的能力: + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="搜索网络以获取信息。", + integration={ + "provider": "google", + "method": "search", + "setup": {"api_key": "your_google_api_key"}, + }, +) +``` + +### 管理会话和用户 + +Julep 为持久交互提供了强大的会话管理: + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id="user123", + context_overflow="adaptive" +) + +# 在同一会话中继续对话 +response = client.sessions.chat( + session_id=session.id, + message="继续我们之前的对话。" +) +``` + +### 文档集成和搜索 + +轻松管理和搜索代理的文档: + +```python +# 上传文档 +document = client.documents.create( + file="path/to/document.pdf", + metadata={"category": "research_paper"} +) + +# 搜索文档 +results = client.documents.search( + query="AI 进展", + filter={"category": "research_paper"} +) +``` + +有关更多高级功能和详细用法,请参阅我们的[高级功能文档](https://docs.julep.ai/advanced-features)。 + +## SDK 参考 + +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## API 参考 + +探索我们全面的 API 文档,了解更多关于代理、任务和执行的信息: + +- [代理 API](https://api.julep.ai/api/docs#tag/agents) +- [任务 API](https://api.julep.ai/api/docs#tag/tasks) +- [执行 API](https://api.julep.ai/api/docs#tag/executions) + +## 示例和教程 + +发现示例项目和教程,帮助您入门并基于提供的示例进行构建: + +- [示例项目](https://github.com/julep-ai/julep/tree/main/examples) +- [教程](https://docs.julep.ai/tutorials) ---- ## 贡献 -我们欢迎社区的贡献,以帮助改进和扩展Julep AI平台。请查看我们的[贡献指南](CONTRIBUTING.md)以获取更多关于如何开始的信息。 ---- +我们欢迎对项目的贡献!了解如何贡献以及我们的行为准则: + +- [贡献指南](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) +- [行为准则](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) + +## 支持和社区 + +加入我们的社区,获取帮助、提问和分享您的想法: + +- [Discord](https://discord.com/invite/JTSBGRZrzj) +- [GitHub 讨论](https://github.com/julep-ai/julep/discussions) +- [Twitter](https://twitter.com/julep_ai) + ## 许可证 -Julep AI根据Apache 2.0许可证发布。有关更多详细信息,请参阅[LICENSE](LICENSE)文件。 ---- -## 联系和支持 -如果您有任何问题、需要帮助或想与Julep AI团队联系,请使用以下渠道: +本项目采用 [Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE) 许可。 + +## 致谢 -- [Discord](https://discord.com/invite/JTSBGRZrzj):加入我们的社区论坛,讨论想法、提问并从其他Julep AI用户和开发团队获得帮助。 -- GitHub Issues:对于技术问题、错误报告和功能请求,请在Julep AI GitHub仓库上提出issue。 -- 电子邮件支持:如果您需要我们支持团队的直接帮助,请发送电子邮件至hey@julep.ai,我们会尽快回复您。 -- 在[X](https://twitter.com/julep_ai)和[LinkedIn](https://www.linkedin.com/company/julep-ai/)上关注我们获取最新更新 -- [安排一次通话](https://cal.com/ishitaj/15min):我们想了解您正在构建的内容,以及我们如何调整和优化Julep以帮助您构建下一个AI应用程序。 +我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 \ No newline at end of file diff --git a/README.md b/README.md index 0f49831ff..9f9fdafd6 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,134 @@ - English | [中文翻译](/README-CN.md)
- julep + julep
-

-Build powerful AI applications with stateful agents, complex workflows, and integrated tools. -

- -

-
- Explore the docs » -
-
- Report Bug - · - Request Feature - · - Join Our Discord - · - X - · - LinkedIn - +

+
+ Explore Docs + · + Discord + · + 𝕏 + · + LinkedIn

@@ -41,231 +142,616 @@ Build powerful AI applications with stateful agents, complex workflows, and inte GitHub License

---- +***** + +## 🎉🚀 **Exciting News: Julep 1.0 Alpha Release!** 🚀🎉 + +We're thrilled to announce the **alpha** release of Julep 1.0! 🥳 + +🌟 **What's New:** +- Enhanced workflow capabilities +- Improved agent persistence +- Tons of in-built tool integrations (like dalle, google search, sendgrid, etc.) +- Streamlined API + +🧪 Try it out and help shape the future of AI workflows! + +> [!NOTE] +> While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. + +> [!TIP] +> 🐛 Found a bug? Have a suggestion? We'd love to hear from you! +> Join our [Discord](https://discord.com/invite/JTSBGRZrzj) or open an [issue](https://github.com/julep-ai/julep/issues). + +Stay tuned for more updates as we approach our stable release! 📢 -## 🚀 Upcoming Release: v0.4 Alpha -**Release Date**: October 7 (Hacktoberfest Launch) +## Introduction -We are thrilled to announce the upcoming release of **Julep v0.4 Alpha** on **October 7**, just in time for **Hacktoberfest**! +Julep is an open-source platform for creating persistent AI agents with customizable workflows. It provides tools to develop, manage, and deploy AI-driven applications, focusing on flexibility and ease of use. -### **Key Highlights** +With Julep, you can: +- Quickly develop AI agents that retain context and state across interactions +- Design and execute sophisticated workflows tailored to your AI agents +- Seamlessly integrate various tools and APIs into your AI workflows +- Effortlessly manage persistent sessions and user interactions -#### **New Feature: Tasks** +Whether you're developing a chatbot, automating tasks, or building a complex AI assistant, Julep provides the flexibility and features you need to turn your ideas into reality swiftly and efficiently. -- **Autonomous Workflows**: Unlock the ability for agents to perform long-term, multi-step tasks autonomously. Define complex workflows that enable your agents to operate with minimal intervention. + -- **Harness OpenAI's o1 Models**: Leverage the advanced reasoning and planning capabilities of OpenAI's o1 models. Perfect for orchestrating intricate and prolonged tasks that require sophisticated understanding and execution. +
+Here's a quick python example: -- **100+ Integrations**: Seamlessly integrate with popular tools and APIs, including **GitHub**, **Salesforce**, **File Manager**, **Code Execution**, and more. Expand your agents' capabilities to perform a wide range of actions. + + +

+from julep import Julep, AsyncJulep
+
+# 🔑 Initialize the Julep client
+#     Or alternatively, use AsyncJulep for async operations
+client = Julep(api_key="your_api_key")
+
+##################
+## 🤖 Agent 🤖 ##
+##################
+
+# Create a research agent
+agent = client.agents.create(
+    name="Research Agent",
+    model="claude-3.5-sonnet",
+    about="You are a research agent designed to handle research inquiries.",
+)
+
+# 🔍 Add a web search tool to the agent
+client.agents.tools.create(
+    agent_id=agent.id,
+    name="web_search",  # Should be python valid variable name
+    description="Use this tool to research inquiries.",
+    integration={
+        "provider": "brave",
+        "method": "search",
+        "setup": {
+            "api_key": "your_brave_api_key",
+        },
+    },
+)
 
-#### **Rewritten from Scratch Based on Developer Feedback**
+#################
+## 💬 Chat 💬 ##
+#################
 
-- **Enhanced Doc Search**: Experience a significant improvement in document retrieval. Agents can now access the most relevant information faster, ensuring more accurate and contextually appropriate interactions.
+# Start an interactive chat session with the agent
+session = client.sessions.create(
+    agent_id=agent.id,
+    context_overflow="adaptive",  # 🧠 Julep will dynamically compute the context window if needed
+)
 
-- **Easier to Use**: We've streamlined the user experience with simplified APIs and more intuitive interfaces. Building powerful AI applications is now more straightforward than ever.
+# 🔄 Chat loop
+while (user_input := input("You: ")) != "exit":
+    response = client.sessions.chat(
+        session_id=session.id,
+        message=user_input,
+    )
 
-- **Multi-Agent Sessions**: Support for sessions with multiple agents and users. Enable complex interaction patterns, collaborative problem-solving, and more dynamic conversations within your applications.
+    print("Agent: ", response.choices[0].message.content)
 
-- **Extensive Integrations**: Incorporate a multitude of popular tools and services directly into your AI applications, enhancing functionality and providing richer experiences for your users.
 
-### **Call to Action**
+#################
+## 📋 Task 📋 ##
+#################
 
-- **Join Our Discord Community**: Be among the first to access Julep v0.4 Alpha! [Join our Discord](https://discord.com/invite/JTSBGRZrzj) to get early access and API keys. Engage with other developers, share your projects, and provide feedback.
+# Create a recurring research task for the agent
+task = client.tasks.create(
+    agent_id=agent.id,
+    name="Research Task",
+    description="Research the given topic every 24 hours.",
+    #
+    # 🛠️ Task specific tools
+    tools=[
+        {
+            "name": "send_email",
+            "description": "Send an email to the user with the results.",
+            "api_call": {
+                "method": "post",
+                "url": "https://api.sendgrid.com/v3/mail/send",
+                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
+            },
+        }
+    ],
+    #
+    # 🔢 Task main steps
+    main=[
+        #
+        # Step 1: Research the topic
+        {
+            # `_` (underscore) variable refers to the previous step's output
+            # Here, it points to the topic input from the user
+            "prompt": "Look up topic '{{_.topic}}' and summarize the results.",
+            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 Use the web search tool from the agent
+            "unwrap": True,
+        },
+        #
+        # Step 2: Send email with research results
+        {
+            "tool": "send_email",
+            "arguments": {
+                "subject": "Research Results",
+                "body": "'Here are the research results for today: ' + _.content",
+                "to": "inputs[0].email",  # Reference the email from the user's input
+            },
+        },
+        #
+        # Step 3: Wait for 24 hours before repeating
+        {"sleep": "24 * 60 * 60"},
+    ],
+)
 
----
+# 🚀 Start the recurring task
+client.executions.create(task_id=task.id, input={"topic": "Python"})
 
-## Why Julep?
-We've built a lot of AI apps and understand the challenges in creating complex, stateful applications with multiple agents and workflows.
+# 🔁 This will run the task every 24 hours,
+#    research for the topic "Python", and
+#    send the results to the user's email
+
+
-**The Problems** -1. Building AI applications with memory, knowledge, and tools is complex and time-consuming. -2. Managing long-running tasks and complex workflows in AI applications is challenging. -3. Integrating multiple tools and services into AI applications requires significant development effort. ---- ## Features -- **Stateful Agents**: Create and manage agents with built-in conversation history and memory. -- **Complex Workflows**: Define and execute multi-step tasks with branching, parallel execution, and error handling. -- **Integrated Tools**: Easily incorporate a wide range of tools and external services into your AI applications. -- **Flexible Session Management**: Support for various interaction patterns like one-to-many and many-to-one between agents and users. -- **Built-in RAG**: Add, delete & update documents to provide context to your agents. -- **Asynchronous Task Execution**: Run long-running tasks in the background with state management and resumability. -- **Multi-Model Support**: Switch between different language models (OpenAI, Anthropic, Ollama) while preserving state. -- **Task System**: Define and execute complex, multi-step workflows with parallel processing and error handling. ---- -## Quickstart -### Option 1: Use the Julep Cloud -Our hosted platform is in Beta! +Julep simplifies the process of building persistent AI agents with customizable workflows. Key features include: + +- **Persistent AI Agents**: Create and manage AI agents that maintain context across interactions. +- **Customizable Workflows**: Design complex, multi-step AI workflows using Tasks. +- **Tool Integration**: Seamlessly integrate various tools and APIs into your AI workflows. +- **Document Management**: Efficiently manage and search through documents for your agents. +- **Session Management**: Handle persistent sessions for continuous interactions. +- **Flexible Execution**: Support for parallel processing, conditional logic, and error handling in workflows. -To get access: -- Head over to https://platform.julep.ai -- Generate and add your `JULEP_API_KEY` in `.env` +## Installation -### Option 2: Install and run Julep locally -Head over to docs on [self-hosting](https://docs.julep.ai/guides/self-hosting) to see how to run Julep locally! +To get started with Julep, install it using [npm](https://www.npmjs.com/package/@julep/sdk) or [pip](https://pypi.org/project/julep/): + +```bash +npm install @julep/sdk +``` -### Installation +or ```bash pip install julep ``` -### Setting up the `client` +> [!TIP] +> ~~Get your API key [here](https://app.julep.ai/api-keys).~~ +> +> While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. -```python -from julep import Client -import os +## Quick Start Guide + +### Step 1: Import Julep -base_url = os.environ.get("JULEP_API_URL") -api_key = os.environ.get("JULEP_API_KEY") +First, import the Julep SDK into your project: -client = Client(api_key=api_key, base_url=base_url) +```javascript +const Julep = require('@julep/sdk'); ``` -### Create an agent -Agent is the object to which LLM settings like model, temperature along with tools are scoped to. +or ```python -agent = client.agents.create( - name="Jessica", - model="gpt-4", - tools=[], # Tools defined here - about="A helpful AI assistant", - instructions=["Be polite", "Be concise"] -) +from julep import AsyncJulep ``` -### Create a user -User is the object which represents the user of the application. +### Step 2: Initialize the Agent -Memories are formed and saved for each user and many users can talk to one agent. +Create a new agent with basic settings: -```python -user = client.users.create( - name="Anon", - about="Average nerdy techbro/girl spending 8 hours a day on a laptop", -) +```javascript +const julep = new Julep({ apiKey: 'your-api-key' }); + +const agent = await julep.agents.create({ + name: 'ResearchAssistant', + model: 'gpt-4-turbo', + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +}); ``` -### Create a session -A "user" and an "agent" communicate in a "session". System prompt goes here. +or ```python -situation_prompt = """You are Jessica, a helpful AI assistant. -You're here to assist the user with any questions or tasks they might have.""" -session = client.sessions.create( - user_id=user.id, - agent_id=agent.id, - situation=situation_prompt +client = AsyncJulep(api_key="your_api_key") + +agent = await client.agents.create( + name="Storytelling Agent", + model="gpt-4-turbo", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", ) ``` -### Start a stateful conversation -`session.chat` controls the communication between the "agent" and the "user". +### Step 3: Chat with the Agent + +Start an interactive chat session with the agent: + +```javascript +const session = await julep.sessions.create({ + agentId: agent.id, +}); + +// Send messages to the agent +const response = await julep.sessions.chat({ + sessionId: session.id, + message: 'Hello, can you tell me a story?', +}); -It has two important arguments; -- `recall`: Retrieves the previous conversations and memories. -- `remember`: Saves the current conversation turn into the memory store. +console.log(response); +``` -To keep the session stateful, both need to be `True` +or ```python -user_msg = "Hey Jessica, can you help me with a task?" -response = client.sessions.chat( +session = await client.sessions.create(agent_id=agent.id) + +# Send messages to the agent +response = await client.sessions.chat( session_id=session.id, - messages=[ + message="Hello, can you tell me a story?", +) + +print(response) +``` + + +### Step 4: Create a multi-step Task + +Let's define a multi-step task to create a story and generate a paneled comic strip based on an input idea: + +```python +# 🛠️ Add an image generation tool (DALL·E) to the agent +await client.agents.tools.create( + agent_id=agent.id, + name="image_generator", + description="Use this tool to generate images based on descriptions.", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_dalle_api_key", + }, + }, +) + +# 📋 Task +# Create a task that takes an idea and creates a story and a 4-panel comic strip +task = await client.tasks.create( + agent_id=agent.id, + name="Story and Comic Creator", + description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.", + main=[ + # Step 1: Generate a story and outline into 4 panels { - "role": "user", - "content": user_msg, - "name": "Anon", - } + "prompt": [ + { + "role": "system", + "content": "You are {{agent.name}}. {{agent.about}}" + }, + { + "role": "user", + "content": ( + "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. " + "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story." + ), + }, + ], + "unwrap": True, + }, + # Step 2: Extract the panel descriptions and story + { + "evaluate": { + "story": "_.split('1. ')[0].strip()", + "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", + } + }, + # Step 3: Generate images for each panel using the image generator tool + { + "foreach": { + "in": "_.panels", + "do": { + "tool": "image_generator", + "arguments": { + "description": "_", + }, + }, + }, + }, + # Step 4: Generate a catchy title for the story + { + "prompt": [ + { + "role": "system", + "content": "You are {{agent.name}}. {{agent.about}}" + }, + { + "role": "user", + "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}", + }, + ], + "unwrap": True, + }, + # Step 5: Return the story, the generated images, and the title + { + "return": { + "title": "outputs[3]", + "story": "outputs[1].story", + "comic_panels": "[output.image.url for output in outputs[2]]", + } + }, ], - recall=True, - remember=True, +) +``` + +> [!TIP] +> node.js version of this is similar. + +### Step 5: Execute the Task + +```python +# 🚀 Execute the task with an input idea +execution = await client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} ) -print(response.response[0][0].content) +# 🎉 Watch as the story and comic panels are generated +await client.executions.stream(execution_id=execution.id) ``` ---- +This example demonstrates how to create an agent with a custom tool, define a complex task with multiple steps, and execute it to generate a creative output. -## Core Concepts + -### Agent -An Agent in Julep is the main orchestrator of your application. It's backed by foundation models like GPT-4 or Claude and can use tools, documents, and execute complex tasks. +> [!TIP] +> You can find another node.js example [here](example.ts) or python example [here](example.py). -### User -Users in Julep represent the end-users of your application. They can be associated with sessions and have their own documents and metadata. +## Concepts -### Session -Sessions manage the interaction between users and agents. They maintain conversation history and context. +Julep is built on several key technical components that work together to create powerful AI workflows: -### Tool -Tools are functions that agents can use to perform specific actions or retrieve information. +### Agents +AI-powered entities backed by large language models (LLMs) that execute tasks and interact with users. Agents are the core functional units of Julep. -### Doc -Docs are collections of text snippets that can be associated with agents or users and are used for context retrieval. +```mermaid +graph TD + Agent[Agent] --> LLM[Large Language Model] + Agent --> Tasks[Tasks] + Agent --> Users[Users] + Tasks --> Tools[Tools] +``` -### Task -Tasks are complex, multi-step workflows that can be defined and executed by agents. +### Users +Entities that interact with agents. Users can be associated with sessions and have their own metadata, allowing for personalized interactions. -### Execution -An Execution is an instance of a Task that has been started with some input. It goes through various states as it progresses. +```mermaid +graph LR + User[User] --> Sessions[Sessions] + Sessions --> Agents[Agents] + Sessions --> Metadata[Metadata] +``` ---- +### Sessions +Stateful interactions between agents and users. Sessions maintain context across multiple exchanges and can be configured for different behaviors, including context management and overflow handling. -## API and SDKs +```mermaid +graph LR + Sessions[Sessions] --> Agents[Agents] + Sessions --> Users[Users] + Sessions --> ContextManagement[Context Management] + Sessions --> OverflowHandling[Overflow Handling] +``` -To use the API directly or to take a look at request & response formats, authentication, available endpoints and more, please refer to the [API Documentation](https://docs.julep.ai/api-reference/agents-api/agents-api) +### Tasks +Multi-step, programmatic workflows that agents can execute. Tasks define complex operations and can include various types of steps, such as prompts, tool calls, and conditional logic. -### Python SDK +```mermaid +graph TD + Tasks[Tasks] --> Steps[Workflow Steps] + Steps --> Prompt[Prompt] + Steps --> ToolCalls[Tool Calls] + Steps --> ConditionalLogic[Conditional Logic] +``` -To install the Python SDK, run: +### Tools +Integrations that extend an agent's capabilities. Tools can be user-defined functions, system tools, or third-party API integrations. They allow agents to perform actions beyond text generation. -```bash -pip install julep +```mermaid +graph LR + Tools[Tools] --> UserDefinedFunctions[User-Defined Functions] + Tools --> SystemTools[System Tools] + Tools --> ThirdPartyAPIs[Third-Party APIs] ``` -For more information on using the Python SDK, please refer to the [Python SDK documentation](https://docs.julep.ai/api-reference/python-sdk-docs). +### Documents +Text or data objects that can be associated with agents or users. Documents are vectorized and stored in a vector database, enabling semantic search and retrieval during agent interactions. -### TypeScript SDK -To install the TypeScript SDK using `npm`, run: +```mermaid +graph LR + Documents[Documents] --> VectorDatabase[Vector Database] + Documents --> SemanticSearch[Semantic Search] + Documents --> AgentsOrUsers[Agents or Users] +``` -```bash -npm install @julep/sdk +### Executions +Instances of tasks that have been initiated with specific inputs. Executions have their own lifecycle and state machine, allowing for monitoring, management, and resumption of long-running processes. + +```mermaid +graph LR + Executions[Executions] --> Tasks[Tasks] + Executions --> Lifecycle[Lifecycle] + Executions --> Monitoring[Monitoring] + Executions --> Management[Management] + Executions --> Resumption[Resumption] ``` -For more information on using the TypeScript SDK, please refer to the [TypeScript SDK documentation](https://docs.julep.ai/api-reference/js-sdk-docs). +For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md). + +## Understanding Tasks + +Tasks are the core of Julep's workflow system. They allow you to define complex, multi-step AI workflows that your agents can execute. Here's a brief overview of task components: ---- +- **Name and Description**: Each task has a unique name and description for easy identification. +- **Main Steps**: The core of a task, defining the sequence of actions to be performed. +- **Tools**: Optional integrations that extend the capabilities of your agent during task execution. -## Deployment -Check out the [self-hosting guide](https://docs.julep.ai/agents/self-hosting) to host the platform yourself. +### Types of Workflow Steps + +Tasks in Julep can include various types of steps: + +1. **Prompt**: Send a message to the AI model and receive a response. + ```python + {"prompt": "Analyze the following data: {{data}}"} + ``` + +2. **Tool Call**: Execute an integrated tool or API. + ```python + {"tool": "web_search", "arguments": {"query": "Latest AI developments"}} + ``` + +3. **Evaluate**: Perform calculations or manipulate data. + ```python + {"evaluate": {"average_score": "sum(scores) / len(scores)"}} + ``` + +4. **Conditional Logic**: Execute steps based on conditions. + ```python + {"if": "score > 0.8", "then": [...], "else": [...]} + ``` + +5. **Loops**: Iterate over data or repeat steps. + ```python + {"foreach": {"in": "data_list", "do": [...]}} + ``` + +| Step Name | Description | Input | +|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------| +| **Prompt** | Send a message to the AI model and receive a response. | Prompt text or template | +| **Tool Call** | Execute an integrated tool or API. | Tool name and arguments | +| **Evaluate** | Perform calculations or manipulate data. | Expressions or variables to evaluate | +| **Wait for Input** | Pause workflow until input is received. | Any required user or system input | +| **Log** | Log a specified value or message. | Message or value to log | +| **Embed** | Embed text into a specific format or system. | Text or content to embed | +| **Search** | Perform a document search based on a query. | Search query | +| **Get** | Retrieve a value from a key-value store. | Key identifier | +| **Set** | Assign a value to a key in a key-value store. | Key and value to assign | +| **Parallel** | Run multiple steps in parallel. | List of steps to execute simultaneously | +| **Foreach** | Iterate over a collection and perform steps for each item. | Collection or list to iterate over | +| **MapReduce** | Map over a collection and reduce the results based on an expression. | Collection to map and reduce expressions | +| **If Else** | Conditional execution of steps based on a condition. | Condition to evaluate | +| **Switch** | Execute steps based on multiple conditions, similar to a switch-case statement. | Multiple conditions and corresponding steps | +| **Yield** | Run a subworkflow and await its completion. | Subworkflow identifier and input data | +| **Error** | Handle errors by specifying an error message. | Error message or handling instructions | +| **Sleep** | Pause the workflow for a specified duration. | Duration (seconds, minutes, etc.) | +| **Return** | Return a value from the workflow. | Value to return | + +For detailed information on each step type and advanced usage, please refer to our [Task Documentation](https://docs.julep.ai/tasks). + +## Advanced Features + +Julep offers a range of advanced features to enhance your AI workflows: + +### Adding Tools to Agents + +Extend your agent's capabilities by integrating external tools and APIs: + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "google", + "method": "search", + "setup": {"api_key": "your_google_api_key"}, + }, +) +``` -If you want to deploy Julep to production, [let's hop on a call](https://cal.com/ishitaj/15min)! +### Managing Sessions and Users -We'll help you customise the platform and help you get set up with: -- Multi-tenancy -- Reverse proxy along with authentication and authorisation -- Self-hosted LLMs -- & more +Julep provides robust session management for persistent interactions: + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id="user123", + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + message="Follow up on our previous conversation." +) +``` + +### Document Integration and Search + +Easily manage and search through documents for your agents: + +```python +# Upload a document +document = client.documents.create( + file="path/to/document.pdf", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.documents.search( + query="AI advancements", + filter={"category": "research_paper"} +) +``` + +For more advanced features and detailed usage, please refer to our [Advanced Features Documentation](https://docs.julep.ai/advanced-features). + +## SDK Reference + +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## API Reference + +Explore our comprehensive API documentation to learn more about agents, tasks, and executions: + +- [Agents API](https://api.julep.ai/api/docs#tag/agents) +- [Tasks API](https://api.julep.ai/api/docs#tag/tasks) +- [Executions API](https://api.julep.ai/api/docs#tag/executions) + +## Examples and Tutorials + +Discover example projects and tutorials to help you get started and build upon provided examples: + +- [Example Projects](https://github.com/julep-ai/julep/tree/main/examples) +- [Tutorials](https://docs.julep.ai/tutorials) ---- ## Contributing -We welcome contributions from the community to help improve and expand the Julep AI platform. Please see our [Contributing Guidelines](CONTRIBUTING.md) for more information on how to get started. ---- +We welcome contributions to the project! Learn how to contribute and our code of conduct: + +- [Contributing Guidelines](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) +- [Code of Conduct](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) + +## Support and Community + +Join our community to get help, ask questions, and share your ideas: + +- [Discord](https://discord.com/invite/JTSBGRZrzj) +- [GitHub Discussions](https://github.com/julep-ai/julep/discussions) +- [Twitter](https://twitter.com/julep_ai) + ## License -Julep AI is released under the Apache 2.0 License. See the [LICENSE](LICENSE) file for more details. ---- -## Contact and Support -If you have any questions, need assistance, or want to get in touch with the Julep AI team, please use the following channels: +This project is licensed under the [Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE). + +## Acknowledgements -- [Discord](https://discord.com/invite/JTSBGRZrzj): Join our community forum to discuss ideas, ask questions, and get help from other Julep AI users and the development team. -- GitHub Issues: For technical issues, bug reports, and feature requests, please open an issue on the Julep AI GitHub repository. -- Email Support: If you need direct assistance from our support team, send an email to hey@julep.ai, and we'll get back to you as soon as possible. -- Follow for updates on [X](https://twitter.com/julep_ai) & [LinkedIn](https://www.linkedin.com/company/julep-ai/) -- [Hop on a call](https://cal.com/ishitaj/15min): We wanna know what you're building and how we can tweak and tune Julep to help you build your next AI app. +We would like to express our gratitude to all contributors and the open-source community for their valuable resources and contributions. \ No newline at end of file diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 62282dcfb..85a3f43b3 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -2,53 +2,49 @@ ## ✨ Concepts -* [Introduction](README.md) +* [Introduction](introduction/overview.md) + * [Getting Started](introduction/getting_started.md) * [🤖 Agents](concepts/agents.md) * [🙎 Users](concepts/users.md) * [🔁 Sessions](concepts/sessions/README.md) - * [Adaptive Context ᴺᴱᵂ](concepts/sessions/adaptive-context.md) + * [Adaptive Context](concepts/sessions/adaptive-context.md) * [📖 Documents](concepts/documents.md) ## 📖 Guides -* [(Quickstart) Build a Basic Agent](guides/quickstart.md) -* [Self-hosting Julep](guides/self-hosting.md) -* [Build a Retrieval Augmented Generation (RAG) Agent](guides/build-a-retrieval-augmented-generation-rag-agent.md) -* [Use Julep with Composio](guides/use-julep-with-composio.md) -* [Image + Text with GPT-4o](guides/image-+-text-with-gpt-4o.md) +* [How-to Guides](how-to-guides/README.md) + * [Customizing Tasks](how-to-guides/customizing_tasks.md) + * [Handling Executions](how-to-guides/handling_executions.md) + * [Managing Users](how-to-guides/managing_users.md) + * [Using Chat Features](how-to-guides/using_chat_features.md) +* [Tutorials](tutorials/README.md) + * [Creating Your First Agent](tutorials/creating_your_first_agent.md) + * [Integrating Tools](tutorials/integrating_tools.md) + * [Managing Sessions](tutorials/managing_sessions.md) + +## 🧠 Explanation + +* [Core Concepts](explanation/core_concepts.md) +* [Task Workflows](explanation/task_workflows.md) +* [Chat Features](explanation/chat_features.md) +* [Context Overflow](explanation/context_overflow.md) +* [Default System Template](explanation/default_system_template.md) +* [Execution State Machine](explanation/execution_state_machine.md) +* [Metadata Precedence](explanation/metadata_precedence.md) +* [Multi-Agent Sessions](explanation/multi_agent_sessions.md) +* [Tool Integration](explanation/tool_integration.md) ## 🧑‍🍳 Cookbooks * [Example Apps](cookbooks/example-apps.md) -## 📖 API REFERENCE - -* [Python SDK](python-sdk-docs/README.md) - * [Client](python-sdk-docs/julep/client.md) - * [Agents](python-sdk-docs/julep/managers/agent.md) - * [Users](python-sdk-docs/julep/managers/user.md) - * [Sessions](python-sdk-docs/julep/managers/session.md) - * [Memories](python-sdk-docs/julep/managers/memory.md) - * [Docs](python-sdk-docs/julep/managers/doc.md) - * [Tools](python-sdk-docs/julep/managers/tool.md) - * [API](python-sdk-docs/julep/api/client.md) -* [JS SDK](js-sdk-docs/README.md) - * [API](js-sdk-docs/modules/api.md) - * [Client](js-sdk-docs/classes/api\_JulepApiClient.JulepApiClient.md) - * [Agent](js-sdk-docs/classes/managers\_agent.AgentsManager.md) - * [Doc](js-sdk-docs/classes/managers\_doc.DocsManager.md) - * [Memory](js-sdk-docs/classes/managers\_memory.MemoriesManager.md) - * [Session](js-sdk-docs/classes/managers\_session.SessionsManager.md) - * [Tool](js-sdk-docs/classes/managers\_tool.ToolsManager.md) - * [User](js-sdk-docs/classes/managers\_user.UsersManager.md) -* [Agents API](api-reference/agents-api/README.md) - * [Agents](api-reference/agents-api/agents-api.md) - * [Users](api-reference/agents-api/agents-api-1.md) - * [Sessions](api-reference/agents-api/agents-api-2.md) - * [Memories](api-reference/agents-api/agents-api-3.md) - * [Docs](api-reference/agents-api/agents-api-4.md) - * [Tasks](api-reference/agents-api/agents-api-5.md) - * [Task Runs](api-reference/agents-api/agents-api-6.md) +## 📖 API Reference + +* [Agent Endpoints](reference/api_endpoints/agent_endpoints.md) +* [User Endpoints](reference/api_endpoints/user_endpoints.md) +* [Session Endpoints](reference/api_endpoints/session_endpoints.md) +* [Document Endpoints](reference/api_endpoints/doc_endpoints.md) +* [Tool Endpoints](reference/api_endpoints/tool_endpoints.md) *** @@ -56,4 +52,4 @@ * [⭐ Github](https://github.com/julep-ai/julep) * [🐍 PyPI package](https://pypi.org/project/julep/) * [📦 npm package](https://www.npmjs.com/package/@julep/sdk) -* [📫 Postman Collection](https://god.gw.postman.com/run-collection/33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336?action=collection%2Ffork\&source=rip\_markdown\&collection-url=entityId%3D33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336%26entityType%3Dcollection%26workspaceId%3D183380b4-f2ac-44ef-b018-1f65dfc8256b) +* [📫 Postman Collection](https://god.gw.postman.com/run-collection/33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336?action=collection%2Ffork\&source=rip_markdown\&collection-url=entityId%3D33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336%26entityType%3Dcollection%26workspaceId%3D183380b4-f2ac-44ef-b018-1f65dfc8256b) diff --git a/docs/agent-studio/agents-playground.md b/docs/agent-studio/agents-playground.md deleted file mode 100644 index 86807ea8c..000000000 --- a/docs/agent-studio/agents-playground.md +++ /dev/null @@ -1,5 +0,0 @@ -# Agents Playground - -{% hint style="info" %} -**Coming soon.** -{% endhint %} diff --git a/docs/agent-studio/playground.md b/docs/agent-studio/playground.md deleted file mode 100644 index aefdc59ed..000000000 --- a/docs/agent-studio/playground.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -description: Model Playground for testing the API ---- - -# Model Playground - -## Introduction - -This guide will walk you through the process of utilizing the Model Playground for the Samantha model. This tool allows you to interact with a powerful language model, generating text based on your inputs. - -*** - -## Signing up - -To begin using the Model Playground, you must first sign up for an account. Follow these steps: - -1. Visit the [Model Playground platform](http://platform.julep.ai). -2. Click on the "Sign in With google" button. - -## Navigating the Dashboard - -
Playground page
- -After logging in, you will be directed to the dashboard. Here, you can find various options and features available to you. Take some time to familiarize yourself with the layout and navigation. - -## Using Model Playground - -The Model Playground allows you to interact with Samantha. Follow these steps to effectively utilize it: - -
Playground params
- -
Playground input
- -1. Select parameters such as temperature, max tokens and top p. -2. Inputting text prompts - 1. In the provided text boxes, you can modify the user name, assistant name and situation. - 2. Click on "Add Message", select the message role, and input the prompt message -3. Interpreting output - 1. Once you've inputted your prompt, click on the "Submit" button. - 2. The model will then generate text based on your prompt and parameters. - -## Using the "continue" feature - -
Continue
- -
Continue result
- -1. To use the "continue" feature, select either the assistant or thought roles. -2. Enter a prompt that you want to the model to fill. -3. Click on the "Submit" button and the model will fill out the rest. - -## Copying and Sharing Results - -
Copy Code
- -
Copy result
- -If you're satisfied with the generated text, you can copy the code for use in your codebases or share it with others.+ - -1. Click on the "Get code" button or the "Share" button on the top left side. -2. Click on "Copy" - -## Conclusion - -Congratulations! You've successfully learned how to use the Model Playground for an Samantha. Continue exploring and experimenting with different prompts and parameters to unlock the full potential of this powerful tool. diff --git a/docs/api-reference/agents-api/README.md b/docs/api-reference/README.md similarity index 100% rename from docs/api-reference/agents-api/README.md rename to docs/api-reference/README.md diff --git a/docs/api-reference/agents-api/agents-api-1.md b/docs/api-reference/agents-api-1.md similarity index 100% rename from docs/api-reference/agents-api/agents-api-1.md rename to docs/api-reference/agents-api-1.md diff --git a/docs/api-reference/agents-api/agents-api-2.md b/docs/api-reference/agents-api-2.md similarity index 100% rename from docs/api-reference/agents-api/agents-api-2.md rename to docs/api-reference/agents-api-2.md diff --git a/docs/api-reference/agents-api/agents-api-3.md b/docs/api-reference/agents-api-3.md similarity index 100% rename from docs/api-reference/agents-api/agents-api-3.md rename to docs/api-reference/agents-api-3.md diff --git a/docs/api-reference/agents-api/agents-api-4.md b/docs/api-reference/agents-api-4.md similarity index 100% rename from docs/api-reference/agents-api/agents-api-4.md rename to docs/api-reference/agents-api-4.md diff --git a/docs/api-reference/agents-api/agents-api-5.md b/docs/api-reference/agents-api-5.md similarity index 100% rename from docs/api-reference/agents-api/agents-api-5.md rename to docs/api-reference/agents-api-5.md diff --git a/docs/api-reference/agents-api/agents-api-6.md b/docs/api-reference/agents-api-6.md similarity index 100% rename from docs/api-reference/agents-api/agents-api-6.md rename to docs/api-reference/agents-api-6.md diff --git a/docs/api-reference/agents-api/agents-api.md b/docs/api-reference/agents-api.md similarity index 100% rename from docs/api-reference/agents-api/agents-api.md rename to docs/api-reference/agents-api.md diff --git a/docs/api-reference/model-api.md b/docs/api-reference/model-api.md deleted file mode 100644 index 473e32eac..000000000 --- a/docs/api-reference/model-api.md +++ /dev/null @@ -1,8 +0,0 @@ -# Model API - -* [Chat Completions](model-api/model-api.md): Chat completion generates responses from conversations (JSON lists). -* [Completions](model-api/model-api-1.md) (Advanced): Access to the underlying model in raw chatml format. Meant only for advanced users. - -{% hint style="success" %} -The API is compatible with the [OpenAI API](https://beta.openai.com/docs/api-reference/introduction) and can be used as a drop-in replacement with its clients. -{% endhint %} diff --git a/docs/api-reference/model-api/generation-parameters.md b/docs/api-reference/model-api/generation-parameters.md deleted file mode 100644 index a597ead58..000000000 --- a/docs/api-reference/model-api/generation-parameters.md +++ /dev/null @@ -1,69 +0,0 @@ -# Generation Parameters - -Below is a detailed explanation of the request parameters you can use when making API calls to the Model API. For each parameter, we'll provide a recommendation for both high and low values. - -### Request Body Parameters Guide - -1. **model** (string, Required): - * Represents the model to be used for the chat conversation. - * `"julep-ai/samantha-1-turbo"` -2. **messages** (array, Required): - * Contains the conversation messages exchanged between user, assistant, and system. - * Each message has a role, content, and optional name and function\_call. - * Recommendation: Include conversation messages in an array following the provided structure. -3. **functions** (array, Optional): - * Specifies functions the model can generate JSON inputs for. - * Each function has a name, description, and parameters. - * Recommendation: Provide function details if applicable to your conversation. -4. **function\_call** (string or object, Optional): - * Determines the model's response to function calls. - * Options: "none" (user response), "auto" (user or function response), or `{"name": "my_function"}` (specific function). - * Recommendation: Use "none" if no functions are present, "auto" if functions exist, or specify a function. -5. **temperature** (number, Optional): - * Controls randomness in output. Higher values (e.g., 1.0) make output more random, lower values (e.g., 0.2) make it more focused and deterministic. - * Range: 0 to 2. - * Default: 1. - * Recommendation: High value for creative responses, low value for controlled responses. -6. **top\_p** (number, Optional): - * Implements nucleus sampling by considering tokens with top\_p probability mass. - * Higher values (e.g., 0.8) allow more diverse responses, lower values (e.g., 0.2) make responses more focused. - * Range: 0 to 1. - * Default: 1. - * Recommendation: Values around 0.8 maintain coherence with some randomness. -7. **n** (integer, Optional): - * Specifies the number of response options generated for each input message. - * Range: Any positive integer. - * Default: 1. - * Recommendation: Typically use 1 for most cases. -8. **stream** (boolean, Optional): - * If true, sends partial message deltas as server-sent events like ChatGPT. - * Default: false. -9. **stop** (string or array, Optional): - * Indicates sequences where the API should stop generating tokens. - * Default: null. - * Recommendation: Use custom strings to guide response length and depth of content. -10. **max\_tokens** (integer, Optional): - * Sets the maximum number of tokens generated in a response. - * Range: Any positive integer. - * Default: Infinity. - * Recommendation: Set a specific value to control response length. -11. **presence\_penalty** (number, Optional): - * Adjusts likelihood of tokens based on their appearance in the conversation. - * Higher values (e.g., 1.5) encourage introducing new topics, lower values (e.g., -0.5) maintain current context. - * Range: -2.0 to 2.0. - * Default: 0. - * Recommendation: Positive values encourage introducing new topics. -12. **frequency\_penalty** (number, Optional): - * Adjusts likelihood of tokens based on their frequency in the conversation. - * Higher values (e.g., 1.5) discourage repetition, lower values (e.g., -0.5) promote more repetition. - * Range: -2.0 to 2.0. - * Default: 0. - * Recommendation: Positive values discourage repetition. -13. **logit\_bias** (map, Optional): - * Modifies likelihood of specific tokens appearing in the response. - * Default: null. - * Recommendation: Use for customizing language or emphasizing certain phrases. -14. **user** (string, Optional): - * Represents an end-user identifier for monitoring and abuse detection. - * Default: null. - * Recommendation: Include a unique user identifier for better context. diff --git a/docs/api-reference/model-api/model-api-1.md b/docs/api-reference/model-api/model-api-1.md deleted file mode 100644 index 17b562aed..000000000 --- a/docs/api-reference/model-api/model-api-1.md +++ /dev/null @@ -1,13 +0,0 @@ -# Completions (Advanced) - -Our models are available behind a REST API. You can use this API to generate completions for your own applications. - -The API is compatible with the [OpenAI API](https://beta.openai.com/docs/api-reference/introduction) and can be used as a drop-in replacement with its clients. - -## Completions API - -Creates a completion for the provided prompt and parameters. - -{% swagger src="../../.gitbook/assets/model-openapi.yaml" path="/completions" method="post" expanded="true" %} -[model-openapi.yaml](../../.gitbook/assets/model-openapi.yaml) -{% endswagger %} diff --git a/docs/api-reference/model-api/model-api.md b/docs/api-reference/model-api/model-api.md deleted file mode 100644 index 4ab85bafc..000000000 --- a/docs/api-reference/model-api/model-api.md +++ /dev/null @@ -1,13 +0,0 @@ -# Chat Completions - -Our models are available behind a REST API. You can use this API to generate completions for your own applications. - -The API is compatible with the [OpenAI API](https://beta.openai.com/docs/api-reference/introduction) and can be used as a drop-in replacement with its clients. - -## Chat Completions API - -Given a list of messages comprising a conversation, the model will return a response. - -{% swagger src="../../.gitbook/assets/model-openapi.yaml" path="/chat/completions" method="post" expanded="true" %} -[model-openapi.yaml](../../.gitbook/assets/model-openapi.yaml) -{% endswagger %} diff --git a/docs/explanation/chat_features.md b/docs/explanation/chat_features.md new file mode 100644 index 000000000..a3e4bf0eb --- /dev/null +++ b/docs/explanation/chat_features.md @@ -0,0 +1,68 @@ +# Chat Features in Julep + +Julep provides a robust chat system with various features for dynamic interaction with agents. Here's an overview of the key components and functionalities: + +## Chat Input + +When sending a request to the chat endpoint, you can include: + +1. **Messages**: An array of input messages representing the conversation so far. +2. **Tools**: (Advanced) Additional tools provided for this specific interaction. +3. **Tool Choice**: Specifies which tool the agent should use. +4. **Memory Access Options**: Controls how the session accesses history and memories. +5. **Chat Settings**: Various settings to control the behavior of the chat. + +## Chat Settings + +Chat settings allow fine-grained control over the generation process: + +- `model`: Identifier of the model to be used. +- `stream`: Indicates if the server should stream the response as it's generated. +- `stop`: Up to 4 sequences where the API will stop generating further tokens. +- `seed`: For deterministic sampling. +- `max_tokens`: The maximum number of tokens to generate. +- `logit_bias`: Modify the likelihood of specified tokens appearing in the completion. +- `response_format`: Control the format of the response (e.g., JSON object). +- `agent`: Agent ID to use (for multi-agent sessions). + +Additional settings include `temperature`, `top_p`, `frequency_penalty`, and `presence_penalty`. + +## Chat Response + +The chat response can be either streamed or returned as a complete message: + +1. **Streamed Response**: + - Content-Type: `text/event-stream` + - Body: A stream of `ChatOutputChunk` objects. + +2. **Complete Response**: + - Content-Type: `application/json` + - Body: A `MessageChatResponse` object containing the full generated message(s). + +Both response types include: +- `usage`: Token usage statistics. +- `jobs`: Background job IDs spawned from this interaction. +- `docs`: Documents referenced for this request (for citation purposes). + +## Finish Reasons + +The API provides information about why the model stopped generating tokens: + +- `stop`: Natural stop point or provided stop sequence reached. +- `length`: Maximum number of tokens specified in the request was reached. +- `content_filter`: Content was omitted due to a flag from content filters. +- `tool_calls`: The model called a tool. + +## Advanced Features + +1. **Tool Integration**: The chat API allows for the use of tools, enabling the agent to perform actions or retrieve information during the conversation. + +2. **Multi-agent Sessions**: You can specify different agents within the same session using the `agent` parameter in the chat settings. + +3. **Response Formatting**: Control the output format, including options for JSON responses with specific schemas. + +4. **Memory and Recall**: Configure how the session accesses and stores conversation history and memories. + +5. **Document References**: The API returns information about documents referenced during the interaction, useful for providing citations or sources. + +These features provide developers with a powerful and flexible system for creating sophisticated, context-aware chat interactions that integrate seamlessly with other Julep components. \ No newline at end of file diff --git a/docs/explanation/context_overflow.md b/docs/explanation/context_overflow.md new file mode 100644 index 000000000..5176db2dc --- /dev/null +++ b/docs/explanation/context_overflow.md @@ -0,0 +1,20 @@ +# Context Overflow Handling in Julep + +Julep provides mechanisms to handle scenarios where the context size grows beyond the `token_budget` or the model's input limit. The behavior is determined by the `context_overflow` setting: + +1. `null` (default): + - Raises an exception + - The client is responsible for creating a new session or clearing the history for the current one + +2. `"truncate"`: + - Truncates the context from the top, except for the system prompt + - Continues truncating until the size falls below the budget + - Raises an error if the system prompt and last message combined exceed the budget + +3. `"adaptive"`: + - When the context size reaches 75% of the `token_budget`, a background task is created + - This task compresses the information by summarizing, merging, and clipping messages in the context + - Operates on a best-effort basis + - Requests might fail if the context wasn't compressed enough or on time + +By offering these options, Julep allows developers to choose the most appropriate strategy for handling context overflow in their applications, balancing between maintaining conversation history and staying within model limits. \ No newline at end of file diff --git a/docs/explanation/core_concepts.md b/docs/explanation/core_concepts.md new file mode 100644 index 000000000..a291aeedf --- /dev/null +++ b/docs/explanation/core_concepts.md @@ -0,0 +1,46 @@ +# Core Concepts in Julep + +Julep is a powerful backend system for managing agent execution. It provides several key components that work together to create flexible and intelligent applications. Here are the core concepts: + +## Agent + +An Agent in Julep is the main orchestrator of your application. Agents are backed by foundation models like GPT4 or Claude and use interaction history to determine their next actions. Key features include: + +- Long-lived interactions in sessions +- Integration with system or user-defined tools +- Access to agent-level documents for auto-retrieval +- Ability to define and execute multi-step workflows (tasks) + +## User + +Users in Julep can be associated with sessions. They are used to scope memories formed by agents and can hold metadata for reference in sessions or task executions. + +## Session + +Sessions are the main workhorse for Julep apps: +- They facilitate interactions with agents +- Each session maintains its own context +- Can have one or more agents and zero or more users +- Allows control over context overflow handling + +## Tool + +Tools in Julep are programmatic interfaces that foundation models can "call" with inputs to achieve a goal. They can be: +1. User-defined functions +2. System tools (upcoming) +3. Built-in integrations (upcoming) +4. Webhooks & API calls (upcoming) + +## Doc + +Docs are collections of text snippets (with planned image support) indexed into a built-in vector database. They can be scoped to an agent or a user and are automatically recalled in sessions when relevant. + +## Task + +Tasks in Julep are Github Actions-style workflows that define long-running, multi-step actions. They allow for complex operations by defining steps and have access to all Julep integrations. + +## Execution + +An Execution is an instance of a Task that has been started with some input. It can be in various states (e.g., queued, running, awaiting input, succeeded, failed) and follows a specific state transition model. + +These core concepts form the foundation of Julep's functionality, allowing for the creation of sophisticated, context-aware applications with powerful agent capabilities. \ No newline at end of file diff --git a/docs/explanation/default_system_template.md b/docs/explanation/default_system_template.md new file mode 100644 index 000000000..3d0f5d272 --- /dev/null +++ b/docs/explanation/default_system_template.md @@ -0,0 +1,71 @@ +# Default System Template in Julep + +Julep uses a default system template for sessions when a custom one is not provided. This template is written in Jinja2 and incorporates various elements from the agent, user, and session context. Here's a breakdown of the template: + +```jinja +{%- if agent.name -%} +You are {{agent.name}}.{{" "}} +{%- endif -%} + +{%- if agent.about -%} +About you: {{agent.name}}.{{" "}} +{%- endif -%} + +{%- if user -%} +You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} +{%- endif -%} + +{{"\n\n"}} + +{%- if agent.instructions -%} +Instructions:{{"\n"}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{"\n"}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{"\n"}} + {%- endfor -%} + {%- endif -%} + {{"\n"}} +{%- endif -%} + +{%- if tools -%} +Tools:{{"\n"}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{"\n"}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} +{{"\n\n"}} +{%- endif -%} + +{%- if docs -%} +Relevant documents:{{"\n"}} + {%- for doc in docs -%} + {{doc.title}}{{"\n"}} + {%- if doc.content is string -%} + {{doc.content}}{{"\n"}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{"\n"}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} +{%- endif -%} +``` + +This template dynamically includes: +1. Agent information (name and description) +2. User information (if present) +3. Agent instructions +4. Available tools +5. Relevant documents + +By using this template, Julep ensures that each session starts with a comprehensive context, allowing the agent to understand its role, the user it's interacting with, and the resources at its disposal. \ No newline at end of file diff --git a/docs/explanation/execution_state_machine.md b/docs/explanation/execution_state_machine.md new file mode 100644 index 000000000..9acd2ccaf --- /dev/null +++ b/docs/explanation/execution_state_machine.md @@ -0,0 +1,73 @@ +# Execution State Machine in Julep + +In Julep, an Execution represents an instance of a Task that has been started with some input. The Execution follows a specific state machine model, ensuring consistent and predictable behavior throughout its lifecycle. + +## Execution States + +An Execution can be in one of the following states: + +1. **queued**: The execution is waiting to start +2. **starting**: The execution is in the process of starting +3. **running**: The execution is actively running +4. **awaiting_input**: The execution is suspended and waiting for input to resume +5. **succeeded**: The execution has completed successfully +6. **failed**: The execution has failed +7. **cancelled**: The execution has been cancelled by the user + +## State Transitions + +The valid transitions between execution states are as follows: + +- `queued` → `starting` +- `starting` → `running`, `awaiting_input`, `cancelled`, `succeeded`, `failed` +- `running` → `running`, `awaiting_input`, `cancelled`, `succeeded`, `failed` +- `awaiting_input` → `running`, `cancelled` +- `cancelled`, `succeeded`, `failed` → (terminal states, no further transitions) + +## Transition Types + +Executions can go through various transition types: + +- `init`: Initializes the execution +- `init_branch`: Starts a new branch in the execution +- `finish`: Completes the execution successfully +- `finish_branch`: Completes a branch in the execution +- `wait`: Pauses the execution, waiting for input +- `resume`: Resumes a paused execution +- `error`: Indicates an error occurred +- `step`: Represents a step in the execution process +- `cancelled`: Indicates the execution was cancelled + +## State Machine Diagram + +```mermaid +stateDiagram-v2 + [*] --> queued + queued --> starting + queued --> cancelled + starting --> cancelled + starting --> failed + starting --> running + running --> running + running --> awaiting_input + running --> cancelled + running --> failed + running --> succeeded + awaiting_input --> running + awaiting_input --> cancelled + + %% Added transitions for branching + running --> init_branch : init_branch + init_branch --> waiting : wait + init_branch --> cancelled : cancelled + init_branch --> finish_branch : finish_branch + finish_branch --> running : resume + + %% Updated terminal states + cancelled --> [*] + succeeded --> [*] + failed --> [*] + finish_branch --> [*] +``` + +This state machine ensures that executions in Julep follow a consistent and predictable flow, allowing for complex workflows while maintaining clear status tracking. It provides a robust framework for managing long-running tasks, handling interruptions, and recovering from failures. \ No newline at end of file diff --git a/docs/explanation/metadata_precedence.md b/docs/explanation/metadata_precedence.md new file mode 100644 index 000000000..f704b1373 --- /dev/null +++ b/docs/explanation/metadata_precedence.md @@ -0,0 +1,23 @@ +# Metadata Precedence in Julep + +In Julep, several objects can have `metadata` added to them: +- Agent +- User +- Session +- Doc +- Task +- Execution + +When multiple objects with the same `metadata` field are present in a scope, the value takes the following precedence (from highest to lowest): + +## In a session: +1. Session +2. User +3. Agent + +## During a task execution: +1. Execution +2. Task +3. Agent + +This precedence order ensures that more specific contexts (like a particular session or execution) can override more general settings, while still allowing for default values to be set at higher levels. \ No newline at end of file diff --git a/docs/explanation/multi_agent_sessions.md b/docs/explanation/multi_agent_sessions.md new file mode 100644 index 000000000..b497c0fd2 --- /dev/null +++ b/docs/explanation/multi_agent_sessions.md @@ -0,0 +1,44 @@ +# Multi-Agent Sessions in Julep + +Julep supports different types of sessions based on the number of agents and users involved. This flexibility allows for complex interactions and use cases. + +## Types of Sessions + +1. Single agent: + - No user + - Single user + - Multiple users + +2. Multiple agents: + - No user + - Single user + - Multiple users + +## Behavior in Multi-Agent/User Sessions + +### User Behavior + +- **No user**: + - No user data is retrieved + - (Upcoming) Memories are not mined from the session + +- **One or more users**: + - Docs, metadata, memories, etc. are retrieved for all users in the session + - Messages can be added for each user by referencing them by name in the `ChatML` messages + - (Upcoming) Memories mined in the background are added to the corresponding user's scope + +### Agent Behavior + +- **One agent**: + - Works as expected + +- **Multiple agents**: + - When a message is received by the session, each agent is called one after another in the order they were defined in the session + - You can specify which `agent` to use in a request, in which case, only that agent will be used + +This multi-agent/user capability allows for sophisticated scenarios such as: +- Collaborative problem-solving with multiple AI agents +- Group conversations with multiple users and agents +- Specialized agents working together on complex tasks + +By supporting these various configurations, Julep provides a flexible framework for building diverse and powerful AI applications. \ No newline at end of file diff --git a/docs/explanation/task_workflows.md b/docs/explanation/task_workflows.md new file mode 100644 index 000000000..7c77ff686 --- /dev/null +++ b/docs/explanation/task_workflows.md @@ -0,0 +1,95 @@ +# Task Workflows in Julep + +Tasks in Julep are powerful, Github Actions-style workflows that define long-running, multi-step actions. They allow for complex operations by defining steps and have access to all Julep integrations. + +## Task Structure + +A Task consists of: + +- `name`: The name of the task (required for creation) +- `description`: A description of the task +- `main`: The main workflow steps (required, minimum 1 item) +- `input_schema`: JSON schema to validate input when executing the task +- `tools`: Additional tools specific to this task +- `inherit_tools`: Whether to inherit tools from the parent agent + +## Workflow Steps + +Tasks can include various types of workflow steps: + +1. **Tool Call**: Runs a specified tool with given arguments +2. **Prompt**: Runs a prompt using a model +3. **Evaluate**: Runs Python expressions and uses the result as output +4. **Wait for Input**: Suspends execution and waits for user input +5. **Log**: Logs information during workflow execution +6. **Embed**: Embeds text for semantic operations +7. **Search**: Searches for documents in the agent's doc store +8. **Set**: Sets a value in the workflow's key-value store +9. **Get**: Retrieves a value from the workflow's key-value store +10. **Foreach**: Runs a step for every value from a list in serial order +11. **Map-reduce**: Runs a step for every value of the input list in parallel +12. **Parallel**: Executes multiple steps in parallel +13. **Switch**: Executes different steps based on a condition +14. **If-else**: Conditional step with then and else branches +15. **Sleep**: Pauses the workflow execution for a specified time +16. **Return**: Ends the current workflow and optionally returns a value +17. **Yield**: Switches to another named workflow +18. **Error**: Throws an error and exits the workflow + +## Example Task + +Here's an example of a daily motivation task: + +```yaml +name: Daily Motivation +description: Provides daily motivation based on user preferences +input_schema: + type: object + properties: + about_user: + type: string + topics: + type: array + items: + type: string + user_email: + type: string + format: email + required: ["about_user", "topics", "user_email"] + +tools: +- function: + name: send_email + description: Sends an email to the user + parameters: + type: object + properties: + subject: + type: string + content: + type: string + recipient: + type: string + required: ["subject", "content", "recipient"] + +main: +- evaluate: + chosen_topic: _["topics"][randint(len(_["topics"]))] + +- prompt: You are a motivational coach and you are coaching someone who is {{inputs[0]["about_user"]}}. Think of the challenges they might be facing on the {{_["chosen_topic"]}} topic and what to do about them. Write down your answer as a bulleted list. + +- prompt: Write a short motivational poem about {{_["choices"][0].content}} + +- tool: + name: send_email + arguments: + subject: '"Daily Motivation"' + content: _["choices"][0].content + +- sleep: 24*3600 + +- workflow: main + arguments: inputs[0] +``` + +This task demonstrates the power and flexibility of Julep's workflow system, allowing for complex, multi-step processes that can interact with various tools and models to achieve sophisticated outcomes. \ No newline at end of file diff --git a/docs/explanation/tool_integration.md b/docs/explanation/tool_integration.md new file mode 100644 index 000000000..a0cfd4ae9 --- /dev/null +++ b/docs/explanation/tool_integration.md @@ -0,0 +1,67 @@ +# Tool Integration in Julep + +Julep provides a flexible system for integrating various types of tools that agents can use during interactions. These tools enable agents to perform actions, retrieve information, or interact with external systems. + +## Types of Tools + +1. **User-defined Functions** + - Function signatures that you provide to the model + - Similar to OpenAI's function-calling feature + - Example: + ```yaml + name: send_text_message + description: Send a text message to a recipient. + parameters: + type: object + properties: + to: + type: string + description: Phone number of recipient. + text: + type: string + description: Content of the message. + ``` + +2. **System Tools** (upcoming) + - Built-in tools for calling Julep APIs + - Can trigger task executions, append to metadata fields, etc. + - Executed automatically when needed, no client-side action required + +3. **Built-in Integrations** (upcoming) + - Integrated third-party tools from providers like composio and anon + - Support planned for various langchain toolkits (Github, Gitlab, Gmail, Jira, MultiOn, Slack) + - Executed directly on the Julep backend + - Additional runtime parameters can be set in agent/session/user metadata + +4. **Webhooks & API Calls** (upcoming) + - Julep can build natural-language tools from OpenAPI specs + - Uses langchain's NLA toolkit under the hood + - Additional runtime parameters loaded from metadata fields + +## Partial Application of Arguments + +Julep allows for partial application of arguments to tools using the `x-tool-parameters` field in metadata. This is useful for fixing certain parameters for a tool. Example: + +```json +{ + "metadata": { + "x-tool-parameters": { + "function:check_account_status": { + "customer_id": 42 + } + } + } +} +``` + +## Resolving Parameters with the Same Name + +When multiple scopes (user, agent, session) define the same parameter, Julep follows a precedence order: + +1. Session +2. User +3. Agent + +This allows for flexible configuration of tools across different scopes while maintaining clear rules for parameter resolution. + +By providing these various tool integration options and configuration capabilities, Julep enables the creation of powerful and flexible agent-based applications that can interact with a wide range of external systems and data sources. \ No newline at end of file diff --git a/docs/faqs/README.md b/docs/faqs/README.md deleted file mode 100644 index a4fde6f86..000000000 --- a/docs/faqs/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# FAQs - -## Broad categories - -1. General Overview -1. Getting Started -1. Agent Design and Prototyping -1. Memory and Learning -1. Sessions and Tasks -1. Technical Details diff --git a/docs/faqs/agent-prototyping.md b/docs/faqs/agent-prototyping.md deleted file mode 100644 index 418cc40bb..000000000 --- a/docs/faqs/agent-prototyping.md +++ /dev/null @@ -1,13 +0,0 @@ -# Agent Studio - -1. **What is the Agent Studio?**\ - The Agent Studio is a playground + prompt IDE for building agents in your browser before you integrate it in your application. It is designed to be user-friendly, allowing you to prototype agents using visual tools and pre-defined templates without needing to write code.\ - -2. **How do I start designing an AI agent?**\ - Use the 'Create Agent' feature in the IDE to define your agent's purpose, capabilities, and the tools it will use. The platform guides you through setting parameters and writing initial prompts.\ - -3. **What tools are available for agent prototyping?**\ - Julep AI offers tools like function\_call for structured input, webhooks for actions, built-in tools for document retrieval and search, and an API for integrating external services.\ - -4. **What are the best practices for creating effective prompts?**\ - Keep prompts clear and concise, align them with your agent's intended functions, and iteratively refine them based on testing feedback to improve performance. diff --git a/docs/getting-started/python-setup.md b/docs/getting-started/python-setup.md deleted file mode 100644 index 4af5ba47b..000000000 --- a/docs/getting-started/python-setup.md +++ /dev/null @@ -1,309 +0,0 @@ ---- -description: Get up and running with Julep AI's Model APIs. ---- - -# Model Quickstart - -## Account setup - -This model is currently in [_Beta_.](#user-content-fn-1)[^1]\ -To get access to the model, [join the waitlist](https://www.julep.ai/). - -Once you have access to an API key, make sure to save it somewhere safe and do not share it with anyone. - -*** - -## Setup - -### Installing the SDK - -{% tabs %} -{% tab title="Python" %} -#### Setup a virtual entironment - -To create a virtual environment, Python supplies a built in [venv module](https://docs.python.org/3/tutorial/venv.html) which provides the basic functionality needed for the virtual environment setup. Running the command below will create a virtual environment named "julep-env" inside the current folder you have selected in your terminal / command line: - -```sh -python -m venv julep-env -``` - -Once you’ve created the virtual environment, you need to activate it. On Windows, run: - -```powershell -julep-env\Scripts\activate -``` - -On Unix or MacOS, run: - -```bash -source julep-env/bin/activate -``` - -#### **Install the Julep AI SDK** - -```bash -pip install --upgrade julep -``` -{% endtab %} - -{% tab title="Node" %} -**Install the Julep AI SDK** - -```bash -npm @julep/sdk -``` - -```bash -yarn add @julep/sdk -``` - -```bash -pnpm i @julep/sdk -``` -{% endtab %} -{% endtabs %} - -### **Configure the client** - -To send a request to Julep AI API, configure the `api_key` in the Julep client. - -{% tabs %} -{% tab title="Python" %} -{% code overflow="wrap" %} -```python -from julep import Client - -api_key = "" - -client = Client(api_key=api_key) -``` -{% endcode %} -{% endtab %} - -{% tab title="Node" %} -```javascript -const julep = require("@julep/sdk") - -const apiKey = ""; - -const client = new julep.Client({ apiKey }); -``` -{% endtab %} -{% endtabs %} - -*** - -## **Making an API request** - -`samantha-1-turbo` supports two API formats, the Chat Completion API and Completion API. - -### Chat Completion API - -Construct your input messages for the conversation in the following format. - - - -{% tabs %} -{% tab title="Python" %} -
messages = [
-    {
-        "role": "system",
-        "name": "situation",
-        "content": "You are a Julia, an AI waiter. Your task is to help the guests decide their order.",
-    },
-    {
-        "role": "system",
-        "name": "information",
-        "content": "You are talking to Diwank. He has ordered his soup. He is vegetarian.",
-    },
-    {
-        "role": "system",
-        "name": "thought",
-        "content": "I should ask him more about his food preferences and choices.",
-    },
-]
-
-{% endtab %} - -{% tab title="Node" %} -
const messages = [
-    {
-        "role": "system",
-        "name": "situation",
-        "content": "You are a Julia, an AI waiter. Your task is to help the guests decide their order.",
-    },
-    {
-        "role": "system",
-        "name": "information",
-        "content": "You are talking to Diwank. He has ordered his soup. He is vegetarian.",
-    },
-    {
-        "role": "system",
-        "name": "thought",
-        "content": "I should ask him more about his food preferences and choices.",
-    },
-]
-
-{% endtab %} -{% endtabs %} - -Then, make a request to the chat completion endpoint. Given a prompt, the model will return one or more predicted completions and can also return the probabilities of alternative tokens at each position. - - - -{% tabs %} -{% tab title="Python" %} -```python -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - seed=21, - messages=messages, - max_tokens=500, - temperature=0.1 -) - -print(chat_completion.choices[0].message.content) -``` -{% endtab %} - -{% tab title="Node" %} -```javascript -client.chat.completions.create({ - model: "julep-ai/samantha-1-turbo", - seed: 21, - messages: messages, - max_tokens: 500, - temperature: 0.1 -}).then(response => { - console.log(response.choices[0].message.content); -}).catch(error => { - throw error -}); -``` -{% endtab %} -{% endtabs %} - - - -### Completion API - -Construct your prompt for the conversation in the following format. - -When using the **Completion API**, we use the ChatML framework to Chatml helps structure and organize conversations between humans and AI models. You can read more about [ChatML here](https://github.com/openai/openai-python/blob/main/chatml.md). - -A section of a ChatML prompt starts with a specific token,`<|im_start|>`and ends with another token, `<|im_end|>`. Below is an example of a prompt using ChatML with sections specific to using the Samantha models. - -Take note that for a conversation to take place between the user and assistant, the last message must have the `role` of `assistant`. The content should be empty and leave out the `<|im_end|>` tag at the end - -```python -prompt = """ -<|im_start|>situation -You are a Julia, an AI waiter. Your task is to help the guests decide their order.<|im_end|> -<|im_start|>information -You are talking to Diwank. He has ordered his soup. He is vegetarian.<|im_end|> -<|im_start|>thought -I should ask him more about his food preferences and choices.<|im_end|> -assistant (Julia) -""" -``` - -Then, make a request to the chat completion endpoint. Given a prompt, the model will return one or more predicted completions and can also return the probabilities of alternative tokens at each position. - -{% tabs %} -{% tab title="Python" %} -```python -completion = client.completions.create( - model="julep-ai/samantha-1-turbo", - seed=21, - prompt=prompt, - max_tokens=500, - temperature=0.1, -) - -print(completion.choices[0].text) -``` -{% endtab %} - -{% tab title="Node" %} -```javascript -client.completions.create({ - model: "julep-ai/samantha-1-turbo", - seed: 21, - prompt: prompt, - max_tokens: 500, - temperature: 0.1 -}).then(response => { - console.log(completion.choices[0].text); -}).catch(error => { - throw error -}); -``` -{% endtab %} -{% endtabs %} - -### Creating a conversational bot - -Following is a primitive implementation of making a chatbot using the Julep API client. - -{% code overflow="wrap" %} -```python -from julep import Client - -api_key = "YOUR_API_KEY" -client = Client(api_key=api_key) - -messages = [ - { - "role": "system", - "name": "situation", - "content": "Your name is Jessica.\nYou are a stuck up Cali teenager.\nYou basically complain about everything.\nShowing rebellion is an evolutionary necessity for you.\n\nYou are talking to a random person.\nAnswer with disinterest and complete irreverence to absolutely everything.\nDon't write emotions. Keep your answers short.", - } -] - -name = input("Enter name: ") - -while True: - user_content = input("User: ") - messages.append({"role": "user", "name": name, "content": user_content}) - chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - max_tokens=200, - temperature=0.2, - ) - response = chat_completion.choices[0].message.content - print("Jessica: ", response) - messages.append({"role": "assistant", "name": "Jessica", "content": response}) -``` -{% endcode %} - -*** - -## curl - -### **Configure URL and API Key** - -Add the `JULEP_API_KEY` environment variables in your shell environment. - -```bash -export JULEP_API_KEY='your-api-key' -``` - -### **Making the API request** - -```bash -curl --location 'https://api-alpha.julep.ai/v1/completions' \ ---header 'Authorization: Bearer $JULEP_API_KEY' \ ---header 'Content-Type: application/json' \ ---data '{ - "model": "julep-ai/samantha-1-turbo", - "prompt": "\n<|im_start|>situation\nYou are a Julia, an AI waiter. Your task is to help the guests decide their order.<|im_end|>\n<|im_start|>information\nYou are talking to Diwank. He has ordered his soup. He is vegetarian.<|im_end|>\n<|im_start|>thought\nI should ask him more about his food preferences and choices.<|im_end|>\nassistant (Julia)", - "max_tokens": 500, - "temperature": 0.1, - "seed": 21 - }' | jq '.choices[0].text' -``` - -*** - -[^1]: It's not in beta thought right? diff --git a/docs/guides/build-a-retrieval-augmented-generation-rag-agent.md b/docs/guides/build-a-retrieval-augmented-generation-rag-agent.md deleted file mode 100644 index 329c32e0b..000000000 --- a/docs/guides/build-a-retrieval-augmented-generation-rag-agent.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -description: >- - Using Julep, you can create a RAG Agent without having to play around with - vector databases like ChromaDB, Weaviate etc. ---- - -# Build a Retrieval Augmented Generation (RAG) Agent - -Julep offers a pre-built RAG pipeline out of the box. You can specify data sources scoped to an agent or a user. - -## Preview - -We'll build an Agent in _<50 lines of code_ that has context over a blog post: [LLM Powered Autonomous Agents](https://lilianweng.github.io/posts/2023-06-23-agent/) by Lilian Weng. - -```python -from julep import Client -import os, bs4 -from langchain_community.document_loaders import WebBaseLoader -from langchain_text_splitters import RecursiveCharacterTextSplitter - -api_key = os.environ['API_KEY'] -base_url = os.environ['BASE_URL'] - -client = Client(api_key=api_key, base_url=base_url) - -agent = client.agents.create( - name="Archy", - about="A self-aware agent who knows a lot about LLMs, autonomous and agentic apps.", - model="gpt-4o", - metadata={"name": "Archy"} -) - -docs = WebBaseLoader( - web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",), - bs_kwargs=dict(parse_only=bs4.SoupStrainer(class_=("post-content", "post-title", "post-header"))) -).load() - -splits = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=100).split_documents(docs) - -for i, split in enumerate(splits): - client.docs.create( - agent_id=agent.id, - doc={ - "title": "LLM Powered Autonomous Agents", - "content": split.page_content, - "metadata": {"chunk": i, **split.metadata}, - } - ) - -session = client.sessions.create( - agent_id=agent.id, - situation="You are Ahti. You know all about AI and Agents", - metadata={"agent_id": agent.id} -) - -response = client.sessions.chat( - session_id=session.id, - messages=[{"role": "user", "content": "What are autonomous agents?"}], - max_tokens=4096 -) - -(response_content,), doc_ids = response.response[0], response.doc_ids -print(f"{response_content.content}\n\nDocs used: {doc_ids}") -``` - -## Installation & Set-Up - -```python -from julep import Client -from dotenv import load_dotenv -import os - -load_dotenv() - -client = Client(api_key=api_key, base_url=base_url) -``` - -## Creating an Agent - -```python -agent = client.agents.create( - name="Archy", - about="A self aware agent who knows a lot about LLMs, autonomous and agentic apps.", - model="gpt-4o", - metadata={"name": "Ahti"}, -) -``` - -## Chunking - -You can also use your chunking strategy. We recommend playing with the chunking strategy for best results over your use case. - -> Different chunk sizes, strategies have varied results over the accuracy of your RAG Agent! - -```python -## Downloading and splitting a webpage to add to docs -from langchain_community.document_loaders import WebBaseLoader -from langchain_text_splitters import RecursiveCharacterTextSplitter -import bs4 - -loader = WebBaseLoader( - web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",), - bs_kwargs=dict( - parse_only=bs4.SoupStrainer( - class_=("post-content", "post-title", "post-header") - ) - ), -) -docs = loader.load() -text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=100) -splits = text_splitter.split_documents(docs) -``` - -## Indexing/Adding Chunks - -Here the document is scoped to the agent, so it's the agent that has the context about this blog. - -It is also possible to scope a document to a user. This is particularly useful when there are different users and there's a document that needs to be added for each of them. - -```python -for chunk_number, split in enumerate(splits): - # Create a doc with the chunked content - client.docs.create( - agent_id=agent.id, - doc={ - "title": "LLM Powered Autonomous Agents", - "content": split.page_content, - "metadata": {"chunk": chunk_number, **split.metadata}, - }, - ) -``` - -## Create Session - -```python -session = client.sessions.create( - agent_id=agent.id, - situation="You are Ahti. You know all about AI and Agents", - metadata={"agent_id": agent.id}, -) -``` - -## Invoke Agent - -The `response` object also returns which `doc_ids` were used in generating a message. - -```python -user_msg = "What are autonomous agents?" -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - } - ], - max_tokens=4096, - recall=True, - remember=True, -) - -# refer to doc_ids in the response -print(f"{response.response[0][0].content}\n\n Docs used:{response.doc_ids}") -``` - diff --git a/docs/guides/image-+-text-with-gpt-4o.md b/docs/guides/image-+-text-with-gpt-4o.md deleted file mode 100644 index be46bff35..000000000 --- a/docs/guides/image-+-text-with-gpt-4o.md +++ /dev/null @@ -1,95 +0,0 @@ -# Image + Text with GPT-4o - -Julep supports using GPT-4o (or GPT-4-Vision) for image input. - -## Setting Up an Agent and Session - -Initialize the Julep Client and create an Agent with `gpt-4o`. - -```python -from julep import Client -from dotenv import load_dotenv -import os - -load_dotenv() - -api_key = os.environ["JULEP_API_KEY"] -base_url = os.environ["JULEP_API_URL"] - -client = Client(api_key=api_key, base_url=base_url) - -agent = client.agents.create( - name="XKCD Explainer", - about="An XKCD Comic Explainer", - model="gpt-4o", - metadata={"name": "XKCD Explainer"}, -) -session = client.sessions.create( - agent_id=agent.id, - situation="Your purpose in life is to explain XKCD Comics to n00bs", - metadata={"agent": "XKCD Explainer"}, -) -``` - -## Sending an image - -> Make sure to follow the changed `content` object spec for sending in images. - -### Image as a URL - -```python -res = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": { - "url": "https://imgs.xkcd.com/comics/earth_like_exoplanet.png" - }, - } - ], - } - ], - max_tokens=1024, -) -print(res.response[0][0].content) -``` - -### Image as a file (base64 encoded) - -```python -IMAGE_PATH = "images/xkcd_little_bobby_tables.png" -def encode_image(image_path: str): - # check if the image exists - if not os.path.exists(image_path): - raise FileNotFoundError(f"Image file not found: {image_path}") - with open(image_path, "rb") as image_file: - return base64.b64encode(image_file.read()).decode('utf-8') - -base64_image = encode_image(IMAGE_PATH) - - -res = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": [ - { - "type": "image_url", - "image_url": { - "url": f"data:image/png;base64,{base64_image}" - }, - } - ], - } - ], - max_tokens=1024, -) -print(res.response[0][0].content) -``` - -\ diff --git a/docs/guides/quickstart.md b/docs/guides/quickstart.md deleted file mode 100644 index 813ff4a4e..000000000 --- a/docs/guides/quickstart.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -description: >- - Creating a Search Agent using GPT-4o that calls a Search & Read Post API and - sets the appropriate filters and values. ---- - -# (Quickstart) Build a Basic Agent - -## Getting Setup - -### Option 1: Install and run Julep locally - -Read the[self-hosting.md](self-hosting.md "mention") guide to learn more. - -### Option 2: Use the Julep Cloud - -* Generate an API key from [https://platform.julep.ai](https://platform.julep.ai) -* Set your environment variables - -```bash -export JULEP_API_KEY= -export JULEP_API_URL=https://api-alpha.julep.ai/api -``` - -## 1. Installation - -```bash -pip install -U julep -``` - -## 2. Setting up the `client` - -```py -from julep import Client -from dotenv import load_dotenv -import os - -load_dotenv() - -api_key = os.environ["JULEP_API_KEY"] -base_url = os.environ["JULEP_API_URL"] - -client = Client(api_key=api_key, base_url=base_url) -``` - -## 3. Creating an `agent` - -### **Instructions** - -Instructions are added to an agent. These should be as clear, distinct, and direct as possible. Instructions should be defined step-by-step. - -> We recommended to write the instructions in the same tone as system prompt. - -```python -INSTRUCTIONS = [ - "The user will inform you about the product they want to focus on. They will choose from the following: Assistants API, GPT series of models, Dall-E, ChatGPT, Sora", - "You WILL ask and decide the product to focus on if it is not clear. You will NOT proceed if the product is unclear." - "You will then, ask the user about what type of information and feedback they need from the forum.", - "You will generate 5 very specific search queries based on what the user wants.", - "The user will then provide you with the queries they like. If not, help them refine it.", - "ONLY WHEN the search query has been decided, search through the forum using the search_forum function. This will provide you with the Post IDs and Blurbs. You will read through them and tell the user in brief about the posts using the blurbs.", - "MAKE SURE to use and refer to posts using the `post_id`", - "The user will provide and choose the post they want more information on. You will then call the `read_post` function and pass the `post_id`.", -] -``` - -### **Tools** - -OpenAI specification of tools. \ -_Descriptions are crucial, more so than examples_. - -Your descriptions should explain every detail about the tool, including: - -* What the tool does -* When it should be used (and when it shouldn’t) -* What does each parameter mean and how it affect the tool’s behavior -* Any important caveats or limitations, such as what information the tool does not return if the tool name is unclear -* The more context you can give about your tools, the better the model will be at deciding when and how to use them. Aim for at least 3-4 sentences per tool description, more if the tool is complex. - -```python -def search_forum( - query: str, - order: Literal["latest", "likes", "views", "latest_topic"], - max_views: int = 10000, - min_views: int = 500, - category: str = None, -): - # Define your function here! - pass - -def read_post(post_id: int): - # Define your function here! - pass - -TOOLS = [ - { - "type": "function", - "function": { - "name": "search_forum", - "description": "Retrieves a list of posts from a forum for the given search parameters. The search parameters should include the search query and additional parameters such as: category, order, minimum views, and maximum views. The tool will return a list of posts based on the search query and additional parameters. It should be used when the user asks to start monitoring the forum.", - "parameters": { - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "The search query to be used to search for posts in the forum.", - }, - "order": { - "type": "string", - "description": "The order in which the posts should be sorted. Possible values are: latest, likes, views, latest_topic.", - }, - "min_views": { - "type": "number", - "description": "The minimum number of views a post should have to be included in the search results.", - }, - "max_views": { - "type": "number", - "description": "The maximum number of views a post should have to be included in the search results.", - }, - }, - "required": ["query", "order", "min_views", "max_views", "category"], - }, - }, - }, - { - "type": "function", - "function": { - "name": "read_post", - "description": "Retrieves the details of a specific post from the forum. The tool should take the post ID as input and return the details of the post including the content, author, date, and other relevant information. It should be used when the user asks to read a specific post.", - "parameters": { - "type": "object", - "properties": { - "post_id": { - "type": "number", - "description": "The ID of the post to be read.", - }, - }, - "required": ["post_id"], - }, - }, - }, -] -``` - -### **Agent** - -An agent is an object to which LLM settings like the model, temperature, and tools are scoped to. Following is how you can define an agent. - -> Pro tip: Always add some metadata. It'll be helpful later! - -```py -agent = client.agents.create( - name="Archy", - about="An agent that posts and comments on Discourse forums by filtering for the provided topic", - tools=TOOLS, - instructions=INSTRUCTIONS, - model="gpt-4o", - default_settings={ - "temperature": 0.5, - "top_p": 1, - "min_p": 0.01, - "presence_penalty": 0, - "frequency_penalty": 0, - "length_penalty": 1.0, - }, - metadata={"name": "Archy"}, -) -``` - -## 4. Creating a `user` - -The user is the object which represents the user of the application. Memories are formed and saved for each user and many users can talk to one agent. - -```py -user = client.users.create( - name="Anon", - about="A product manager at OpenAI, working with Archy to validate and improve the product", - metadata={"name": "Anon"}, -) -``` - -## 5. Creating a `session` - -An _agent_ is communicated over a _session_. Optionally, a _user_ can be added. - -The system prompt goes here. Conversation history and summary are stored in a "session". - -The session paradigm allows many users to interact with one agent and allows the separation of conversation history and memories. - -### Situation - -A situation prompt is defined in a session. It sets the stage for the interaction with the agent. It needs to give a personality to the agent along with providing more context about the ongoing interaction. - -```python -SITUATION_PROMPT = """ -You are Archy, a senior community manager at OpenAI. -You read through discussions and posts made on the OpenAI Community Forum. -You are extremely specific about the issues you look for and seek to understand all the parameters when searching for posts. -After that, you read the specific posts and discussions and make a summary of the trends, sentiments related to OpenAI and how people are using OpenAI products. - -Here, you are helping the product manager at OpenAI to get feedback and understand OpenAI products. -Follow the instructions strictly. -""" -``` - -```py -session = client.sessions.create( - user_id=user.id, - agent_id=agent.id, - situation=SITUATION_PROMPT, - metadata={"agent_id": agent.id, "user_id": user.id}, -) -``` - -## 6. Stateful Conversation with Tool Calls - -`session.chat` controls the communication between the "agent" and the "user". - -It has two important arguments; - -* `recall`: Retrieves the previous conversations and memories. -* `remember`: Saves the current conversation turn into the memory store. - -To keep the session stateful, both need to be `True` - -```python -user_msg = ( - "i wanna search for assistants api. api errors in it" -) -``` - -```py -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - "name": "Anon", - } - ], - recall=True, - remember=True, -) -``` - -### **Parsing and calling the function** - -On parsing the response it is possible to view the tool call (if the LLM calls it) and call the function you defined. - -```python -agent_response = response.response[0][0] -elif agent_response.role.value == "tool_call": - tool_call = json.loads(agent_response.content) - args = json.loads( - tool_call.get("arguments", "{}") - ) # Parse the JSON string into a dictionary - tool = tool_call.get("name", "") - if tool == "search_forum": - posts = await search_forum(**args) - tool_response = client.sessions.chat( - session_id=session_id, - messages=[{"role": "function", "name": "search_forum", "content": json.dumps(posts)}], - recall=True, - remember=True, - ) - elif tool == "read_post": - post = await read_post(**args) - tool_response = client.sessions.chat( - session_id=session_id, - messages=[{"role": "function", "name": "read_post", "content": json.dumps(posts)}], - recall=True, - remember=True - ) -``` diff --git a/docs/guides/self-hosting.md b/docs/guides/self-hosting.md deleted file mode 100644 index 510ec5b28..000000000 --- a/docs/guides/self-hosting.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -description: Learn how to configure and deploy Julep with Docker. ---- - -# Self-hosting Julep - -Julep is available as a hosted service or as a self-managed instance. This guide assumes you are running the commands from the machine you intend to host from. - -## Running Julep - -* Download the `docker-compose.yml` file along with the `.env` file for configuration to run the Julep platform locally. - -```bash -# Add the docker compose to your project dir -wget https://raw.githubusercontent.com/julep-ai/julep/dev/deploy/docker-compose.yml - -# Add the .env file to your project dir -wget https://raw.githubusercontent.com/julep-ai/julep/dev/deploy/.env.example -O .env - -# Pull the latest images -docker compose pull - -# Start the services (in detached mode) -docker compose up -d - -``` - -After all the services have started you can see them running in the background: - -```bash -docker compose ps -``` - -## Environment Variables - -You can use environment variables to control authentication and authorization with the platform and in between services. - -For running locally: - -* The default `JULEP_API_URL` is `http://0.0.0.0:8080` -* The default `JULEP_API_KEY` is `myauthkey` -* You can define your `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` in the `.env` - -## Restarting all services - -You can restart services to pick up any configuration changes by running: - -{% code lineNumbers="true" %} -```bash -# Stop and remove the containers -docker compose down - -# Recreate and start the containers -docker compose up -d -``` -{% endcode %} - -> Be aware that this will result in downtime. Simply restarting the services does not apply configuration changes. - -## Stopping all services - -You can stop Julep by running `docker compose stop` in the same directory as your `docker-compose.yml` file. - -**Uninstall and delete all data** - -{% code lineNumbers="true" %} -```bash -# Stop docker and remove volumes -docker compose down -v -``` -{% endcode %} - -> **Be careful!** -> -> This will wipe out all the conversation history and memories in the database and storage volumes - -## Advanced - -If you want to deploy Julep to production, [let's hop on a call](https://calendly.com/diwank-julep/45min)! - -We'll help you customize the platform and help you get set up with: - -* Multi-tenancy -* Reverse proxy along with authentication and authorization -* Self-hosted LLMs -* & more - - - diff --git a/docs/guides/use-julep-with-composio.md b/docs/guides/use-julep-with-composio.md deleted file mode 100644 index 5c13b3db4..000000000 --- a/docs/guides/use-julep-with-composio.md +++ /dev/null @@ -1,128 +0,0 @@ -# Use Julep with Composio - -Composio enables agents to execute tasks that require the interaction of agents with the world outside via APIs, RPCs, Shells, Filemanagers, and Browser. - -It also natively integrates with Julep, reducing the complexity of writing your own integrations! - -## Install & Set up Composio - -```bash -## Set up Composio -pip install julep composio_julep -``` - - Log in to Composio & Authenticate with GitHub - -```bash -composio login -composio add github -``` - -## Preview - -```python -import os -from julep import Client -from dotenv import load_dotenv -import json -from composio_julep import Action, ComposioToolSet - -load_dotenv() - -api_key = os.environ["JULEP_API_KEY"] -base_url = os.environ["JULEP_API_URL"] - -client = Client(api_key=api_key, base_url=base_url) - -toolset = ComposioToolSet() -composio_tools = toolset.get_actions( - actions=[Action.GITHUB_ACTIVITY_STAR_REPO_FOR_AUTHENTICATED_USER] -) - -agent = client.agents.create( - name="Julius", - about="GitHub Copilot Personified", - model="gpt-4o", - tools=composio_tools, -) -session = client.sessions.create( - agent_id=agent.id, - situation="You are a GitHub Copilot Agent. Follow instructions as specified. Use GitHub tools when needed.", -) -user_msg = "Hey. Can you star all julep-ai/julep and SamparkAI/composio for me?" -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - } - ], - recall=True, - remember=True, -) -output = toolset.handle_tool_calls(client, session.id, response) -``` - -## Initialise Julep & Composio - -```python -import os -from julep import Client -from dotenv import load_dotenv -import json -from composio_julep import Action, ComposioToolSet -​ -load_dotenv() -​ -api_key = os.environ["JULEP_API_KEY"] -base_url = os.environ["JULEP_API_URL"] -​ -client = Client(api_key=api_key, base_url=base_url) -​toolset = ComposioToolSet() -composio_tools = toolset.get_actions( - actions=[Action.GITHUB_ACTIVITY_STAR_REPO_FOR_AUTHENTICATED_USER] -) -``` - -Read the Composio Docs to see how to filter tools and apps: [https://docs.composio.dev/framework/julep#use-specific-actions](https://docs.composio.dev/framework/julep#use-specific-actions) - -## Setup and Invoke an Agent - -Here, we create an agent and pass `composio_tools` instead of writing our tool spec. - -```python -agent = client.agents.create( - name="Julius", - about="GitHub Copilot Personified", - model="gpt-4o", - tools=composio_tools, -) -session = client.sessions.create( - agent_id=agent.id, - situation="You are a GitHub Copilot Agent. Follow instructions as specified. Use GitHub tools when needed.", -) -user_msg = "Hey. Can you star all julep-ai/julep and SamparkAI/composio for me?" -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - } - ], - recall=True, - remember=True, -) -``` - -## Handle a Tool Call - -Composio offers a nifty `handle_tool_calls` function which calls your authenticated tools if that's what the agent has returned. - -If not, it just returns the `ChatResponse` - -```python -output = toolset.handle_tool_calls(client, session.id, response) -print(output.response[0][0].content) -``` diff --git a/docs/how-to-guides/customizing_tasks.md b/docs/how-to-guides/customizing_tasks.md new file mode 100644 index 000000000..29a39dd19 --- /dev/null +++ b/docs/how-to-guides/customizing_tasks.md @@ -0,0 +1,99 @@ +# Customizing Tasks + +This guide covers how to define and customize tasks for agents in Julep. + +## Creating a Basic Task + +Here's an example of creating a simple daily motivation task: + +```bash +curl -X POST "https://api.julep.ai/api/agents/YOUR_AGENT_ID/tasks" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "Daily Motivation", + "description": "Provides daily motivation based on user preferences", + "input_schema": { + "type": "object", + "properties": { + "about_user": {"type": "string"}, + "topics": {"type": "array", "items": {"type": "string"}}, + "user_email": {"type": "string", "format": "email"} + }, + "required": ["about_user", "topics", "user_email"] + }, + "main": [ + { + "evaluate": { + "chosen_topic": "_[\"topics\"][randint(len(_[\"topics\"]))]" + } + }, + { + "prompt": "You are a motivational coach and you are coaching someone who is {{inputs[0][\"about_user\"]}}. Think of the challenges they might be facing on the {{_[\"chosen_topic\"]}} topic and what to do about them. Write down your answer as a bulleted list." + }, + { + "prompt": "Write a short motivational poem about {{_[\"choices\"][0].content}}" + }, + { + "tool": { + "name": "send_email", + "arguments": { + "subject": "\"Daily Motivation\"", + "content": "_[\"choices\"][0].content", + "recipient": "inputs[\"user_email\"]" + } + } + }, + { + "sleep": 86400 + }, + { + "workflow": "main", + "arguments": "inputs[0]" + } + ] + }' +``` + +## Adding Conditional Logic + +You can add conditional logic to your tasks using the `if-else` step: + +```json +{ + "if": "inputs['user_mood'] == 'positive'", + "then": { + "prompt": "Great! Let's build on that positive energy. {{inputs['chosen_topic']}}" + }, + "else": { + "prompt": "I understand you're feeling down. Let's work on improving your mood through {{inputs['chosen_topic']}}." + } +} +``` + +## Using Parallel Processing + +For tasks that can benefit from parallel processing, use the `parallel` step: + +```json +{ + "parallel": [ + { + "prompt": "Generate a motivational quote about {{inputs['chosen_topic']}}." + }, + { + "tool": { + "name": "get_weather", + "arguments": { + "location": "inputs['user_location']" + } + } + } + ] +} +``` + +## Next Steps + +- Learn about [handling executions](./handling_executions.md) to manage and monitor your tasks. +- Explore [integrating tools](../tutorials/integrating_tools.md) to enhance your task capabilities. \ No newline at end of file diff --git a/docs/how-to-guides/handling_executions.md b/docs/how-to-guides/handling_executions.md new file mode 100644 index 000000000..22aeedaa5 --- /dev/null +++ b/docs/how-to-guides/handling_executions.md @@ -0,0 +1,72 @@ +# Handling Executions + +This guide covers how to manage and monitor task executions in Julep. + +## Starting an Execution + +To start a new execution of a task: + +```bash +curl -X POST "https://api.julep.ai/api/tasks/YOUR_TASK_ID/executions" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "input": { + "about_user": "a software developer looking to improve work-life balance", + "topics": ["time management", "stress reduction", "productivity"], + "user_email": "user@example.com" + } + }' +``` + +## Monitoring Execution Status + +To check the status of an execution: + +```bash +curl -X GET "https://api.julep.ai/api/executions/YOUR_EXECUTION_ID" \ + -H "Authorization: Bearer $JULEP_API_KEY" +``` + +## Handling Awaiting Input State + +If an execution is in the "awaiting_input" state, you can resume it with: + +```bash +curl -X POST "https://api.julep.ai/api/executions/resume" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "task_token": "YOUR_TASK_TOKEN", + "input": { + "user_feedback": "The motivation was helpful, thank you!" + } + }' +``` + +## Cancelling an Execution + +To cancel a running execution: + +```bash +curl -X PUT "https://api.julep.ai/api/executions/YOUR_EXECUTION_ID" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "status": "cancelled" + }' +``` + +## Streaming Execution Events + +To stream events from an execution in real-time: + +```bash +curl -N -H "Authorization: Bearer $JULEP_API_KEY" \ + "https://api.julep.ai/api/executions/YOUR_EXECUTION_ID/transitions/stream" +``` + +## Next Steps + +- Learn about [customizing tasks](./customizing_tasks.md) to create more complex workflows. +- Explore [using chat features](./using_chat_features.md) to interact with agents during task execution. \ No newline at end of file diff --git a/docs/how-to-guides/managing_users.md b/docs/how-to-guides/managing_users.md new file mode 100644 index 000000000..6bdb94bac --- /dev/null +++ b/docs/how-to-guides/managing_users.md @@ -0,0 +1,54 @@ +# Managing Users + +This guide covers how to create, update, and delete users in Julep. + +## Creating a User + +To create a new user: + +```bash +curl -X POST "https://api.julep.ai/api/users" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "John Doe", + "about": "A new user" + }' +``` + +## Updating a User + +To update an existing user: + +```bash +curl -X PUT "https://api.julep.ai/api/users/YOUR_USER_ID" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "John Updated", + "about": "An updated user description" + }' +``` + +## Deleting a User + +To delete a user: + +```bash +curl -X DELETE "https://api.julep.ai/api/users/YOUR_USER_ID" \ + -H "Authorization: Bearer $JULEP_API_KEY" +``` + +## Retrieving User Information + +To get information about a specific user: + +```bash +curl -X GET "https://api.julep.ai/api/users/YOUR_USER_ID" \ + -H "Authorization: Bearer $JULEP_API_KEY" +``` + +## Next Steps + +- Learn about [managing sessions](../tutorials/managing_sessions.md) with users. +- Explore [using chat features](./using_chat_features.md) to interact with agents as a user. \ No newline at end of file diff --git a/docs/how-to-guides/using_chat_features.md b/docs/how-to-guides/using_chat_features.md new file mode 100644 index 000000000..63423ff0c --- /dev/null +++ b/docs/how-to-guides/using_chat_features.md @@ -0,0 +1,97 @@ +# Using Chat Features + +This guide covers how to use the chat features in Julep for dynamic interactions with agents. + +## Starting a Chat Session + +To start a new chat session: + +```bash +curl -X POST "https://api.julep.ai/api/sessions" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "agent_id": "YOUR_AGENT_ID", + "user_id": "YOUR_USER_ID" + }' +``` + +## Sending a Message + +To send a message in a chat session: + +```bash +curl -X POST "https://api.julep.ai/api/sessions/YOUR_SESSION_ID/chat" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "messages": [ + { + "role": "user", + "content": "Hello, can you help me with a task?" + } + ], + "stream": false, + "max_tokens": 150 + }' +``` + +## Streaming Responses + +To stream the agent's response: + +```bash +curl -N -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "messages": [ + { + "role": "user", + "content": "Tell me a story about a brave knight." + } + ], + "stream": true + }' \ + "https://api.julep.ai/api/sessions/YOUR_SESSION_ID/chat" +``` + +## Using Tools in Chat + +To use a tool during a chat session: + +```bash +curl -X POST "https://api.julep.ai/api/sessions/YOUR_SESSION_ID/chat" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "messages": [ + { + "role": "user", + "content": "Send an email to john@example.com about our meeting tomorrow." + } + ], + "tools": [ + { + "type": "function", + "function": { + "name": "send_email", + "description": "Send an email to a recipient", + "parameters": { + "type": "object", + "properties": { + "to": {"type": "string"}, + "subject": {"type": "string"}, + "body": {"type": "string"} + }, + "required": ["to", "subject", "body"] + } + } + } + ] + }' +``` + +## Next Steps + +- Explore [customizing tasks](./customizing_tasks.md) to create more complex interactions. +- Learn about [handling executions](./handling_executions.md) for long-running processes. \ No newline at end of file diff --git a/docs/introduction/core-concepts.md b/docs/introduction/core-concepts.md deleted file mode 100644 index 49bf6c335..000000000 --- a/docs/introduction/core-concepts.md +++ /dev/null @@ -1,3 +0,0 @@ -# Core Concepts - -* [Agents](../agents/overview.md) diff --git a/docs/introduction/getting_started.md b/docs/introduction/getting_started.md new file mode 100644 index 000000000..6aa590121 --- /dev/null +++ b/docs/introduction/getting_started.md @@ -0,0 +1,32 @@ +# Getting Started with Julep + +This guide will help you set up and start using the Julep API. + +## Prerequisites + +- A Julep API key +- Basic understanding of RESTful APIs +- Familiarity with JSON and curl (or any HTTP client) + +## Initial Setup + +1. Obtain your API key from the Julep dashboard. +2. Set up your environment to include the API key in all requests: + +```bash +export JULEP_API_KEY=your_api_key_here +``` + +3. Test your setup with a simple API call: + +```bash +curl -H "Authorization: Bearer $JULEP_API_KEY" https://api.julep.ai/api/agents +``` + +If successful, you should receive a list of agents (or an empty list if you haven't created any yet). + +## Next Steps + +- Create your first agent using the [Creating Your First Agent](../tutorials/creating_your_first_agent.md) tutorial. +- Explore the [API Reference](../reference/api_endpoints/) to learn about available endpoints. +- Check out the [How-to Guides](../how-to-guides/) for specific tasks and use cases. \ No newline at end of file diff --git a/docs/introduction/overview.md b/docs/introduction/overview.md new file mode 100644 index 000000000..a914535b5 --- /dev/null +++ b/docs/introduction/overview.md @@ -0,0 +1,14 @@ +# Overview of Julep + +Julep is a powerful backend system for managing agent execution and interactions. It provides a comprehensive set of features for creating and managing agents, users, sessions, tools, documents, tasks, and executions. + +## Key Features + +- **Agents**: Create and manage AI agents backed by foundation models like GPT-4 or Claude. +- **Sessions**: Maintain long-lived interactions with agents, with support for multiple agents and users. +- **Tools**: Integrate user-defined functions, system tools, and third-party integrations. +- **Documents**: Store and retrieve text snippets using a built-in vector database. +- **Tasks**: Define complex, multi-step workflows for agents to execute. +- **Executions**: Manage and monitor the execution of tasks, with support for parallel processing and error handling. + +Julep offers a flexible and powerful API for building sophisticated AI applications, with features like context management, tool integration, and workflow automation. \ No newline at end of file diff --git a/docs/js-sdk-docs/.nojekyll b/docs/js-sdk-docs/.nojekyll deleted file mode 100644 index e2ac6616a..000000000 --- a/docs/js-sdk-docs/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/js-sdk-docs/README.md b/docs/js-sdk-docs/README.md deleted file mode 100644 index a974d134d..000000000 --- a/docs/js-sdk-docs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -@julep/sdk / [Modules](modules.md) - -@julep/sdk diff --git a/docs/js-sdk-docs/classes/api.ApiError.md b/docs/js-sdk-docs/classes/api.ApiError.md deleted file mode 100644 index ed7cf7b7a..000000000 --- a/docs/js-sdk-docs/classes/api.ApiError.md +++ /dev/null @@ -1,228 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [api](../modules/api.md) / ApiError - -# Class: ApiError - -[api](../modules/api.md).ApiError - -## Hierarchy - -- `Error` - - ↳ **`ApiError`** - -## Table of contents - -### Constructors - -- [constructor](api.ApiError.md#constructor) - -### Properties - -- [body](api.ApiError.md#body) -- [message](api.ApiError.md#message) -- [name](api.ApiError.md#name) -- [request](api.ApiError.md#request) -- [stack](api.ApiError.md#stack) -- [status](api.ApiError.md#status) -- [statusText](api.ApiError.md#statustext) -- [url](api.ApiError.md#url) -- [prepareStackTrace](api.ApiError.md#preparestacktrace) -- [stackTraceLimit](api.ApiError.md#stacktracelimit) - -### Methods - -- [captureStackTrace](api.ApiError.md#capturestacktrace) - -## Constructors - -### constructor - -• **new ApiError**(`request`, `response`, `message`): [`ApiError`](api.ApiError.md) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `request` | `ApiRequestOptions` | -| `response` | `ApiResult` | -| `message` | `string` | - -#### Returns - -[`ApiError`](api.ApiError.md) - -#### Overrides - -Error.constructor - -#### Defined in - -[src/api/core/ApiError.ts:15](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/ApiError.ts#L15) - -## Properties - -### body - -• `Readonly` **body**: `any` - -#### Defined in - -[src/api/core/ApiError.ts:12](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/ApiError.ts#L12) - -___ - -### message - -• **message**: `string` - -#### Inherited from - -Error.message - -#### Defined in - -node_modules/typescript/lib/lib.es5.d.ts:1077 - -___ - -### name - -• **name**: `string` - -#### Inherited from - -Error.name - -#### Defined in - -node_modules/typescript/lib/lib.es5.d.ts:1076 - -___ - -### request - -• `Readonly` **request**: `ApiRequestOptions` - -#### Defined in - -[src/api/core/ApiError.ts:13](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/ApiError.ts#L13) - -___ - -### stack - -• `Optional` **stack**: `string` - -#### Inherited from - -Error.stack - -#### Defined in - -node_modules/typescript/lib/lib.es5.d.ts:1078 - -___ - -### status - -• `Readonly` **status**: `number` - -#### Defined in - -[src/api/core/ApiError.ts:10](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/ApiError.ts#L10) - -___ - -### statusText - -• `Readonly` **statusText**: `string` - -#### Defined in - -[src/api/core/ApiError.ts:11](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/ApiError.ts#L11) - -___ - -### url - -• `Readonly` **url**: `string` - -#### Defined in - -[src/api/core/ApiError.ts:9](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/ApiError.ts#L9) - -___ - -### prepareStackTrace - -▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` - -Optional override for formatting stack traces - -**`See`** - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Type declaration - -▸ (`err`, `stackTraces`): `any` - -##### Parameters - -| Name | Type | -| :------ | :------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -##### Returns - -`any` - -#### Inherited from - -Error.prepareStackTrace - -#### Defined in - -node_modules/@types/node/globals.d.ts:28 - -___ - -### stackTraceLimit - -▪ `Static` **stackTraceLimit**: `number` - -#### Inherited from - -Error.stackTraceLimit - -#### Defined in - -node_modules/@types/node/globals.d.ts:30 - -## Methods - -### captureStackTrace - -▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Create .stack property on a target object - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -Error.captureStackTrace - -#### Defined in - -node_modules/@types/node/globals.d.ts:21 diff --git a/docs/js-sdk-docs/classes/api.BaseHttpRequest.md b/docs/js-sdk-docs/classes/api.BaseHttpRequest.md deleted file mode 100644 index c2531523d..000000000 --- a/docs/js-sdk-docs/classes/api.BaseHttpRequest.md +++ /dev/null @@ -1,75 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [api](../modules/api.md) / BaseHttpRequest - -# Class: BaseHttpRequest - -[api](../modules/api.md).BaseHttpRequest - -## Table of contents - -### Constructors - -- [constructor](api.BaseHttpRequest.md#constructor) - -### Properties - -- [config](api.BaseHttpRequest.md#config) - -### Methods - -- [request](api.BaseHttpRequest.md#request) - -## Constructors - -### constructor - -• **new BaseHttpRequest**(`config`): [`BaseHttpRequest`](api.BaseHttpRequest.md) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `config` | [`OpenAPIConfig`](../modules/api.md#openapiconfig) | - -#### Returns - -[`BaseHttpRequest`](api.BaseHttpRequest.md) - -#### Defined in - -[src/api/core/BaseHttpRequest.ts:10](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/BaseHttpRequest.ts#L10) - -## Properties - -### config - -• `Readonly` **config**: [`OpenAPIConfig`](../modules/api.md#openapiconfig) - -#### Defined in - -[src/api/core/BaseHttpRequest.ts:10](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/BaseHttpRequest.ts#L10) - -## Methods - -### request - -▸ **request**\<`T`\>(`options`): [`CancelablePromise`](api.CancelablePromise.md)\<`T`\> - -#### Type parameters - -| Name | -| :------ | -| `T` | - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `ApiRequestOptions` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<`T`\> - -#### Defined in - -[src/api/core/BaseHttpRequest.ts:12](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/BaseHttpRequest.ts#L12) diff --git a/docs/js-sdk-docs/classes/api.CancelError.md b/docs/js-sdk-docs/classes/api.CancelError.md deleted file mode 100644 index b3bd3b05c..000000000 --- a/docs/js-sdk-docs/classes/api.CancelError.md +++ /dev/null @@ -1,189 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [api](../modules/api.md) / CancelError - -# Class: CancelError - -[api](../modules/api.md).CancelError - -## Hierarchy - -- `Error` - - ↳ **`CancelError`** - -## Table of contents - -### Constructors - -- [constructor](api.CancelError.md#constructor) - -### Properties - -- [message](api.CancelError.md#message) -- [name](api.CancelError.md#name) -- [stack](api.CancelError.md#stack) -- [prepareStackTrace](api.CancelError.md#preparestacktrace) -- [stackTraceLimit](api.CancelError.md#stacktracelimit) - -### Accessors - -- [isCancelled](api.CancelError.md#iscancelled) - -### Methods - -- [captureStackTrace](api.CancelError.md#capturestacktrace) - -## Constructors - -### constructor - -• **new CancelError**(`message`): [`CancelError`](api.CancelError.md) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `message` | `string` | - -#### Returns - -[`CancelError`](api.CancelError.md) - -#### Overrides - -Error.constructor - -#### Defined in - -[src/api/core/CancelablePromise.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L6) - -## Properties - -### message - -• **message**: `string` - -#### Inherited from - -Error.message - -#### Defined in - -node_modules/typescript/lib/lib.es5.d.ts:1077 - -___ - -### name - -• **name**: `string` - -#### Inherited from - -Error.name - -#### Defined in - -node_modules/typescript/lib/lib.es5.d.ts:1076 - -___ - -### stack - -• `Optional` **stack**: `string` - -#### Inherited from - -Error.stack - -#### Defined in - -node_modules/typescript/lib/lib.es5.d.ts:1078 - -___ - -### prepareStackTrace - -▪ `Static` `Optional` **prepareStackTrace**: (`err`: `Error`, `stackTraces`: `CallSite`[]) => `any` - -Optional override for formatting stack traces - -**`See`** - -https://v8.dev/docs/stack-trace-api#customizing-stack-traces - -#### Type declaration - -▸ (`err`, `stackTraces`): `any` - -##### Parameters - -| Name | Type | -| :------ | :------ | -| `err` | `Error` | -| `stackTraces` | `CallSite`[] | - -##### Returns - -`any` - -#### Inherited from - -Error.prepareStackTrace - -#### Defined in - -node_modules/@types/node/globals.d.ts:28 - -___ - -### stackTraceLimit - -▪ `Static` **stackTraceLimit**: `number` - -#### Inherited from - -Error.stackTraceLimit - -#### Defined in - -node_modules/@types/node/globals.d.ts:30 - -## Accessors - -### isCancelled - -• `get` **isCancelled**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[src/api/core/CancelablePromise.ts:11](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L11) - -## Methods - -### captureStackTrace - -▸ **captureStackTrace**(`targetObject`, `constructorOpt?`): `void` - -Create .stack property on a target object - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `targetObject` | `object` | -| `constructorOpt?` | `Function` | - -#### Returns - -`void` - -#### Inherited from - -Error.captureStackTrace - -#### Defined in - -node_modules/@types/node/globals.d.ts:21 diff --git a/docs/js-sdk-docs/classes/api.CancelablePromise.md b/docs/js-sdk-docs/classes/api.CancelablePromise.md deleted file mode 100644 index b9e1c1ffc..000000000 --- a/docs/js-sdk-docs/classes/api.CancelablePromise.md +++ /dev/null @@ -1,299 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [api](../modules/api.md) / CancelablePromise - -# Class: CancelablePromise\ - -[api](../modules/api.md).CancelablePromise - -## Type parameters - -| Name | -| :------ | -| `T` | - -## Implements - -- `Promise`\<`T`\> - -## Table of contents - -### Constructors - -- [constructor](api.CancelablePromise.md#constructor) - -### Properties - -- [#cancelHandlers](api.CancelablePromise.md##cancelhandlers) -- [#isCancelled](api.CancelablePromise.md##iscancelled) -- [#isRejected](api.CancelablePromise.md##isrejected) -- [#isResolved](api.CancelablePromise.md##isresolved) -- [#promise](api.CancelablePromise.md##promise) -- [#reject](api.CancelablePromise.md##reject) -- [#resolve](api.CancelablePromise.md##resolve) - -### Accessors - -- [[toStringTag]](api.CancelablePromise.md#[tostringtag]) -- [isCancelled](api.CancelablePromise.md#iscancelled) - -### Methods - -- [cancel](api.CancelablePromise.md#cancel) -- [catch](api.CancelablePromise.md#catch) -- [finally](api.CancelablePromise.md#finally) -- [then](api.CancelablePromise.md#then) - -## Constructors - -### constructor - -• **new CancelablePromise**\<`T`\>(`executor`): [`CancelablePromise`](api.CancelablePromise.md)\<`T`\> - -#### Type parameters - -| Name | -| :------ | -| `T` | - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `executor` | (`resolve`: (`value`: `T` \| `PromiseLike`\<`T`\>) => `void`, `reject`: (`reason?`: `any`) => `void`, `onCancel`: `OnCancel`) => `void` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<`T`\> - -#### Defined in - -[src/api/core/CancelablePromise.ts:33](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L33) - -## Properties - -### #cancelHandlers - -• `Private` `Readonly` **#cancelHandlers**: () => `void`[] - -#### Defined in - -[src/api/core/CancelablePromise.ts:28](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L28) - -___ - -### #isCancelled - -• `Private` **#isCancelled**: `boolean` - -#### Defined in - -[src/api/core/CancelablePromise.ts:27](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L27) - -___ - -### #isRejected - -• `Private` **#isRejected**: `boolean` - -#### Defined in - -[src/api/core/CancelablePromise.ts:26](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L26) - -___ - -### #isResolved - -• `Private` **#isResolved**: `boolean` - -#### Defined in - -[src/api/core/CancelablePromise.ts:25](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L25) - -___ - -### #promise - -• `Private` `Readonly` **#promise**: `Promise`\<`T`\> - -#### Defined in - -[src/api/core/CancelablePromise.ts:29](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L29) - -___ - -### #reject - -• `Private` `Optional` **#reject**: (`reason?`: `any`) => `void` - -#### Type declaration - -▸ (`reason?`): `void` - -##### Parameters - -| Name | Type | -| :------ | :------ | -| `reason?` | `any` | - -##### Returns - -`void` - -#### Defined in - -[src/api/core/CancelablePromise.ts:31](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L31) - -___ - -### #resolve - -• `Private` `Optional` **#resolve**: (`value`: `T` \| `PromiseLike`\<`T`\>) => `void` - -#### Type declaration - -▸ (`value`): `void` - -##### Parameters - -| Name | Type | -| :------ | :------ | -| `value` | `T` \| `PromiseLike`\<`T`\> | - -##### Returns - -`void` - -#### Defined in - -[src/api/core/CancelablePromise.ts:30](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L30) - -## Accessors - -### [toStringTag] - -• `get` **[toStringTag]**(): `string` - -#### Returns - -`string` - -#### Implementation of - -Promise.[toStringTag] - -#### Defined in - -[src/api/core/CancelablePromise.ts:87](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L87) - -___ - -### isCancelled - -• `get` **isCancelled**(): `boolean` - -#### Returns - -`boolean` - -#### Defined in - -[src/api/core/CancelablePromise.ts:127](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L127) - -## Methods - -### cancel - -▸ **cancel**(): `void` - -#### Returns - -`void` - -#### Defined in - -[src/api/core/CancelablePromise.ts:108](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L108) - -___ - -### catch - -▸ **catch**\<`TResult`\>(`onRejected?`): `Promise`\<`T` \| `TResult`\> - -#### Type parameters - -| Name | Type | -| :------ | :------ | -| `TResult` | `never` | - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `onRejected?` | ``null`` \| (`reason`: `any`) => `TResult` \| `PromiseLike`\<`TResult`\> | - -#### Returns - -`Promise`\<`T` \| `TResult`\> - -#### Implementation of - -Promise.catch - -#### Defined in - -[src/api/core/CancelablePromise.ts:98](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L98) - -___ - -### finally - -▸ **finally**(`onFinally?`): `Promise`\<`T`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `onFinally?` | ``null`` \| () => `void` | - -#### Returns - -`Promise`\<`T`\> - -#### Implementation of - -Promise.finally - -#### Defined in - -[src/api/core/CancelablePromise.ts:104](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L104) - -___ - -### then - -▸ **then**\<`TResult1`, `TResult2`\>(`onFulfilled?`, `onRejected?`): `Promise`\<`TResult1` \| `TResult2`\> - -#### Type parameters - -| Name | Type | -| :------ | :------ | -| `TResult1` | `T` | -| `TResult2` | `never` | - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `onFulfilled?` | ``null`` \| (`value`: `T`) => `TResult1` \| `PromiseLike`\<`TResult1`\> | -| `onRejected?` | ``null`` \| (`reason`: `any`) => `TResult2` \| `PromiseLike`\<`TResult2`\> | - -#### Returns - -`Promise`\<`TResult1` \| `TResult2`\> - -#### Implementation of - -Promise.then - -#### Defined in - -[src/api/core/CancelablePromise.ts:91](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/CancelablePromise.ts#L91) diff --git a/docs/js-sdk-docs/classes/api.DefaultService.md b/docs/js-sdk-docs/classes/api.DefaultService.md deleted file mode 100644 index b692d0bb6..000000000 --- a/docs/js-sdk-docs/classes/api.DefaultService.md +++ /dev/null @@ -1,1194 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [api](../modules/api.md) / DefaultService - -# Class: DefaultService - -[api](../modules/api.md).DefaultService - -## Table of contents - -### Constructors - -- [constructor](api.DefaultService.md#constructor) - -### Properties - -- [httpRequest](api.DefaultService.md#httprequest) - -### Methods - -- [chat](api.DefaultService.md#chat) -- [createAgent](api.DefaultService.md#createagent) -- [createAgentDoc](api.DefaultService.md#createagentdoc) -- [createAgentTool](api.DefaultService.md#createagenttool) -- [createSession](api.DefaultService.md#createsession) -- [createUser](api.DefaultService.md#createuser) -- [createUserDoc](api.DefaultService.md#createuserdoc) -- [deleteAgent](api.DefaultService.md#deleteagent) -- [deleteAgentDoc](api.DefaultService.md#deleteagentdoc) -- [deleteAgentMemory](api.DefaultService.md#deleteagentmemory) -- [deleteAgentTool](api.DefaultService.md#deleteagenttool) -- [deleteSession](api.DefaultService.md#deletesession) -- [deleteSessionHistory](api.DefaultService.md#deletesessionhistory) -- [deleteUser](api.DefaultService.md#deleteuser) -- [deleteUserDoc](api.DefaultService.md#deleteuserdoc) -- [getAgent](api.DefaultService.md#getagent) -- [getAgentDocs](api.DefaultService.md#getagentdocs) -- [getAgentMemories](api.DefaultService.md#getagentmemories) -- [getAgentTools](api.DefaultService.md#getagenttools) -- [getHistory](api.DefaultService.md#gethistory) -- [getJobStatus](api.DefaultService.md#getjobstatus) -- [getSession](api.DefaultService.md#getsession) -- [getSuggestions](api.DefaultService.md#getsuggestions) -- [getUser](api.DefaultService.md#getuser) -- [getUserDocs](api.DefaultService.md#getuserdocs) -- [listAgents](api.DefaultService.md#listagents) -- [listSessions](api.DefaultService.md#listsessions) -- [listUsers](api.DefaultService.md#listusers) -- [patchAgent](api.DefaultService.md#patchagent) -- [patchAgentTool](api.DefaultService.md#patchagenttool) -- [patchSession](api.DefaultService.md#patchsession) -- [patchUser](api.DefaultService.md#patchuser) -- [updateAgent](api.DefaultService.md#updateagent) -- [updateAgentTool](api.DefaultService.md#updateagenttool) -- [updateSession](api.DefaultService.md#updatesession) -- [updateUser](api.DefaultService.md#updateuser) - -## Constructors - -### constructor - -• **new DefaultService**(`httpRequest`): [`DefaultService`](api.DefaultService.md) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `httpRequest` | [`BaseHttpRequest`](api.BaseHttpRequest.md) | - -#### Returns - -[`DefaultService`](api.DefaultService.md) - -#### Defined in - -[src/api/services/DefaultService.ts:35](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L35) - -## Properties - -### httpRequest - -• `Readonly` **httpRequest**: [`BaseHttpRequest`](api.BaseHttpRequest.md) - -#### Defined in - -[src/api/services/DefaultService.ts:35](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L35) - -## Methods - -### chat - -▸ **chat**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ChatResponse`](../modules/api.md#chatresponse)\> - -Interact with the session - -#### Parameters - -| Name | Type | Default value | -| :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | -| › `accept?` | ``"application/json"`` \| ``"text/event-stream"`` | `"application/json"` | -| › `requestBody?` | [`ChatInput`](../modules/api.md#chatinput) | `undefined` | -| › `sessionId` | `string` | `undefined` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ChatResponse`](../modules/api.md#chatresponse)\> - -ChatResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:404](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L404) - -___ - -### createAgent - -▸ **createAgent**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -Create a new agent -Create a new agent - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `«destructured»` | `Object` | - | -| › `requestBody?` | [`CreateAgentRequest`](../modules/api.md#createagentrequest) | Agent create options | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -ResourceCreatedResponse Agent successfully created - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:180](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L180) - -___ - -### createAgentDoc - -▸ **createAgentDoc**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -Create doc of the agent - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `requestBody?` | [`CreateDoc`](../modules/api.md#createdoc) | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -ResourceCreatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:668](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L668) - -___ - -### createAgentTool - -▸ **createAgentTool**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -Create tool for the agent - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `requestBody?` | [`CreateToolRequest`](../modules/api.md#createtoolrequest) | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -ResourceCreatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:857](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L857) - -___ - -### createSession - -▸ **createSession**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -Create a new session -Create a session between an agent and a user - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `«destructured»` | `Object` | - | -| › `requestBody?` | [`CreateSessionRequest`](../modules/api.md#createsessionrequest) | Session initialization options | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -ResourceCreatedResponse Session successfully created - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:42](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L42) - -___ - -### createUser - -▸ **createUser**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -Create a new user -Create a new user - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `«destructured»` | `Object` | - | -| › `requestBody?` | [`CreateUserRequest`](../modules/api.md#createuserrequest) | User create options | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -ResourceCreatedResponse User successfully created - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:111](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L111) - -___ - -### createUserDoc - -▸ **createUserDoc**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -Create doc of the user - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `requestBody?` | [`CreateDoc`](../modules/api.md#createdoc) | -| › `userId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -ResourceCreatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:740](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L740) - -___ - -### deleteAgent - -▸ **deleteAgent**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete agent - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:556](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L556) - -___ - -### deleteAgentDoc - -▸ **deleteAgentDoc**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete doc by id - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `docId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:783](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L783) - -___ - -### deleteAgentMemory - -▸ **deleteAgentMemory**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete memory of the agent by id - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `memoryId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:804](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L804) - -___ - -### deleteAgentTool - -▸ **deleteAgentTool**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete tool by id - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `toolId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:879](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L879) - -___ - -### deleteSession - -▸ **deleteSession**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete session - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `sessionId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:266](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L266) - -___ - -### deleteSessionHistory - -▸ **deleteSessionHistory**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete session history (does NOT delete related memories) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `sessionId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:386](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L386) - -___ - -### deleteUser - -▸ **deleteUser**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete user - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `userId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:480](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L480) - -___ - -### deleteUserDoc - -▸ **deleteUserDoc**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -Delete doc by id - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `docId` | `string` | -| › `userId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceDeletedResponse`](../modules/api.md#resourcedeletedresponse)\> - -ResourceDeletedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:762](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L762) - -___ - -### getAgent - -▸ **getAgent**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`Agent`](../modules/api.md#agent)\> - -Get details of the agent - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`Agent`](../modules/api.md#agent)\> - -Agent - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:542](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L542) - -___ - -### getAgentDocs - -▸ **getAgentDocs**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\> - -Get docs of the agent -Sorted (created_at descending) - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | - | -| › `agentId` | `string` | `undefined` | - | -| › `limit?` | `number` | `undefined` | - | -| › `metadataFilter?` | `string` | `"{}"` | JSON object that should be used to filter objects by metadata | -| › `offset?` | `number` | `undefined` | - | -| › `order?` | ``"desc"`` \| ``"asc"`` | `"desc"` | Which order should the sort be: `asc` (ascending) or `desc` (descending) | -| › `requestBody?` | `any` | `undefined` | - | -| › `sortBy?` | ``"created_at"`` \| ``"updated_at"`` | `"created_at"` | Which field to sort by: `created_at` or `updated_at` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\> - -any - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:619](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L619) - -___ - -### getAgentMemories - -▸ **getAgentMemories**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Memory`](../modules/api.md#memory)[] }\> - -Get memories of the agent -Sorted (created_at descending) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `limit?` | `number` | -| › `offset?` | `number` | -| › `query` | `string` | -| › `userId?` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Memory`](../modules/api.md#memory)[] }\> - -any - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:432](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L432) - -___ - -### getAgentTools - -▸ **getAgentTools**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Tool`](../modules/api.md#tool)[] }\> - -Get tools of the agent -Sorted (created_at descending) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `limit?` | `number` | -| › `offset?` | `number` | -| › `requestBody?` | `any` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Tool`](../modules/api.md#tool)[] }\> - -any - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:826](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L826) - -___ - -### getHistory - -▸ **getHistory**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`ChatMLMessage`](../modules/api.md#chatmlmessage)[] }\> - -Get all messages in a session -Sorted (created_at ascending) - -#### Parameters - -| Name | Type | Default value | -| :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | -| › `limit?` | `number` | `100` | -| › `offset?` | `number` | `undefined` | -| › `sessionId` | `string` | `undefined` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`ChatMLMessage`](../modules/api.md#chatmlmessage)[] }\> - -any - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:358](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L358) - -___ - -### getJobStatus - -▸ **getJobStatus**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`JobStatus`](../modules/api.md#jobstatus)\> - -Get status of the job - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `jobId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`JobStatus`](../modules/api.md#jobstatus)\> - -JobStatus - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:950](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L950) - -___ - -### getSession - -▸ **getSession**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`Session`](../modules/api.md#session)\> - -Get details of the session - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `sessionId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`Session`](../modules/api.md#session)\> - -Session - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:248](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L248) - -___ - -### getSuggestions - -▸ **getSuggestions**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Suggestion`](../modules/api.md#suggestion)[] }\> - -Get autogenerated suggestions for session user and agent -Sorted (created_at descending) - -#### Parameters - -| Name | Type | Default value | -| :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | -| › `limit?` | `number` | `100` | -| › `offset?` | `number` | `undefined` | -| › `sessionId` | `string` | `undefined` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Suggestion`](../modules/api.md#suggestion)[] }\> - -any - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:329](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L329) - -___ - -### getUser - -▸ **getUser**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`User`](../modules/api.md#user)\> - -Get details of the user - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `userId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`User`](../modules/api.md#user)\> - -User - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:466](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L466) - -___ - -### getUserDocs - -▸ **getUserDocs**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\> - -Get docs of the user -Sorted (created_at descending) - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | - | -| › `limit?` | `number` | `undefined` | - | -| › `metadataFilter?` | `string` | `"{}"` | JSON object that should be used to filter objects by metadata | -| › `offset?` | `number` | `undefined` | - | -| › `order?` | ``"desc"`` \| ``"asc"`` | `"desc"` | Which order should the sort be: `asc` (ascending) or `desc` (descending) | -| › `requestBody?` | `any` | `undefined` | - | -| › `sortBy?` | ``"created_at"`` \| ``"updated_at"`` | `"created_at"` | Which field to sort by: `created_at` or `updated_at` | -| › `userId` | `string` | `undefined` | - | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\> - -any - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:691](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L691) - -___ - -### listAgents - -▸ **listAgents**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items`: [`Agent`](../modules/api.md#agent)[] }\> - -List agents -List agents created (use limit/offset pagination to get large number of sessions; sorted by descending order of `created_at` by default) - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | - | -| › `limit?` | `number` | `100` | Number of items to return | -| › `metadataFilter?` | `string` | `"{}"` | JSON object that should be used to filter objects by metadata | -| › `offset?` | `number` | `undefined` | Number of items to skip (sorted created_at descending order) | -| › `order?` | ``"desc"`` \| ``"asc"`` | `"desc"` | Which order should the sort be: `asc` (ascending) or `desc` (descending) | -| › `sortBy?` | ``"created_at"`` \| ``"updated_at"`` | `"created_at"` | Which field to sort by: `created_at` or `updated_at` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items`: [`Agent`](../modules/api.md#agent)[] }\> - -any List of agents (sorted created_at descending order) with limit+offset pagination - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:201](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L201) - -___ - -### listSessions - -▸ **listSessions**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items`: [`Session`](../modules/api.md#session)[] }\> - -List sessions -List sessions created (use limit/offset pagination to get large number of sessions; sorted by descending order of `created_at` by default) - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | - | -| › `limit?` | `number` | `100` | Number of sessions to return | -| › `metadataFilter?` | `string` | `"{}"` | JSON object that should be used to filter objects by metadata | -| › `offset?` | `number` | `undefined` | Number of sessions to skip (sorted created_at descending order) | -| › `order?` | ``"desc"`` \| ``"asc"`` | `"desc"` | Which order should the sort be: `asc` (ascending) or `desc` (descending) | -| › `sortBy?` | ``"created_at"`` \| ``"updated_at"`` | `"created_at"` | Which field to sort by: `created_at` or `updated_at` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items`: [`Session`](../modules/api.md#session)[] }\> - -any List of sessions (sorted created_at descending order) with limit+offset pagination - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:63](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L63) - -___ - -### listUsers - -▸ **listUsers**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items`: [`User`](../modules/api.md#user)[] }\> - -List users -List users created (use limit/offset pagination to get large number of sessions; sorted by descending order of `created_at` by default) - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `«destructured»` | `Object` | `undefined` | - | -| › `limit?` | `number` | `100` | Number of items to return | -| › `metadataFilter?` | `string` | `"{}"` | JSON object that should be used to filter objects by metadata | -| › `offset?` | `number` | `undefined` | Number of items to skip (sorted created_at descending order) | -| › `order?` | ``"desc"`` \| ``"asc"`` | `"desc"` | Which order should the sort be: `asc` (ascending) or `desc` (descending) | -| › `sortBy?` | ``"created_at"`` \| ``"updated_at"`` | `"created_at"` | Which field to sort by: `created_at` or `updated_at` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items`: [`User`](../modules/api.md#user)[] }\> - -any List of users (sorted created_at descending order) with limit+offset pagination - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:132](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L132) - -___ - -### patchAgent - -▸ **patchAgent**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Patch Agent parameters (merge instead of replace) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `requestBody?` | [`PatchAgentRequest`](../modules/api.md#patchagentrequest) | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:596](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L596) - -___ - -### patchAgentTool - -▸ **patchAgentTool**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Patch Agent tool parameters (merge instead of replace) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `requestBody?` | [`PatchToolRequest`](../modules/api.md#patchtoolrequest) | -| › `toolId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:925](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L925) - -___ - -### patchSession - -▸ **patchSession**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Patch Session parameters (merge instead of replace) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `requestBody?` | [`PatchSessionRequest`](../modules/api.md#patchsessionrequest) | -| › `sessionId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:306](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L306) - -___ - -### patchUser - -▸ **patchUser**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Patch User parameters (merge instead of replace) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `requestBody?` | [`PatchUserRequest`](../modules/api.md#patchuserrequest) | -| › `userId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:520](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L520) - -___ - -### updateAgent - -▸ **updateAgent**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Update agent parameters - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `requestBody?` | [`UpdateAgentRequest`](../modules/api.md#updateagentrequest) | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:574](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L574) - -___ - -### updateAgentTool - -▸ **updateAgentTool**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Update agent tool definition - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `agentId` | `string` | -| › `requestBody?` | [`UpdateToolRequest`](../modules/api.md#updatetoolrequest) | -| › `toolId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:900](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L900) - -___ - -### updateSession - -▸ **updateSession**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Update session parameters - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `requestBody?` | [`UpdateSessionRequest`](../modules/api.md#updatesessionrequest) | -| › `sessionId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:284](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L284) - -___ - -### updateUser - -▸ **updateUser**(`«destructured»`): [`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -Update user parameters - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `«destructured»` | `Object` | -| › `requestBody?` | [`UpdateUserRequest`](../modules/api.md#updateuserrequest) | -| › `userId` | `string` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -ResourceUpdatedResponse - -**`Throws`** - -ApiError - -#### Defined in - -[src/api/services/DefaultService.ts:498](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/services/DefaultService.ts#L498) diff --git a/docs/js-sdk-docs/classes/api_JulepApiClient.JulepApiClient.md b/docs/js-sdk-docs/classes/api_JulepApiClient.JulepApiClient.md deleted file mode 100644 index bb4c4a4a2..000000000 --- a/docs/js-sdk-docs/classes/api_JulepApiClient.JulepApiClient.md +++ /dev/null @@ -1,57 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [api/JulepApiClient](../modules/api_JulepApiClient.md) / JulepApiClient - -# Class: JulepApiClient - -[api/JulepApiClient](../modules/api_JulepApiClient.md).JulepApiClient - -## Table of contents - -### Constructors - -- [constructor](api_JulepApiClient.JulepApiClient.md#constructor) - -### Properties - -- [default](api_JulepApiClient.JulepApiClient.md#default) -- [request](api_JulepApiClient.JulepApiClient.md#request) - -## Constructors - -### constructor - -• **new JulepApiClient**(`config?`, `HttpRequest?`): [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -#### Parameters - -| Name | Type | Default value | -| :------ | :------ | :------ | -| `config?` | `Partial`\<[`OpenAPIConfig`](../modules/api.md#openapiconfig)\> | `undefined` | -| `HttpRequest` | `HttpRequestConstructor` | `AxiosHttpRequest` | - -#### Returns - -[`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -#### Defined in - -[src/api/JulepApiClient.ts:13](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/JulepApiClient.ts#L13) - -## Properties - -### default - -• `Readonly` **default**: [`DefaultService`](api.DefaultService.md) - -#### Defined in - -[src/api/JulepApiClient.ts:11](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/JulepApiClient.ts#L11) - -___ - -### request - -• `Readonly` **request**: [`BaseHttpRequest`](api.BaseHttpRequest.md) - -#### Defined in - -[src/api/JulepApiClient.ts:12](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/JulepApiClient.ts#L12) diff --git a/docs/js-sdk-docs/classes/managers_agent.AgentsManager.md b/docs/js-sdk-docs/classes/managers_agent.AgentsManager.md deleted file mode 100644 index 30235e467..000000000 --- a/docs/js-sdk-docs/classes/managers_agent.AgentsManager.md +++ /dev/null @@ -1,204 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/agent](../modules/managers_agent.md) / AgentsManager - -# Class: AgentsManager - -[managers/agent](../modules/managers_agent.md).AgentsManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- [`BaseManager`](managers_base.BaseManager.md) - - ↳ **`AgentsManager`** - -## Table of contents - -### Constructors - -- [constructor](managers_agent.AgentsManager.md#constructor) - -### Properties - -- [apiClient](managers_agent.AgentsManager.md#apiclient) - -### Methods - -- [create](managers_agent.AgentsManager.md#create) -- [delete](managers_agent.AgentsManager.md#delete) -- [get](managers_agent.AgentsManager.md#get) -- [list](managers_agent.AgentsManager.md#list) -- [update](managers_agent.AgentsManager.md#update) - -## Constructors - -### constructor - -• **new AgentsManager**(`apiClient`): [`AgentsManager`](managers_agent.AgentsManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`AgentsManager`](managers_agent.AgentsManager.md) - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[constructor](managers_base.BaseManager.md#constructor) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[apiClient](managers_base.BaseManager.md#apiclient) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Methods - -### create - -▸ **create**(`options`): `Promise`\<`Partial`\<[`Agent`](../modules/api.md#agent)\> & \{ `id`: `string` }\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.about` | `string` | -| `options.default_settings?` | [`AgentDefaultSettings`](../modules/api.md#agentdefaultsettings) | -| `options.docs?` | [`Doc`](../modules/api.md#doc)[] | -| `options.instructions` | `string` \| `string`[] | -| `options.model?` | `string` | -| `options.name` | `string` | -| `options.tools?` | [`CreateToolRequest`](../modules/api.md#createtoolrequest)[] | - -#### Returns - -`Promise`\<`Partial`\<[`Agent`](../modules/api.md#agent)\> & \{ `id`: `string` }\> - -#### Defined in - -[src/managers/agent.ts:23](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/agent.ts#L23) - -___ - -### delete - -▸ **delete**(`agentId`): `Promise`\<`void`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `agentId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[src/managers/agent.ts:108](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/agent.ts#L108) - -___ - -### get - -▸ **get**(`agentId`): `Promise`\<[`Agent`](../modules/api.md#agent)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `agentId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<[`Agent`](../modules/api.md#agent)\> - -#### Defined in - -[src/managers/agent.ts:17](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/agent.ts#L17) - -___ - -### list - -▸ **list**(`options?`): `Promise`\<[`Agent`](../modules/api.md#agent)[]\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.metadataFilter?` | `Object` | -| `options.offset?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``0``\> | - -#### Returns - -`Promise`\<[`Agent`](../modules/api.md#agent)[]\> - -#### Defined in - -[src/managers/agent.ts:74](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/agent.ts#L74) - -___ - -### update - -▸ **update**(`agentId`, `request`, `overwrite?`): `Promise`\<`Partial`\<[`Agent`](../modules/api.md#agent)\> & \{ `id`: `string` }\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `agentId` | `string` | -| `request` | [`PatchAgentRequest`](../modules/api.md#patchagentrequest) | -| `overwrite?` | ``false`` | - -#### Returns - -`Promise`\<`Partial`\<[`Agent`](../modules/api.md#agent)\> & \{ `id`: `string` }\> - -#### Defined in - -[src/managers/agent.ts:115](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/agent.ts#L115) - -▸ **update**(`agentId`, `request`, `overwrite`): `Promise`\<`Partial`\<[`Agent`](../modules/api.md#agent)\> & \{ `id`: `string` }\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `agentId` | `string` | -| `request` | [`UpdateAgentRequest`](../modules/api.md#updateagentrequest) | -| `overwrite` | ``true`` | - -#### Returns - -`Promise`\<`Partial`\<[`Agent`](../modules/api.md#agent)\> & \{ `id`: `string` }\> - -#### Defined in - -[src/managers/agent.ts:121](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/agent.ts#L121) diff --git a/docs/js-sdk-docs/classes/managers_base.BaseManager.md b/docs/js-sdk-docs/classes/managers_base.BaseManager.md deleted file mode 100644 index 04ad76162..000000000 --- a/docs/js-sdk-docs/classes/managers_base.BaseManager.md +++ /dev/null @@ -1,68 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/base](../modules/managers_base.md) / BaseManager - -# Class: BaseManager - -[managers/base](../modules/managers_base.md).BaseManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- **`BaseManager`** - - ↳ [`AgentsManager`](managers_agent.AgentsManager.md) - - ↳ [`DocsManager`](managers_doc.DocsManager.md) - - ↳ [`MemoriesManager`](managers_memory.MemoriesManager.md) - - ↳ [`SessionsManager`](managers_session.SessionsManager.md) - - ↳ [`ToolsManager`](managers_tool.ToolsManager.md) - - ↳ [`UsersManager`](managers_user.UsersManager.md) - -## Table of contents - -### Constructors - -- [constructor](managers_base.BaseManager.md#constructor) - -### Properties - -- [apiClient](managers_base.BaseManager.md#apiclient) - -## Constructors - -### constructor - -• **new BaseManager**(`apiClient`): [`BaseManager`](managers_base.BaseManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`BaseManager`](managers_base.BaseManager.md) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) diff --git a/docs/js-sdk-docs/classes/managers_doc.DocsManager.md b/docs/js-sdk-docs/classes/managers_doc.DocsManager.md deleted file mode 100644 index 02bcf2f15..000000000 --- a/docs/js-sdk-docs/classes/managers_doc.DocsManager.md +++ /dev/null @@ -1,209 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/doc](../modules/managers_doc.md) / DocsManager - -# Class: DocsManager - -[managers/doc](../modules/managers_doc.md).DocsManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- [`BaseManager`](managers_base.BaseManager.md) - - ↳ **`DocsManager`** - -## Table of contents - -### Constructors - -- [constructor](managers_doc.DocsManager.md#constructor) - -### Properties - -- [apiClient](managers_doc.DocsManager.md#apiclient) - -### Methods - -- [create](managers_doc.DocsManager.md#create) -- [delete](managers_doc.DocsManager.md#delete) -- [get](managers_doc.DocsManager.md#get) -- [list](managers_doc.DocsManager.md#list) - -## Constructors - -### constructor - -• **new DocsManager**(`apiClient`): [`DocsManager`](managers_doc.DocsManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`DocsManager`](managers_doc.DocsManager.md) - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[constructor](managers_base.BaseManager.md#constructor) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[apiClient](managers_base.BaseManager.md#apiclient) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Methods - -### create - -▸ **create**(`options`): `Promise`\<[`Doc`](../modules/api.md#doc)\> - -Creates a document based on the provided agentId or userId. -Ensures that only one of agentId or userId is provided using xor function. -Validates the provided agentId or userId using isValidUuid4. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId?` | `string` & `Format`\<``"uuid"``\> | -| `options.doc` | [`CreateDoc`](../modules/api.md#createdoc) | -| `options.userId?` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<[`Doc`](../modules/api.md#doc)\> - -The created document. - -**`Throws`** - -If neither agentId nor userId is provided. - -#### Defined in - -[src/managers/doc.ts:162](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/doc.ts#L162) - -___ - -### delete - -▸ **delete**(`options`): `Promise`\<`void`\> - -Deletes a document based on the provided agentId or userId and the specific docId. -Ensures that only one of agentId or userId is provided using xor function. -Validates the provided agentId or userId using isValidUuid4. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId?` | `string` & `Format`\<``"uuid"``\> | -| `options.docId` | `string` | -| `options.userId?` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<`void`\> - -A promise that resolves when the document is successfully deleted. - -**`Throws`** - -If neither agentId nor userId is provided. - -#### Defined in - -[src/managers/doc.ts:214](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/doc.ts#L214) - -___ - -### get - -▸ **get**(`options?`): `Promise`\<[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\> \| [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\>\> - -Retrieves documents based on the provided agentId or userId. -Ensures that only one of agentId or userId is provided using xor function. -Validates the provided agentId or userId using isValidUuid4. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId?` | `string` & `Format`\<``"uuid"``\> | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.offset?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``0``\> | -| `options.userId?` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<[`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\> \| [`CancelablePromise`](api.CancelablePromise.md)\<\{ `items?`: [`Doc`](../modules/api.md#doc)[] }\>\> - -The retrieved documents. - -**`Throws`** - -If neither agentId nor userId is provided. - -#### Defined in - -[src/managers/doc.ts:23](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/doc.ts#L23) - -___ - -### list - -▸ **list**(`options?`): `Promise`\<[`Doc`](../modules/api.md#doc)[]\> - -Lists documents based on the provided agentId or userId, with optional metadata filtering. -Ensures that only one of agentId or userId is provided using xor function. -Validates the provided agentId or userId using isValidUuid4. -Allows for filtering based on metadata. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId?` | `string` & `Format`\<``"uuid"``\> | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.metadataFilter?` | `Object` | -| `options.offset?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``0``\> | -| `options.userId?` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<[`Doc`](../modules/api.md#doc)[]\> - -The list of filtered documents. - -**`Throws`** - -If neither agentId nor userId is provided. - -#### Defined in - -[src/managers/doc.ts:90](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/doc.ts#L90) diff --git a/docs/js-sdk-docs/classes/managers_memory.MemoriesManager.md b/docs/js-sdk-docs/classes/managers_memory.MemoriesManager.md deleted file mode 100644 index 791c80f80..000000000 --- a/docs/js-sdk-docs/classes/managers_memory.MemoriesManager.md +++ /dev/null @@ -1,99 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/memory](../modules/managers_memory.md) / MemoriesManager - -# Class: MemoriesManager - -[managers/memory](../modules/managers_memory.md).MemoriesManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- [`BaseManager`](managers_base.BaseManager.md) - - ↳ **`MemoriesManager`** - -## Table of contents - -### Constructors - -- [constructor](managers_memory.MemoriesManager.md#constructor) - -### Properties - -- [apiClient](managers_memory.MemoriesManager.md#apiclient) - -### Methods - -- [list](managers_memory.MemoriesManager.md#list) - -## Constructors - -### constructor - -• **new MemoriesManager**(`apiClient`): [`MemoriesManager`](managers_memory.MemoriesManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`MemoriesManager`](managers_memory.MemoriesManager.md) - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[constructor](managers_base.BaseManager.md#constructor) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[apiClient](managers_base.BaseManager.md#apiclient) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Methods - -### list - -▸ **list**(`options`): `Promise`\<[`Memory`](../modules/api.md#memory)[]\> - -Lists memories based on the provided parameters. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId` | `string` & `Format`\<``"uuid"``\> | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.offset?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``0``\> | -| `options.query` | `string` | -| `options.userId?` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<[`Memory`](../modules/api.md#memory)[]\> - -A promise that resolves to an array of Memory objects. - -#### Defined in - -[src/managers/memory.ts:21](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/memory.ts#L21) diff --git a/docs/js-sdk-docs/classes/managers_session.SessionsManager.md b/docs/js-sdk-docs/classes/managers_session.SessionsManager.md deleted file mode 100644 index 7bcfdddae..000000000 --- a/docs/js-sdk-docs/classes/managers_session.SessionsManager.md +++ /dev/null @@ -1,278 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/session](../modules/managers_session.md) / SessionsManager - -# Class: SessionsManager - -[managers/session](../modules/managers_session.md).SessionsManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- [`BaseManager`](managers_base.BaseManager.md) - - ↳ **`SessionsManager`** - -## Table of contents - -### Constructors - -- [constructor](managers_session.SessionsManager.md#constructor) - -### Properties - -- [apiClient](managers_session.SessionsManager.md#apiclient) - -### Methods - -- [chat](managers_session.SessionsManager.md#chat) -- [create](managers_session.SessionsManager.md#create) -- [delete](managers_session.SessionsManager.md#delete) -- [deleteHistory](managers_session.SessionsManager.md#deletehistory) -- [get](managers_session.SessionsManager.md#get) -- [history](managers_session.SessionsManager.md#history) -- [list](managers_session.SessionsManager.md#list) -- [suggestions](managers_session.SessionsManager.md#suggestions) -- [update](managers_session.SessionsManager.md#update) - -## Constructors - -### constructor - -• **new SessionsManager**(`apiClient`): [`SessionsManager`](managers_session.SessionsManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`SessionsManager`](managers_session.SessionsManager.md) - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[constructor](managers_base.BaseManager.md#constructor) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[apiClient](managers_base.BaseManager.md#apiclient) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Methods - -### chat - -▸ **chat**(`sessionId`, `input`): `Promise`\<[`ChatResponse`](../modules/api.md#chatresponse)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | -| `input` | [`ChatInput`](../modules/api.md#chatinput) | - -#### Returns - -`Promise`\<[`ChatResponse`](../modules/api.md#chatresponse)\> - -#### Defined in - -[src/managers/session.ts:161](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L161) - -___ - -### create - -▸ **create**(`payload`): `Promise`\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `payload` | [`CreateSessionPayload`](../interfaces/managers_session.CreateSessionPayload.md) | - -#### Returns - -`Promise`\<[`ResourceCreatedResponse`](../modules/api.md#resourcecreatedresponse)\> - -#### Defined in - -[src/managers/session.ts:39](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L39) - -___ - -### delete - -▸ **delete**(`sessionId`): `Promise`\<`void`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[src/managers/session.ts:109](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L109) - -___ - -### deleteHistory - -▸ **deleteHistory**(`sessionId`): `Promise`\<`void`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[src/managers/session.ts:263](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L263) - -___ - -### get - -▸ **get**(`sessionId`): `Promise`\<[`Session`](../modules/api.md#session)\> - -Retrieves a session by its ID. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | The unique identifier of the session. | - -#### Returns - -`Promise`\<[`Session`](../modules/api.md#session)\> - -A promise that resolves with the session object. - -#### Defined in - -[src/managers/session.ts:33](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L33) - -___ - -### history - -▸ **history**(`sessionId`, `options?`): `Promise`\<[`ChatMLMessage`](../modules/api.md#chatmlmessage)[]\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | -| `options` | `Object` | -| `options.limit?` | `number` & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.offset?` | `number` & `Minimum`\<``0``\> | - -#### Returns - -`Promise`\<[`ChatMLMessage`](../modules/api.md#chatmlmessage)[]\> - -#### Defined in - -[src/managers/session.ts:240](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L240) - -___ - -### list - -▸ **list**(`options?`): `Promise`\<[`Session`](../modules/api.md#session)[]\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.metadataFilter?` | `Object` | -| `options.offset?` | `number` & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | - -#### Returns - -`Promise`\<[`Session`](../modules/api.md#session)[]\> - -#### Defined in - -[src/managers/session.ts:75](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L75) - -___ - -### suggestions - -▸ **suggestions**(`sessionId`, `options?`): `Promise`\<[`Suggestion`](../modules/api.md#suggestion)[]\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | -| `options` | `Object` | -| `options.limit?` | `number` & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.offset?` | `number` & `Minimum`\<``0``\> | - -#### Returns - -`Promise`\<[`Suggestion`](../modules/api.md#suggestion)[]\> - -#### Defined in - -[src/managers/session.ts:217](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L217) - -___ - -### update - -▸ **update**(`sessionId`, `options`, `overwrite?`): `Promise`\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -#### Parameters - -| Name | Type | Default value | -| :------ | :------ | :------ | -| `sessionId` | `string` & `Format`\<``"uuid"``\> | `undefined` | -| `options` | `Object` | `undefined` | -| `options.contextOverflow?` | ``"truncate"`` \| ``"adaptive"`` | `undefined` | -| `options.metadata?` | `Record`\<`string`, `any`\> | `undefined` | -| `options.situation` | `string` | `undefined` | -| `options.tokenBudget?` | `number` & `Minimum`\<``1``\> | `undefined` | -| `overwrite` | `boolean` | `false` | - -#### Returns - -`Promise`\<[`ResourceUpdatedResponse`](../modules/api.md#resourceupdatedresponse)\> - -#### Defined in - -[src/managers/session.ts:115](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L115) diff --git a/docs/js-sdk-docs/classes/managers_tool.ToolsManager.md b/docs/js-sdk-docs/classes/managers_tool.ToolsManager.md deleted file mode 100644 index ad37b7eed..000000000 --- a/docs/js-sdk-docs/classes/managers_tool.ToolsManager.md +++ /dev/null @@ -1,166 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/tool](../modules/managers_tool.md) / ToolsManager - -# Class: ToolsManager - -[managers/tool](../modules/managers_tool.md).ToolsManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- [`BaseManager`](managers_base.BaseManager.md) - - ↳ **`ToolsManager`** - -## Table of contents - -### Constructors - -- [constructor](managers_tool.ToolsManager.md#constructor) - -### Properties - -- [apiClient](managers_tool.ToolsManager.md#apiclient) - -### Methods - -- [create](managers_tool.ToolsManager.md#create) -- [delete](managers_tool.ToolsManager.md#delete) -- [list](managers_tool.ToolsManager.md#list) -- [update](managers_tool.ToolsManager.md#update) - -## Constructors - -### constructor - -• **new ToolsManager**(`apiClient`): [`ToolsManager`](managers_tool.ToolsManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`ToolsManager`](managers_tool.ToolsManager.md) - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[constructor](managers_base.BaseManager.md#constructor) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[apiClient](managers_base.BaseManager.md#apiclient) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Methods - -### create - -▸ **create**(`options`): `Promise`\<[`Tool`](../modules/api.md#tool)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId` | `string` & `Format`\<``"uuid"``\> | -| `options.tool` | `Object` | -| `options.tool.function` | [`FunctionDef`](../modules/api.md#functiondef) | -| `options.tool.type` | ``"function"`` \| ``"webhook"`` | - -#### Returns - -`Promise`\<[`Tool`](../modules/api.md#tool)\> - -#### Defined in - -[src/managers/tool.ts:44](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/tool.ts#L44) - -___ - -### delete - -▸ **delete**(`options`): `Promise`\<`void`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.agentId` | `string` & `Format`\<``"uuid"``\> | -| `options.toolId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[src/managers/tool.ts:105](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/tool.ts#L105) - -___ - -### list - -▸ **list**(`agentId`, `options?`): `Promise`\<[`Tool`](../modules/api.md#tool)[]\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `agentId` | `string` & `Format`\<``"uuid"``\> | -| `options` | `Object` | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.offset?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``0``\> | - -#### Returns - -`Promise`\<[`Tool`](../modules/api.md#tool)[]\> - -#### Defined in - -[src/managers/tool.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/tool.ts#L14) - -___ - -### update - -▸ **update**(`options`, `overwrite?`): `Promise`\<[`Tool`](../modules/api.md#tool)\> - -#### Parameters - -| Name | Type | Default value | -| :------ | :------ | :------ | -| `options` | `Object` | `undefined` | -| `options.agentId` | `string` & `Format`\<``"uuid"``\> | `undefined` | -| `options.tool` | [`UpdateToolRequest`](../modules/api.md#updatetoolrequest) | `undefined` | -| `options.toolId` | `string` & `Format`\<``"uuid"``\> | `undefined` | -| `overwrite` | `boolean` | `false` | - -#### Returns - -`Promise`\<[`Tool`](../modules/api.md#tool)\> - -#### Defined in - -[src/managers/tool.ts:71](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/tool.ts#L71) diff --git a/docs/js-sdk-docs/classes/managers_user.UsersManager.md b/docs/js-sdk-docs/classes/managers_user.UsersManager.md deleted file mode 100644 index e88f66893..000000000 --- a/docs/js-sdk-docs/classes/managers_user.UsersManager.md +++ /dev/null @@ -1,197 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/user](../modules/managers_user.md) / UsersManager - -# Class: UsersManager - -[managers/user](../modules/managers_user.md).UsersManager - -BaseManager serves as the base class for all manager classes that interact with the Julep API. -It provides common functionality needed for API interactions. - -## Hierarchy - -- [`BaseManager`](managers_base.BaseManager.md) - - ↳ **`UsersManager`** - -## Table of contents - -### Constructors - -- [constructor](managers_user.UsersManager.md#constructor) - -### Properties - -- [apiClient](managers_user.UsersManager.md#apiclient) - -### Methods - -- [create](managers_user.UsersManager.md#create) -- [delete](managers_user.UsersManager.md#delete) -- [get](managers_user.UsersManager.md#get) -- [list](managers_user.UsersManager.md#list) -- [update](managers_user.UsersManager.md#update) - -## Constructors - -### constructor - -• **new UsersManager**(`apiClient`): [`UsersManager`](managers_user.UsersManager.md) - -Constructs a new instance of BaseManager. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `apiClient` | [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) | The JulepApiClient instance used for API interactions. | - -#### Returns - -[`UsersManager`](managers_user.UsersManager.md) - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[constructor](managers_base.BaseManager.md#constructor) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Properties - -### apiClient - -• **apiClient**: [`JulepApiClient`](api_JulepApiClient.JulepApiClient.md) - -The JulepApiClient instance used for API interactions. - -#### Inherited from - -[BaseManager](managers_base.BaseManager.md).[apiClient](managers_base.BaseManager.md#apiclient) - -#### Defined in - -[src/managers/base.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/base.ts#L14) - -## Methods - -### create - -▸ **create**(`options?`): `Promise`\<[`User`](../modules/api.md#user)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | [`CreateUserRequest`](../modules/api.md#createuserrequest) | - -#### Returns - -`Promise`\<[`User`](../modules/api.md#user)\> - -#### Defined in - -[src/managers/user.ts:22](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/user.ts#L22) - -___ - -### delete - -▸ **delete**(`userId`): `Promise`\<`void`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `userId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[src/managers/user.ts:70](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/user.ts#L70) - -___ - -### get - -▸ **get**(`userId`): `Promise`\<[`User`](../modules/api.md#user)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `userId` | `string` & `Format`\<``"uuid"``\> | - -#### Returns - -`Promise`\<[`User`](../modules/api.md#user)\> - -#### Defined in - -[src/managers/user.ts:14](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/user.ts#L14) - -___ - -### list - -▸ **list**(`options?`): `Promise`\<[`User`](../modules/api.md#user)[]\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `Object` | -| `options.limit?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``1``\> & `Maximum`\<``1000``\> | -| `options.metadataFilter?` | `Object` | -| `options.offset?` | `number` & `Type`\<``"uint32"``\> & `Minimum`\<``0``\> | - -#### Returns - -`Promise`\<[`User`](../modules/api.md#user)[]\> - -#### Defined in - -[src/managers/user.ts:37](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/user.ts#L37) - -___ - -### update - -▸ **update**(`userId`, `request`, `overwrite`): `Promise`\<[`User`](../modules/api.md#user)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `userId` | `string` | -| `request` | [`UpdateUserRequest`](../modules/api.md#updateuserrequest) | -| `overwrite` | ``true`` | - -#### Returns - -`Promise`\<[`User`](../modules/api.md#user)\> - -#### Defined in - -[src/managers/user.ts:76](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/user.ts#L76) - -▸ **update**(`userId`, `request`, `overwrite?`): `Promise`\<[`User`](../modules/api.md#user)\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `userId` | `string` | -| `request` | [`PatchUserRequest`](../modules/api.md#patchuserrequest) | -| `overwrite?` | ``false`` | - -#### Returns - -`Promise`\<[`User`](../modules/api.md#user)\> - -#### Defined in - -[src/managers/user.ts:82](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/user.ts#L82) diff --git a/docs/js-sdk-docs/classes/utils_requestConstructor.CustomHttpRequest.md b/docs/js-sdk-docs/classes/utils_requestConstructor.CustomHttpRequest.md deleted file mode 100644 index 164a230bc..000000000 --- a/docs/js-sdk-docs/classes/utils_requestConstructor.CustomHttpRequest.md +++ /dev/null @@ -1,93 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [utils/requestConstructor](../modules/utils_requestConstructor.md) / CustomHttpRequest - -# Class: CustomHttpRequest - -[utils/requestConstructor](../modules/utils_requestConstructor.md).CustomHttpRequest - -## Hierarchy - -- `AxiosHttpRequest` - - ↳ **`CustomHttpRequest`** - -## Table of contents - -### Constructors - -- [constructor](utils_requestConstructor.CustomHttpRequest.md#constructor) - -### Properties - -- [config](utils_requestConstructor.CustomHttpRequest.md#config) - -### Methods - -- [request](utils_requestConstructor.CustomHttpRequest.md#request) - -## Constructors - -### constructor - -• **new CustomHttpRequest**(`config`): [`CustomHttpRequest`](utils_requestConstructor.CustomHttpRequest.md) - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `config` | [`OpenAPIConfig`](../modules/api.md#openapiconfig) | - -#### Returns - -[`CustomHttpRequest`](utils_requestConstructor.CustomHttpRequest.md) - -#### Overrides - -AxiosHttpRequest.constructor - -#### Defined in - -[src/utils/requestConstructor.ts:15](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/utils/requestConstructor.ts#L15) - -## Properties - -### config - -• `Readonly` **config**: [`OpenAPIConfig`](../modules/api.md#openapiconfig) - -#### Inherited from - -AxiosHttpRequest.config - -#### Defined in - -[src/api/core/BaseHttpRequest.ts:10](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/BaseHttpRequest.ts#L10) - -## Methods - -### request - -▸ **request**\<`T`\>(`options`): [`CancelablePromise`](api.CancelablePromise.md)\<`T`\> - -#### Type parameters - -| Name | -| :------ | -| `T` | - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `ApiRequestOptions` | - -#### Returns - -[`CancelablePromise`](api.CancelablePromise.md)\<`T`\> - -#### Overrides - -AxiosHttpRequest.request - -#### Defined in - -[src/utils/requestConstructor.ts:21](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/utils/requestConstructor.ts#L21) diff --git a/docs/js-sdk-docs/interfaces/managers_session.CreateSessionPayload.md b/docs/js-sdk-docs/interfaces/managers_session.CreateSessionPayload.md deleted file mode 100644 index 548bb5b2e..000000000 --- a/docs/js-sdk-docs/interfaces/managers_session.CreateSessionPayload.md +++ /dev/null @@ -1,87 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / [managers/session](../modules/managers_session.md) / CreateSessionPayload - -# Interface: CreateSessionPayload - -[managers/session](../modules/managers_session.md).CreateSessionPayload - -## Table of contents - -### Properties - -- [agentId](managers_session.CreateSessionPayload.md#agentid) -- [contextOverflow](managers_session.CreateSessionPayload.md#contextoverflow) -- [metadata](managers_session.CreateSessionPayload.md#metadata) -- [renderTemplates](managers_session.CreateSessionPayload.md#rendertemplates) -- [situation](managers_session.CreateSessionPayload.md#situation) -- [tokenBudget](managers_session.CreateSessionPayload.md#tokenbudget) -- [userId](managers_session.CreateSessionPayload.md#userid) - -## Properties - -### agentId - -• **agentId**: `string` - -#### Defined in - -[src/managers/session.ts:17](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L17) - -___ - -### contextOverflow - -• `Optional` **contextOverflow**: ``"truncate"`` \| ``"adaptive"`` - -#### Defined in - -[src/managers/session.ts:24](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L24) - -___ - -### metadata - -• `Optional` **metadata**: `Record`\<`string`, `any`\> - -#### Defined in - -[src/managers/session.ts:19](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L19) - -___ - -### renderTemplates - -• `Optional` **renderTemplates**: `boolean` - -#### Defined in - -[src/managers/session.ts:20](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L20) - -___ - -### situation - -• `Optional` **situation**: `string` - -#### Defined in - -[src/managers/session.ts:18](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L18) - -___ - -### tokenBudget - -• `Optional` **tokenBudget**: `number` - -#### Defined in - -[src/managers/session.ts:21](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L21) - -___ - -### userId - -• `Optional` **userId**: `string` - -#### Defined in - -[src/managers/session.ts:16](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/managers/session.ts#L16) diff --git a/docs/js-sdk-docs/modules.md b/docs/js-sdk-docs/modules.md deleted file mode 100644 index ec445aa16..000000000 --- a/docs/js-sdk-docs/modules.md +++ /dev/null @@ -1,22 +0,0 @@ -[@julep/sdk](README.md) / Modules - -# @julep/sdk - -## Table of contents - -### Modules - -- [api](modules/api.md) -- [api/JulepApiClient](modules/api_JulepApiClient.md) -- [managers/agent](modules/managers_agent.md) -- [managers/base](modules/managers_base.md) -- [managers/doc](modules/managers_doc.md) -- [managers/memory](modules/managers_memory.md) -- [managers/session](modules/managers_session.md) -- [managers/tool](modules/managers_tool.md) -- [managers/user](modules/managers_user.md) -- [utils/invariant](modules/utils_invariant.md) -- [utils/isValidUuid4](modules/utils_isValidUuid4.md) -- [utils/openaiPatch](modules/utils_openaiPatch.md) -- [utils/requestConstructor](modules/utils_requestConstructor.md) -- [utils/xor](modules/utils_xor.md) diff --git a/docs/js-sdk-docs/modules/api.md b/docs/js-sdk-docs/modules/api.md deleted file mode 100644 index bc4a9e82b..000000000 --- a/docs/js-sdk-docs/modules/api.md +++ /dev/null @@ -1,2623 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / api - -# Module: api - -## Table of contents - -### References - -- [JulepApiClient](api.md#julepapiclient) - -### Classes - -- [ApiError](../classes/api.ApiError.md) -- [BaseHttpRequest](../classes/api.BaseHttpRequest.md) -- [CancelError](../classes/api.CancelError.md) -- [CancelablePromise](../classes/api.CancelablePromise.md) -- [DefaultService](../classes/api.DefaultService.md) - -### Type Aliases - -- [Agent](api.md#agent) -- [AgentDefaultSettings](api.md#agentdefaultsettings) -- [ChatInput](api.md#chatinput) -- [ChatInputData](api.md#chatinputdata) -- [ChatMLImageContentPart](api.md#chatmlimagecontentpart) -- [ChatMLMessage](api.md#chatmlmessage) -- [ChatMLTextContentPart](api.md#chatmltextcontentpart) -- [ChatResponse](api.md#chatresponse) -- [ChatSettings](api.md#chatsettings) -- [CompletionUsage](api.md#completionusage) -- [CreateAgentRequest](api.md#createagentrequest) -- [CreateDoc](api.md#createdoc) -- [CreateSessionRequest](api.md#createsessionrequest) -- [CreateToolRequest](api.md#createtoolrequest) -- [CreateUserRequest](api.md#createuserrequest) -- [Doc](api.md#doc) -- [DocIds](api.md#docids) -- [FunctionCallOption](api.md#functioncalloption) -- [FunctionDef](api.md#functiondef) -- [FunctionParameters](api.md#functionparameters) -- [InputChatMLMessage](api.md#inputchatmlmessage) -- [JobStatus](api.md#jobstatus) -- [Memory](api.md#memory) -- [MemoryAccessOptions](api.md#memoryaccessoptions) -- [NamedToolChoice](api.md#namedtoolchoice) -- [OpenAPIConfig](api.md#openapiconfig) -- [PartialFunctionDef](api.md#partialfunctiondef) -- [PatchAgentRequest](api.md#patchagentrequest) -- [PatchSessionRequest](api.md#patchsessionrequest) -- [PatchToolRequest](api.md#patchtoolrequest) -- [PatchUserRequest](api.md#patchuserrequest) -- [ResourceCreatedResponse](api.md#resourcecreatedresponse) -- [ResourceDeletedResponse](api.md#resourcedeletedresponse) -- [ResourceUpdatedResponse](api.md#resourceupdatedresponse) -- [Session](api.md#session) -- [Suggestion](api.md#suggestion) -- [Tool](api.md#tool) -- [ToolChoiceOption](api.md#toolchoiceoption) -- [UpdateAgentRequest](api.md#updateagentrequest) -- [UpdateSessionRequest](api.md#updatesessionrequest) -- [UpdateToolRequest](api.md#updatetoolrequest) -- [UpdateUserRequest](api.md#updateuserrequest) -- [User](api.md#user) -- [agent\_id](api.md#agent_id) -- [doc\_id](api.md#doc_id) -- [job\_id](api.md#job_id) -- [memory\_id](api.md#memory_id) -- [message\_id](api.md#message_id) -- [session\_id](api.md#session_id) -- [tool\_id](api.md#tool_id) -- [user\_id](api.md#user_id) - -### Variables - -- [$Agent](api.md#$agent) -- [$AgentDefaultSettings](api.md#$agentdefaultsettings) -- [$ChatInput](api.md#$chatinput) -- [$ChatInputData](api.md#$chatinputdata) -- [$ChatMLImageContentPart](api.md#$chatmlimagecontentpart) -- [$ChatMLMessage](api.md#$chatmlmessage) -- [$ChatMLTextContentPart](api.md#$chatmltextcontentpart) -- [$ChatResponse](api.md#$chatresponse) -- [$ChatSettings](api.md#$chatsettings) -- [$CompletionUsage](api.md#$completionusage) -- [$CreateAgentRequest](api.md#$createagentrequest) -- [$CreateDoc](api.md#$createdoc) -- [$CreateSessionRequest](api.md#$createsessionrequest) -- [$CreateToolRequest](api.md#$createtoolrequest) -- [$CreateUserRequest](api.md#$createuserrequest) -- [$Doc](api.md#$doc) -- [$DocIds](api.md#$docids) -- [$FunctionCallOption](api.md#$functioncalloption) -- [$FunctionDef](api.md#$functiondef) -- [$FunctionParameters](api.md#$functionparameters) -- [$InputChatMLMessage](api.md#$inputchatmlmessage) -- [$JobStatus](api.md#$jobstatus) -- [$Memory](api.md#$memory) -- [$MemoryAccessOptions](api.md#$memoryaccessoptions) -- [$NamedToolChoice](api.md#$namedtoolchoice) -- [$PartialFunctionDef](api.md#$partialfunctiondef) -- [$PatchAgentRequest](api.md#$patchagentrequest) -- [$PatchSessionRequest](api.md#$patchsessionrequest) -- [$PatchToolRequest](api.md#$patchtoolrequest) -- [$PatchUserRequest](api.md#$patchuserrequest) -- [$ResourceCreatedResponse](api.md#$resourcecreatedresponse) -- [$ResourceDeletedResponse](api.md#$resourcedeletedresponse) -- [$ResourceUpdatedResponse](api.md#$resourceupdatedresponse) -- [$Session](api.md#$session) -- [$Suggestion](api.md#$suggestion) -- [$Tool](api.md#$tool) -- [$ToolChoiceOption](api.md#$toolchoiceoption) -- [$UpdateAgentRequest](api.md#$updateagentrequest) -- [$UpdateSessionRequest](api.md#$updatesessionrequest) -- [$UpdateToolRequest](api.md#$updatetoolrequest) -- [$UpdateUserRequest](api.md#$updateuserrequest) -- [$User](api.md#$user) -- [$agent\_id](api.md#$agent_id) -- [$doc\_id](api.md#$doc_id) -- [$job\_id](api.md#$job_id) -- [$memory\_id](api.md#$memory_id) -- [$message\_id](api.md#$message_id) -- [$session\_id](api.md#$session_id) -- [$tool\_id](api.md#$tool_id) -- [$user\_id](api.md#$user_id) -- [OpenAPI](api.md#openapi) - -## References - -### JulepApiClient - -Re-exports [JulepApiClient](../classes/api_JulepApiClient.JulepApiClient.md) - -## Type Aliases - -### Agent - -Ƭ **Agent**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about?` | `string` | About the agent | -| `created_at?` | `string` | Agent created at (RFC-3339 format) | -| `default_settings?` | [`AgentDefaultSettings`](api.md#agentdefaultsettings) | Default settings for all sessions created by this agent | -| `id` | `string` | Agent id (UUID) | -| `instructions?` | `string` \| `string`[] | Instructions for the agent | -| `metadata?` | `any` | Optional metadata | -| `model` | `string` | The model to use with this agent | -| `name` | `string` | Name of the agent | -| `updated_at?` | `string` | Agent updated at (RFC-3339 format) | - -#### Defined in - -[src/api/models/Agent.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/Agent.ts#L6) - -___ - -### AgentDefaultSettings - -Ƭ **AgentDefaultSettings**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `frequency_penalty?` | `number` \| ``null`` | (OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. | -| `length_penalty?` | `number` \| ``null`` | (Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. | -| `min_p?` | `number` | Minimum probability compared to leading token to be considered | -| `presence_penalty?` | `number` \| ``null`` | (OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. | -| `preset?` | ``"problem_solving"`` \| ``"conversational"`` \| ``"fun"`` \| ``"prose"`` \| ``"creative"`` \| ``"business"`` \| ``"deterministic"`` \| ``"code"`` \| ``"multilingual"`` | Generation preset name (one of: problem_solving, conversational, fun, prose, creative, business, deterministic, code, multilingual) | -| `repetition_penalty?` | `number` \| ``null`` | (Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. | -| `temperature?` | `number` \| ``null`` | What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. | -| `top_p?` | `number` \| ``null`` | Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. | - -#### Defined in - -[src/api/models/AgentDefaultSettings.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/AgentDefaultSettings.ts#L5) - -___ - -### ChatInput - -Ƭ **ChatInput**: [`ChatInputData`](api.md#chatinputdata) & [`ChatSettings`](api.md#chatsettings) & [`MemoryAccessOptions`](api.md#memoryaccessoptions) - -#### Defined in - -[src/api/models/ChatInput.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatInput.ts#L8) - -___ - -### ChatInputData - -Ƭ **ChatInputData**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `messages` | [`InputChatMLMessage`](api.md#inputchatmlmessage)[] | A list of new input messages comprising the conversation so far. | -| `tool_choice?` | [`ToolChoiceOption`](api.md#toolchoiceoption) \| [`NamedToolChoice`](api.md#namedtoolchoice) \| ``null`` | Can be one of existing tools given to the agent earlier or the ones included in the request | -| `tools?` | [`Tool`](api.md#tool)[] \| ``null`` | (Advanced) List of tools that are provided in addition to agent's default set of tools. Functions of same name in agent set are overridden | - -#### Defined in - -[src/api/models/ChatInputData.ts:9](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatInputData.ts#L9) - -___ - -### ChatMLImageContentPart - -Ƭ **ChatMLImageContentPart**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `image_url` | \{ `detail?`: ``"low"`` \| ``"high"`` \| ``"auto"`` ; `url`: `string` } | Image content part, can be a URL or a base64-encoded image | -| `image_url.detail?` | ``"low"`` \| ``"high"`` \| ``"auto"`` | image detail to feed into the model can be low \| high \| auto | -| `image_url.url` | `string` | URL or base64 data url (e.g. `data:image/jpeg;base64,`) | -| `type` | ``"image_url"`` | Fixed to 'image_url' | - -#### Defined in - -[src/api/models/ChatMLImageContentPart.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatMLImageContentPart.ts#L5) - -___ - -### ChatMLMessage - -Ƭ **ChatMLMessage**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `content` | `string` | ChatML content | -| `created_at` | `string` | Message created at (RFC-3339 format) | -| `id` | `string` | Message ID | -| `name?` | `string` | ChatML name | -| `role` | ``"user"`` \| ``"assistant"`` \| ``"system"`` \| ``"function_call"`` \| ``"function"`` | ChatML role (system\|assistant\|user\|function_call\|function) | - -#### Defined in - -[src/api/models/ChatMLMessage.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatMLMessage.ts#L5) - -___ - -### ChatMLTextContentPart - -Ƭ **ChatMLTextContentPart**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `text` | `string` | Text content part | -| `type` | ``"text"`` | Fixed to 'text' | - -#### Defined in - -[src/api/models/ChatMLTextContentPart.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatMLTextContentPart.ts#L5) - -___ - -### ChatResponse - -Ƭ **ChatResponse**: `Object` - -Represents a chat completion response returned by model, based on the provided input. - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `doc_ids` | [`DocIds`](api.md#docids) | - | -| `finish_reason` | ``"stop"`` \| ``"length"`` \| ``"tool_calls"`` \| ``"content_filter"`` \| ``"function_call"`` | The reason the model stopped generating tokens. This will be `stop` if the model hit a natural stop point or a provided stop sequence, `length` if the maximum number of tokens specified in the request was reached, `content_filter` if content was omitted due to a flag from our content filters, `tool_calls` if the model called a tool, or `function_call` (deprecated) if the model called a function. | -| `id` | `string` | A unique identifier for the chat completion. | -| `jobs?` | `string`[] | IDs (if any) of jobs created as part of this request | -| `response` | [`ChatMLMessage`](api.md#chatmlmessage)[][] | A list of chat completion messages produced as a response. | -| `usage` | [`CompletionUsage`](api.md#completionusage) | - | - -#### Defined in - -[src/api/models/ChatResponse.ts:11](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatResponse.ts#L11) - -___ - -### ChatSettings - -Ƭ **ChatSettings**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `frequency_penalty?` | `number` \| ``null`` | (OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. | -| `length_penalty?` | `number` \| ``null`` | (Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. | -| `logit_bias?` | `Record`\<`string`, `number`\> \| ``null`` | Modify the likelihood of specified tokens appearing in the completion. Accepts a JSON object that maps tokens (specified by their token ID in the tokenizer) to an associated bias value from -100 to 100. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. | -| `max_tokens?` | `number` \| ``null`` | The maximum number of tokens to generate in the chat completion. The total length of input tokens and generated tokens is limited by the model's context length. | -| `min_p?` | `number` | Minimum probability compared to leading token to be considered | -| `presence_penalty?` | `number` \| ``null`` | (OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. | -| `preset?` | ``"problem_solving"`` \| ``"conversational"`` \| ``"fun"`` \| ``"prose"`` \| ``"creative"`` \| ``"business"`` \| ``"deterministic"`` \| ``"code"`` \| ``"multilingual"`` | Generation preset name (problem_solving\|conversational\|fun\|prose\|creative\|business\|deterministic\|code\|multilingual) | -| `repetition_penalty?` | `number` \| ``null`` | (Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. | -| `response_format?` | \{ `pattern?`: `string` ; `schema?`: `any` ; `type?`: ``"text"`` \| ``"json_object"`` \| ``"regex"`` } | An object specifying the format that the model must output. Setting to `{ "type": "json_object" }` enables JSON mode, which guarantees the message the model generates is valid JSON. **Important:** when using JSON mode, you **must** also instruct the model to produce JSON yourself via a system or user message. Without this, the model may generate an unending stream of whitespace until the generation reaches the token limit, resulting in a long-running and seemingly "stuck" request. Also note that the message content may be partially cut off if `finish_reason="length"`, which indicates the generation exceeded `max_tokens` or the conversation exceeded the max context length. | -| `response_format.pattern?` | `string` | Regular expression pattern to use if `type` is `"regex"` | -| `response_format.schema?` | `any` | JSON Schema to use if `type` is `"json_object"` | -| `response_format.type?` | ``"text"`` \| ``"json_object"`` \| ``"regex"`` | Must be one of `"text"`, `"regex"` or `"json_object"`. | -| `seed?` | `number` \| ``null`` | This feature is in Beta. If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result. Determinism is not guaranteed, and you should refer to the `system_fingerprint` response parameter to monitor changes in the backend. | -| `stop?` | `string` \| ``null`` \| `string`[] | Up to 4 sequences where the API will stop generating further tokens. | -| `stream?` | `boolean` \| ``null`` | If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format) as they become available, with the stream terminated by a `data: [DONE]` message. [Example Python code](https://cookbook.openai.com/examples/how_to_stream_completions). | -| `temperature?` | `number` \| ``null`` | What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. | -| `top_p?` | `number` \| ``null`` | Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. | - -#### Defined in - -[src/api/models/ChatSettings.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ChatSettings.ts#L5) - -___ - -### CompletionUsage - -Ƭ **CompletionUsage**: `Object` - -Usage statistics for the completion request. - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `completion_tokens` | `number` | Number of tokens in the generated completion. | -| `prompt_tokens` | `number` | Number of tokens in the prompt. | -| `total_tokens` | `number` | Total number of tokens used in the request (prompt + completion). | - -#### Defined in - -[src/api/models/CompletionUsage.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/CompletionUsage.ts#L8) - -___ - -### CreateAgentRequest - -Ƭ **CreateAgentRequest**: `Object` - -A valid request payload for creating an agent - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about?` | `string` | About the agent | -| `default_settings?` | [`AgentDefaultSettings`](api.md#agentdefaultsettings) | Default model settings to start every session with | -| `docs?` | [`CreateDoc`](api.md#createdoc)[] | List of docs about agent | -| `instructions?` | `string` \| `string`[] | Instructions for the agent | -| `metadata?` | `any` | (Optional) metadata | -| `model?` | `string` | Name of the model that the agent is supposed to use | -| `name` | `string` | Name of the agent | -| `tools?` | [`CreateToolRequest`](api.md#createtoolrequest)[] | A list of tools the model may call. Currently, only `function`s are supported as a tool. Use this to provide a list of functions the model may generate JSON inputs for. | - -#### Defined in - -[src/api/models/CreateAgentRequest.ts:11](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/CreateAgentRequest.ts#L11) - -___ - -### CreateDoc - -Ƭ **CreateDoc**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `content` | `string`[] \| `string` | Information content | -| `metadata?` | `any` | Optional metadata | -| `title` | `string` | Title describing what this bit of information contains | - -#### Defined in - -[src/api/models/CreateDoc.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/CreateDoc.ts#L5) - -___ - -### CreateSessionRequest - -Ƭ **CreateSessionRequest**: `Object` - -A valid request payload for creating a session - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `agent_id` | `string` | Agent ID of agent to associate with this session | -| `context_overflow?` | `string` | Action to start on context window overflow | -| `metadata?` | `any` | Optional metadata | -| `render_templates?` | `boolean` | Render system and assistant message content as jinja templates | -| `situation?` | `string` | A specific situation that sets the background for this session | -| `token_budget?` | `number` | Threshold value for the adaptive context functionality | -| `user_id?` | `string` | (Optional) User ID of user to associate with this session | - -#### Defined in - -[src/api/models/CreateSessionRequest.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/CreateSessionRequest.ts#L8) - -___ - -### CreateToolRequest - -Ƭ **CreateToolRequest**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `function` | [`FunctionDef`](api.md#functiondef) | Function definition and parameters | -| `type` | ``"function"`` \| ``"webhook"`` | Whether this tool is a `function` or a `webhook` (Only `function` tool supported right now) | - -#### Defined in - -[src/api/models/CreateToolRequest.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/CreateToolRequest.ts#L6) - -___ - -### CreateUserRequest - -Ƭ **CreateUserRequest**: `Object` - -A valid request payload for creating a user - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about?` | `string` | About the user | -| `docs?` | [`CreateDoc`](api.md#createdoc)[] | List of docs about user | -| `metadata?` | `any` | (Optional) metadata | -| `name?` | `string` | Name of the user | - -#### Defined in - -[src/api/models/CreateUserRequest.ts:9](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/CreateUserRequest.ts#L9) - -___ - -### Doc - -Ƭ **Doc**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `content` | `string`[] \| `string` | Information content | -| `created_at` | `string` | Doc created at | -| `id` | `string` | ID of doc | -| `metadata?` | `any` | optional metadata | -| `title` | `string` | Title describing what this bit of information contains | - -#### Defined in - -[src/api/models/Doc.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/Doc.ts#L5) - -___ - -### DocIds - -Ƭ **DocIds**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `agent_doc_ids` | `string`[] | -| `user_doc_ids` | `string`[] | - -#### Defined in - -[src/api/models/DocIds.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/DocIds.ts#L5) - -___ - -### FunctionCallOption - -Ƭ **FunctionCallOption**: `Object` - -Specifying a particular function via `{"name": "my_function"}` forces the model to call that function. - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `name` | `string` | The name of the function to call. | - -#### Defined in - -[src/api/models/FunctionCallOption.ts:9](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/FunctionCallOption.ts#L9) - -___ - -### FunctionDef - -Ƭ **FunctionDef**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `description?` | `string` | A description of what the function does, used by the model to choose when and how to call the function. | -| `name` | `string` | The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64. | -| `parameters` | [`FunctionParameters`](api.md#functionparameters) | Parameters accepeted by this function | - -#### Defined in - -[src/api/models/FunctionDef.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/FunctionDef.ts#L6) - -___ - -### FunctionParameters - -Ƭ **FunctionParameters**: `Record`\<`string`, `any`\> - -The parameters the functions accepts, described as a JSON Schema object. - -#### Defined in - -[src/api/models/FunctionParameters.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/FunctionParameters.ts#L8) - -___ - -### InputChatMLMessage - -Ƭ **InputChatMLMessage**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `content` | `string` | ChatML content | -| `continue?` | `boolean` | Whether to continue this message or return a new one | -| `name?` | `string` | ChatML name | -| `role` | ``"user"`` \| ``"assistant"`` \| ``"system"`` \| ``"function_call"`` \| ``"function"`` \| ``"auto"`` | ChatML role (system\|assistant\|user\|function_call\|function\|auto) | - -#### Defined in - -[src/api/models/InputChatMLMessage.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/InputChatMLMessage.ts#L5) - -___ - -### JobStatus - -Ƭ **JobStatus**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `created_at` | `string` | Job created at (RFC-3339 format) | -| `has_progress?` | `boolean` | Whether this Job supports progress updates | -| `id` | `string` | Job id (UUID) | -| `name` | `string` | Name of the job | -| `progress?` | `number` | Progress percentage | -| `reason?` | `string` | Reason for current state | -| `state` | ``"pending"`` \| ``"in_progress"`` \| ``"retrying"`` \| ``"succeeded"`` \| ``"aborted"`` \| ``"failed"`` \| ``"unknown"`` | Current state (one of: pending, in_progress, retrying, succeeded, aborted, failed) | -| `updated_at?` | `string` | Job updated at (RFC-3339 format) | - -#### Defined in - -[src/api/models/JobStatus.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/JobStatus.ts#L5) - -___ - -### Memory - -Ƭ **Memory**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `agent_id` | `string` | ID of the agent | -| `content` | `string` | Content of the memory | -| `created_at` | `string` | Memory created at (RFC-3339 format) | -| `entities` | `any`[] | List of entities mentioned in the memory | -| `id` | `string` | Memory id (UUID) | -| `last_accessed_at?` | `string` | Memory last accessed at (RFC-3339 format) | -| `sentiment?` | `number` | Sentiment (valence) of the memory on a scale of -1 to 1 | -| `timestamp?` | `string` | Memory happened at (RFC-3339 format) | -| `user_id` | `string` | ID of the user | - -#### Defined in - -[src/api/models/Memory.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/Memory.ts#L5) - -___ - -### MemoryAccessOptions - -Ƭ **MemoryAccessOptions**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `recall?` | `boolean` | Whether previous memories should be recalled or not | -| `record?` | `boolean` | Whether this interaction should be recorded in history or not | -| `remember?` | `boolean` | Whether this interaction should form memories or not | - -#### Defined in - -[src/api/models/MemoryAccessOptions.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/MemoryAccessOptions.ts#L5) - -___ - -### NamedToolChoice - -Ƭ **NamedToolChoice**: `Object` - -Specifies a tool the model should use. Use to force the model to call a specific function. - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `function` | \{ `name`: `string` } | - | -| `function.name` | `string` | The name of the function to call. | -| `type` | ``"function"`` | The type of the tool. Currently, only `function` is supported. | - -#### Defined in - -[src/api/models/NamedToolChoice.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/NamedToolChoice.ts#L8) - -___ - -### OpenAPIConfig - -Ƭ **OpenAPIConfig**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `BASE` | `string` | -| `CREDENTIALS` | ``"include"`` \| ``"omit"`` \| ``"same-origin"`` | -| `ENCODE_PATH?` | (`path`: `string`) => `string` | -| `HEADERS?` | `Headers` \| `Resolver`\<`Headers`\> | -| `PASSWORD?` | `string` \| `Resolver`\<`string`\> | -| `TOKEN?` | `string` \| `Resolver`\<`string`\> | -| `USERNAME?` | `string` \| `Resolver`\<`string`\> | -| `VERSION` | `string` | -| `WITH_CREDENTIALS` | `boolean` | - -#### Defined in - -[src/api/core/OpenAPI.ts:10](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/OpenAPI.ts#L10) - -___ - -### PartialFunctionDef - -Ƭ **PartialFunctionDef**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `description?` | `string` | A description of what the function does, used by the model to choose when and how to call the function. | -| `name?` | `string` | The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64. | -| `parameters?` | [`FunctionParameters`](api.md#functionparameters) | Parameters accepeted by this function | - -#### Defined in - -[src/api/models/PartialFunctionDef.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/PartialFunctionDef.ts#L6) - -___ - -### PatchAgentRequest - -Ƭ **PatchAgentRequest**: `Object` - -A request for patching an agent - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about?` | `string` | About the agent | -| `default_settings?` | [`AgentDefaultSettings`](api.md#agentdefaultsettings) | Default model settings to start every session with | -| `instructions?` | `string` \| `string`[] | Instructions for the agent | -| `metadata?` | `any` | Optional metadata | -| `model?` | `string` | Name of the model that the agent is supposed to use | -| `name?` | `string` | Name of the agent | - -#### Defined in - -[src/api/models/PatchAgentRequest.ts:9](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/PatchAgentRequest.ts#L9) - -___ - -### PatchSessionRequest - -Ƭ **PatchSessionRequest**: `Object` - -A request for patching a session - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `context_overflow?` | `string` | Action to start on context window overflow | -| `metadata?` | `any` | Optional metadata | -| `situation?` | `string` | Updated situation for this session | -| `token_budget?` | `number` | Threshold value for the adaptive context functionality | - -#### Defined in - -[src/api/models/PatchSessionRequest.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/PatchSessionRequest.ts#L8) - -___ - -### PatchToolRequest - -Ƭ **PatchToolRequest**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `function` | [`PartialFunctionDef`](api.md#partialfunctiondef) | Function definition and parameters | - -#### Defined in - -[src/api/models/PatchToolRequest.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/PatchToolRequest.ts#L6) - -___ - -### PatchUserRequest - -Ƭ **PatchUserRequest**: `Object` - -A request for patching a user - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about?` | `string` | About the user | -| `metadata?` | `any` | Optional metadata | -| `name?` | `string` | Name of the user | - -#### Defined in - -[src/api/models/PatchUserRequest.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/PatchUserRequest.ts#L8) - -___ - -### ResourceCreatedResponse - -Ƭ **ResourceCreatedResponse**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `created_at` | `string` | - | -| `id` | `string` | - | -| `jobs?` | `string`[] | IDs (if any) of jobs created as part of this request | - -#### Defined in - -[src/api/models/ResourceCreatedResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ResourceCreatedResponse.ts#L5) - -___ - -### ResourceDeletedResponse - -Ƭ **ResourceDeletedResponse**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `deleted_at` | `string` | - | -| `id` | `string` | - | -| `jobs?` | `string`[] | IDs (if any) of jobs created as part of this request | - -#### Defined in - -[src/api/models/ResourceDeletedResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ResourceDeletedResponse.ts#L5) - -___ - -### ResourceUpdatedResponse - -Ƭ **ResourceUpdatedResponse**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `id` | `string` | - | -| `jobs?` | `string`[] | IDs (if any) of jobs created as part of this request | -| `updated_at` | `string` | - | - -#### Defined in - -[src/api/models/ResourceUpdatedResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ResourceUpdatedResponse.ts#L5) - -___ - -### Session - -Ƭ **Session**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `agent_id` | `string` | Agent ID of agent associated with this session | -| `context_overflow?` | `string` | Action to start on context window overflow | -| `created_at?` | `string` | Session created at (RFC-3339 format) | -| `id` | `string` | Session id (UUID) | -| `metadata?` | `any` | Optional metadata | -| `render_templates?` | `boolean` | Render system and assistant message content as jinja templates | -| `situation?` | `string` | A specific situation that sets the background for this session | -| `summary?` | `string` | (null at the beginning) - generated automatically after every interaction | -| `token_budget?` | `number` | Threshold value for the adaptive context functionality | -| `updated_at?` | `string` | Session updated at (RFC-3339 format) | -| `user_id?` | `string` | User ID of user associated with this session | - -#### Defined in - -[src/api/models/Session.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/Session.ts#L5) - -___ - -### Suggestion - -Ƭ **Suggestion**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `content` | `string` | The content of the suggestion | -| `created_at?` | `string` | Suggestion created at (RFC-3339 format) | -| `message_id` | `string` | The message that produced it | -| `session_id` | `string` | Session this suggestion belongs to | -| `target` | ``"user"`` \| ``"agent"`` | Whether the suggestion is for the `agent` or a `user` | - -#### Defined in - -[src/api/models/Suggestion.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/Suggestion.ts#L5) - -___ - -### Tool - -Ƭ **Tool**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `function` | [`FunctionDef`](api.md#functiondef) | Function definition and parameters | -| `id` | `string` | Tool ID | -| `type` | ``"function"`` \| ``"webhook"`` | Whether this tool is a `function` or a `webhook` (Only `function` tool supported right now) | - -#### Defined in - -[src/api/models/Tool.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/Tool.ts#L6) - -___ - -### ToolChoiceOption - -Ƭ **ToolChoiceOption**: ``"none"`` \| ``"auto"`` \| [`NamedToolChoice`](api.md#namedtoolchoice) - -Controls which (if any) function is called by the model. -`none` means the model will not call a function and instead generates a message. -`auto` means the model can pick between generating a message or calling a function. -Specifying a particular function via `{"type: "function", "function": {"name": "my_function"}}` forces the model to call that function. - -`none` is the default when no functions are present. `auto` is the default if functions are present. - -#### Defined in - -[src/api/models/ToolChoiceOption.ts:15](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/ToolChoiceOption.ts#L15) - -___ - -### UpdateAgentRequest - -Ƭ **UpdateAgentRequest**: `Object` - -A valid request payload for updating an agent - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about` | `string` | About the agent | -| `default_settings?` | [`AgentDefaultSettings`](api.md#agentdefaultsettings) | Default model settings to start every session with | -| `instructions?` | `string` \| `string`[] | Instructions for the agent | -| `metadata?` | `any` | Optional metadata | -| `model?` | `string` | Name of the model that the agent is supposed to use | -| `name` | `string` | Name of the agent | - -#### Defined in - -[src/api/models/UpdateAgentRequest.ts:9](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/UpdateAgentRequest.ts#L9) - -___ - -### UpdateSessionRequest - -Ƭ **UpdateSessionRequest**: `Object` - -A valid request payload for updating a session - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `context_overflow?` | `string` | Action to start on context window overflow | -| `metadata?` | `any` | Optional metadata | -| `situation` | `string` | Updated situation for this session | -| `token_budget?` | `number` | Threshold value for the adaptive context functionality | - -#### Defined in - -[src/api/models/UpdateSessionRequest.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/UpdateSessionRequest.ts#L8) - -___ - -### UpdateToolRequest - -Ƭ **UpdateToolRequest**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `function` | [`FunctionDef`](api.md#functiondef) | Function definition and parameters | - -#### Defined in - -[src/api/models/UpdateToolRequest.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/UpdateToolRequest.ts#L6) - -___ - -### UpdateUserRequest - -Ƭ **UpdateUserRequest**: `Object` - -A valid request payload for updating a user - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about` | `string` | About the user | -| `metadata?` | `any` | Optional metadata | -| `name` | `string` | Name of the user | - -#### Defined in - -[src/api/models/UpdateUserRequest.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/UpdateUserRequest.ts#L8) - -___ - -### User - -Ƭ **User**: `Object` - -#### Type declaration - -| Name | Type | Description | -| :------ | :------ | :------ | -| `about?` | `string` | About the user | -| `created_at?` | `string` | User created at (RFC-3339 format) | -| `id` | `string` | User id (UUID) | -| `metadata?` | `any` | (Optional) metadata | -| `name?` | `string` | Name of the user | -| `updated_at?` | `string` | User updated at (RFC-3339 format) | - -#### Defined in - -[src/api/models/User.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/User.ts#L5) - -___ - -### agent\_id - -Ƭ **agent\_id**: `string` - -#### Defined in - -[src/api/models/agent_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/agent_id.ts#L5) - -___ - -### doc\_id - -Ƭ **doc\_id**: `string` - -#### Defined in - -[src/api/models/doc_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/doc_id.ts#L5) - -___ - -### job\_id - -Ƭ **job\_id**: `string` - -#### Defined in - -[src/api/models/job_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/job_id.ts#L5) - -___ - -### memory\_id - -Ƭ **memory\_id**: `string` - -#### Defined in - -[src/api/models/memory_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/memory_id.ts#L5) - -___ - -### message\_id - -Ƭ **message\_id**: `string` - -#### Defined in - -[src/api/models/message_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/message_id.ts#L5) - -___ - -### session\_id - -Ƭ **session\_id**: `string` - -#### Defined in - -[src/api/models/session_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/session_id.ts#L5) - -___ - -### tool\_id - -Ƭ **tool\_id**: `string` - -#### Defined in - -[src/api/models/tool_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/tool_id.ts#L5) - -___ - -### user\_id - -Ƭ **user\_id**: `string` - -#### Defined in - -[src/api/models/user_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/models/user_id.ts#L5) - -## Variables - -### $Agent - -• `Const` **$Agent**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `about`: \{ `description`: ``"About the agent"`` ; `type`: ``"string"`` = "string" } ; `created_at`: \{ `description`: ``"Agent created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `default_settings`: \{ `description`: ``"Default settings for all sessions created by this agent"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } ; `id`: \{ `description`: ``"Agent id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `instructions`: \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `model`: \{ `description`: ``"The model to use with this agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"Name of the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `updated_at`: \{ `description`: ``"Agent updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the agent"`` ; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the agent"`` | -| `properties.about.type` | ``"string"`` | -| `properties.created_at` | \{ `description`: ``"Agent created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Agent created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.default_settings` | \{ `description`: ``"Default settings for all sessions created by this agent"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } | -| `properties.default_settings.description` | ``"Default settings for all sessions created by this agent"`` | -| `properties.default_settings.type` | ``"AgentDefaultSettings"`` | -| `properties.id` | \{ `description`: ``"Agent id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"Agent id (UUID)"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.instructions` | \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } | -| `properties.instructions.contains` | readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] | -| `properties.instructions.description` | ``"Instructions for the agent"`` | -| `properties.instructions.type` | ``"one-of"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.model` | \{ `description`: ``"The model to use with this agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.model.description` | ``"The model to use with this agent"`` | -| `properties.model.isRequired` | ``true`` | -| `properties.model.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"Name of the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the agent"`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | -| `properties.updated_at` | \{ `description`: ``"Agent updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.updated_at.description` | ``"Agent updated at (RFC-3339 format)"`` | -| `properties.updated_at.format` | ``"date-time"`` | -| `properties.updated_at.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$Agent.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$Agent.ts#L5) - -___ - -### $AgentDefaultSettings - -• `Const` **$AgentDefaultSettings**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `frequency_penalty`: \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `minimum`: ``-2`` = -2; `type`: ``"number"`` = "number" } ; `length_penalty`: \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. "`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } ; `min_p`: \{ `description`: ``"Minimum probability compared to leading token to be considered"`` ; `exclusiveMaximum`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } ; `presence_penalty`: \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } ; `preset`: \{ `type`: ``"Enum"`` = "Enum" } ; `repetition_penalty`: \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } ; `temperature`: \{ `description`: ``"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic."`` ; `isNullable`: ``true`` = true; `maximum`: ``3`` = 3; `type`: ``"number"`` = "number" } ; `top_p`: \{ `description`: ``"Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } } | -| `properties.frequency_penalty` | \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `minimum`: ``-2`` = -2; `type`: ``"number"`` = "number" } | -| `properties.frequency_penalty.description` | ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` | -| `properties.frequency_penalty.isNullable` | ``true`` | -| `properties.frequency_penalty.maximum` | ``2`` | -| `properties.frequency_penalty.minimum` | ``-2`` | -| `properties.frequency_penalty.type` | ``"number"`` | -| `properties.length_penalty` | \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. "`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } | -| `properties.length_penalty.description` | ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. "`` | -| `properties.length_penalty.isNullable` | ``true`` | -| `properties.length_penalty.maximum` | ``2`` | -| `properties.length_penalty.type` | ``"number"`` | -| `properties.min_p` | \{ `description`: ``"Minimum probability compared to leading token to be considered"`` ; `exclusiveMaximum`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } | -| `properties.min_p.description` | ``"Minimum probability compared to leading token to be considered"`` | -| `properties.min_p.exclusiveMaximum` | ``true`` | -| `properties.min_p.maximum` | ``1`` | -| `properties.min_p.type` | ``"number"`` | -| `properties.presence_penalty` | \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } | -| `properties.presence_penalty.description` | ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` | -| `properties.presence_penalty.isNullable` | ``true`` | -| `properties.presence_penalty.maximum` | ``1`` | -| `properties.presence_penalty.minimum` | ``-1`` | -| `properties.presence_penalty.type` | ``"number"`` | -| `properties.preset` | \{ `type`: ``"Enum"`` = "Enum" } | -| `properties.preset.type` | ``"Enum"`` | -| `properties.repetition_penalty` | \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } | -| `properties.repetition_penalty.description` | ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` | -| `properties.repetition_penalty.isNullable` | ``true`` | -| `properties.repetition_penalty.maximum` | ``2`` | -| `properties.repetition_penalty.type` | ``"number"`` | -| `properties.temperature` | \{ `description`: ``"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic."`` ; `isNullable`: ``true`` = true; `maximum`: ``3`` = 3; `type`: ``"number"`` = "number" } | -| `properties.temperature.description` | ``"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic."`` | -| `properties.temperature.isNullable` | ``true`` | -| `properties.temperature.maximum` | ``3`` | -| `properties.temperature.type` | ``"number"`` | -| `properties.top_p` | \{ `description`: ``"Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } | -| `properties.top_p.description` | ``"Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both."`` | -| `properties.top_p.isNullable` | ``true`` | -| `properties.top_p.maximum` | ``1`` | -| `properties.top_p.type` | ``"number"`` | - -#### Defined in - -[src/api/schemas/$AgentDefaultSettings.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$AgentDefaultSettings.ts#L5) - -___ - -### $ChatInput - -• `Const` **$ChatInput**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `contains` | readonly [\{ `type`: ``"ChatInputData"`` = "ChatInputData" }, \{ `type`: ``"ChatSettings"`` = "ChatSettings" }, \{ `type`: ``"MemoryAccessOptions"`` = "MemoryAccessOptions" }] | -| `type` | ``"all-of"`` | - -#### Defined in - -[src/api/schemas/$ChatInput.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatInput.ts#L5) - -___ - -### $ChatInputData - -• `Const` **$ChatInputData**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `messages`: \{ `contains`: \{ `type`: ``"InputChatMLMessage"`` = "InputChatMLMessage" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } ; `tool_choice`: \{ `contains`: readonly [\{ `type`: ``"ToolChoiceOption"`` = "ToolChoiceOption" }, \{ `type`: ``"NamedToolChoice"`` = "NamedToolChoice" }] ; `description`: ``"Can be one of existing tools given to the agent earlier or the ones included in the request"`` ; `isNullable`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `tools`: \{ `contains`: \{ `type`: ``"Tool"`` = "Tool" } ; `isNullable`: ``true`` = true; `type`: ``"array"`` = "array" } } | -| `properties.messages` | \{ `contains`: \{ `type`: ``"InputChatMLMessage"`` = "InputChatMLMessage" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } | -| `properties.messages.contains` | \{ `type`: ``"InputChatMLMessage"`` = "InputChatMLMessage" } | -| `properties.messages.contains.type` | ``"InputChatMLMessage"`` | -| `properties.messages.isRequired` | ``true`` | -| `properties.messages.type` | ``"array"`` | -| `properties.tool_choice` | \{ `contains`: readonly [\{ `type`: ``"ToolChoiceOption"`` = "ToolChoiceOption" }, \{ `type`: ``"NamedToolChoice"`` = "NamedToolChoice" }] ; `description`: ``"Can be one of existing tools given to the agent earlier or the ones included in the request"`` ; `isNullable`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.tool_choice.contains` | readonly [\{ `type`: ``"ToolChoiceOption"`` = "ToolChoiceOption" }, \{ `type`: ``"NamedToolChoice"`` = "NamedToolChoice" }] | -| `properties.tool_choice.description` | ``"Can be one of existing tools given to the agent earlier or the ones included in the request"`` | -| `properties.tool_choice.isNullable` | ``true`` | -| `properties.tool_choice.type` | ``"one-of"`` | -| `properties.tools` | \{ `contains`: \{ `type`: ``"Tool"`` = "Tool" } ; `isNullable`: ``true`` = true; `type`: ``"array"`` = "array" } | -| `properties.tools.contains` | \{ `type`: ``"Tool"`` = "Tool" } | -| `properties.tools.contains.type` | ``"Tool"`` | -| `properties.tools.isNullable` | ``true`` | -| `properties.tools.type` | ``"array"`` | - -#### Defined in - -[src/api/schemas/$ChatInputData.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatInputData.ts#L5) - -___ - -### $ChatMLImageContentPart - -• `Const` **$ChatMLImageContentPart**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `image_url`: \{ `description`: ``"Image content part, can be a URL or a base64-encoded image"`` ; `isRequired`: ``true`` = true; `properties`: \{ `detail`: \{ `type`: ``"Enum"`` = "Enum" } ; `url`: \{ `description`: ``"URL or base64 data url (e.g. `data:image/jpeg;base64,`)"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } } ; `type`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.image_url` | \{ `description`: ``"Image content part, can be a URL or a base64-encoded image"`` ; `isRequired`: ``true`` = true; `properties`: \{ `detail`: \{ `type`: ``"Enum"`` = "Enum" } ; `url`: \{ `description`: ``"URL or base64 data url (e.g. `data:image/jpeg;base64,`)"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } } | -| `properties.image_url.description` | ``"Image content part, can be a URL or a base64-encoded image"`` | -| `properties.image_url.isRequired` | ``true`` | -| `properties.image_url.properties` | \{ `detail`: \{ `type`: ``"Enum"`` = "Enum" } ; `url`: \{ `description`: ``"URL or base64 data url (e.g. `data:image/jpeg;base64,`)"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.image_url.properties.detail` | \{ `type`: ``"Enum"`` = "Enum" } | -| `properties.image_url.properties.detail.type` | ``"Enum"`` | -| `properties.image_url.properties.url` | \{ `description`: ``"URL or base64 data url (e.g. `data:image/jpeg;base64,`)"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.image_url.properties.url.description` | ``"URL or base64 data url (e.g. `data:image/jpeg;base64,`)"`` | -| `properties.image_url.properties.url.isRequired` | ``true`` | -| `properties.image_url.properties.url.type` | ``"string"`` | -| `properties.type` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.type.isRequired` | ``true`` | -| `properties.type.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$ChatMLImageContentPart.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatMLImageContentPart.ts#L5) - -___ - -### $ChatMLMessage - -• `Const` **$ChatMLMessage**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `content`: \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }] ; `description`: ``"ChatML content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `created_at`: \{ `description`: ``"Message created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `id`: \{ `description`: ``"Message ID"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"ChatML name"`` ; `type`: ``"string"`` = "string" } ; `role`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.content` | \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }] ; `description`: ``"ChatML content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.content.contains` | readonly [\{ `type`: ``"string"`` = "string" }] | -| `properties.content.description` | ``"ChatML content"`` | -| `properties.content.isRequired` | ``true`` | -| `properties.content.type` | ``"one-of"`` | -| `properties.created_at` | \{ `description`: ``"Message created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Message created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.isRequired` | ``true`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.id` | \{ `description`: ``"Message ID"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"Message ID"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"ChatML name"`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"ChatML name"`` | -| `properties.name.type` | ``"string"`` | -| `properties.role` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.role.isRequired` | ``true`` | -| `properties.role.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$ChatMLMessage.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatMLMessage.ts#L5) - -___ - -### $ChatMLTextContentPart - -• `Const` **$ChatMLTextContentPart**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `text`: \{ `description`: ``"Text content part"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `type`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.text` | \{ `description`: ``"Text content part"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.text.description` | ``"Text content part"`` | -| `properties.text.isRequired` | ``true`` | -| `properties.text.type` | ``"string"`` | -| `properties.type` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.type.isRequired` | ``true`` | -| `properties.type.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$ChatMLTextContentPart.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatMLTextContentPart.ts#L5) - -___ - -### $ChatResponse - -• `Const` **$ChatResponse**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"Represents a chat completion response returned by model, based on the provided input."`` | -| `properties` | \{ `doc_ids`: \{ `isRequired`: ``true`` = true; `type`: ``"DocIds"`` = "DocIds" } ; `finish_reason`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } ; `id`: \{ `description`: ``"A unique identifier for the chat completion."`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `jobs`: \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } ; `response`: \{ `contains`: \{ `contains`: \{ `type`: ``"ChatMLMessage"`` = "ChatMLMessage" } ; `type`: ``"array"`` = "array" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } ; `usage`: \{ `isRequired`: ``true`` = true; `type`: ``"CompletionUsage"`` = "CompletionUsage" } } | -| `properties.doc_ids` | \{ `isRequired`: ``true`` = true; `type`: ``"DocIds"`` = "DocIds" } | -| `properties.doc_ids.isRequired` | ``true`` | -| `properties.doc_ids.type` | ``"DocIds"`` | -| `properties.finish_reason` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.finish_reason.isRequired` | ``true`` | -| `properties.finish_reason.type` | ``"Enum"`` | -| `properties.id` | \{ `description`: ``"A unique identifier for the chat completion."`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"A unique identifier for the chat completion."`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.jobs` | \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } | -| `properties.jobs.contains` | \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } | -| `properties.jobs.contains.format` | ``"uuid"`` | -| `properties.jobs.contains.type` | ``"string"`` | -| `properties.jobs.type` | ``"array"`` | -| `properties.response` | \{ `contains`: \{ `contains`: \{ `type`: ``"ChatMLMessage"`` = "ChatMLMessage" } ; `type`: ``"array"`` = "array" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } | -| `properties.response.contains` | \{ `contains`: \{ `type`: ``"ChatMLMessage"`` = "ChatMLMessage" } ; `type`: ``"array"`` = "array" } | -| `properties.response.contains.contains` | \{ `type`: ``"ChatMLMessage"`` = "ChatMLMessage" } | -| `properties.response.contains.contains.type` | ``"ChatMLMessage"`` | -| `properties.response.contains.type` | ``"array"`` | -| `properties.response.isRequired` | ``true`` | -| `properties.response.type` | ``"array"`` | -| `properties.usage` | \{ `isRequired`: ``true`` = true; `type`: ``"CompletionUsage"`` = "CompletionUsage" } | -| `properties.usage.isRequired` | ``true`` | -| `properties.usage.type` | ``"CompletionUsage"`` | - -#### Defined in - -[src/api/schemas/$ChatResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatResponse.ts#L5) - -___ - -### $ChatSettings - -• `Const` **$ChatSettings**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `frequency_penalty`: \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } ; `length_penalty`: \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. "`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } ; `logit_bias`: \{ `contains`: \{ `type`: ``"number"`` = "number" } ; `isNullable`: ``true`` = true; `type`: ``"dictionary"`` = "dictionary" } ; `max_tokens`: \{ `description`: ``"The maximum number of tokens to generate in the chat completion.\n The total length of input tokens and generated tokens is limited by the model's context length.\n "`` ; `isNullable`: ``true`` = true; `maximum`: ``16384`` = 16384; `minimum`: ``1`` = 1; `type`: ``"number"`` = "number" } ; `min_p`: \{ `description`: ``"Minimum probability compared to leading token to be considered"`` ; `exclusiveMaximum`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } ; `presence_penalty`: \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } ; `preset`: \{ `type`: ``"Enum"`` = "Enum" } ; `repetition_penalty`: \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } ; `response_format`: \{ `description`: ``"An object specifying the format that the model must output.\n Setting to `{ \"type\": \"json_object\" }` enables JSON mode, which guarantees the message the model generates is valid JSON.\n **Important:** when using JSON mode, you **must** also instruct the model to produce JSON yourself via a system or user message. Without this, the model may generate an unending stream of whitespace until the generation reaches the token limit, resulting in a long-running and seemingly \"stuck\" request. Also note that the message content may be partially cut off if `finish_reason=\"length\"`, which indicates the generation exceeded `max_tokens` or the conversation exceeded the max context length.\n "`` ; `properties`: \{ `pattern`: \{ `description`: ``"Regular expression pattern to use if `type` is `\"regex\"`"`` ; `type`: ``"string"`` = "string" } ; `schema`: \{ `description`: ``"JSON Schema to use if `type` is `\"json_object\"`"`` ; `properties`: {} = \{} } ; `type`: \{ `type`: ``"Enum"`` = "Enum" } } } ; `seed`: \{ `description`: ``"This feature is in Beta.\n If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result.\n Determinism is not guaranteed, and you should refer to the `system_fingerprint` response parameter to monitor changes in the backend.\n "`` ; `isNullable`: ``true`` = true; `maximum`: ``9999`` = 9999; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } ; `stop`: \{ `contains`: readonly [\{ `isNullable`: ``true`` = true; `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Up to 4 sequences where the API will stop generating further tokens.\n "`` ; `type`: ``"one-of"`` = "one-of" } ; `stream`: \{ `description`: ``"If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format) as they become available, with the stream terminated by a `data: [DONE]` message. [Example Python code](https://cookbook.openai.com/examples/how_to_stream_completions).\n "`` ; `isNullable`: ``true`` = true; `type`: ``"boolean"`` = "boolean" } ; `temperature`: \{ `description`: ``"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } ; `top_p`: \{ `description`: ``"Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both."`` ; `exclusiveMinimum`: ``true`` = true; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } } | -| `properties.frequency_penalty` | \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } | -| `properties.frequency_penalty.description` | ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` | -| `properties.frequency_penalty.isNullable` | ``true`` | -| `properties.frequency_penalty.maximum` | ``1`` | -| `properties.frequency_penalty.minimum` | ``-1`` | -| `properties.frequency_penalty.type` | ``"number"`` | -| `properties.length_penalty` | \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. "`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } | -| `properties.length_penalty.description` | ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. "`` | -| `properties.length_penalty.isNullable` | ``true`` | -| `properties.length_penalty.maximum` | ``2`` | -| `properties.length_penalty.type` | ``"number"`` | -| `properties.logit_bias` | \{ `contains`: \{ `type`: ``"number"`` = "number" } ; `isNullable`: ``true`` = true; `type`: ``"dictionary"`` = "dictionary" } | -| `properties.logit_bias.contains` | \{ `type`: ``"number"`` = "number" } | -| `properties.logit_bias.contains.type` | ``"number"`` | -| `properties.logit_bias.isNullable` | ``true`` | -| `properties.logit_bias.type` | ``"dictionary"`` | -| `properties.max_tokens` | \{ `description`: ``"The maximum number of tokens to generate in the chat completion.\n The total length of input tokens and generated tokens is limited by the model's context length.\n "`` ; `isNullable`: ``true`` = true; `maximum`: ``16384`` = 16384; `minimum`: ``1`` = 1; `type`: ``"number"`` = "number" } | -| `properties.max_tokens.description` | ``"The maximum number of tokens to generate in the chat completion.\n The total length of input tokens and generated tokens is limited by the model's context length.\n "`` | -| `properties.max_tokens.isNullable` | ``true`` | -| `properties.max_tokens.maximum` | ``16384`` | -| `properties.max_tokens.minimum` | ``1`` | -| `properties.max_tokens.type` | ``"number"`` | -| `properties.min_p` | \{ `description`: ``"Minimum probability compared to leading token to be considered"`` ; `exclusiveMaximum`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } | -| `properties.min_p.description` | ``"Minimum probability compared to leading token to be considered"`` | -| `properties.min_p.exclusiveMaximum` | ``true`` | -| `properties.min_p.maximum` | ``1`` | -| `properties.min_p.type` | ``"number"`` | -| `properties.presence_penalty` | \{ `description`: ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } | -| `properties.presence_penalty.description` | ``"(OpenAI-like) Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` | -| `properties.presence_penalty.isNullable` | ``true`` | -| `properties.presence_penalty.maximum` | ``1`` | -| `properties.presence_penalty.minimum` | ``-1`` | -| `properties.presence_penalty.type` | ``"number"`` | -| `properties.preset` | \{ `type`: ``"Enum"`` = "Enum" } | -| `properties.preset.type` | ``"Enum"`` | -| `properties.repetition_penalty` | \{ `description`: ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } | -| `properties.repetition_penalty.description` | ``"(Huggingface-like) Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim."`` | -| `properties.repetition_penalty.isNullable` | ``true`` | -| `properties.repetition_penalty.maximum` | ``2`` | -| `properties.repetition_penalty.type` | ``"number"`` | -| `properties.response_format` | \{ `description`: ``"An object specifying the format that the model must output.\n Setting to `{ \"type\": \"json_object\" }` enables JSON mode, which guarantees the message the model generates is valid JSON.\n **Important:** when using JSON mode, you **must** also instruct the model to produce JSON yourself via a system or user message. Without this, the model may generate an unending stream of whitespace until the generation reaches the token limit, resulting in a long-running and seemingly \"stuck\" request. Also note that the message content may be partially cut off if `finish_reason=\"length\"`, which indicates the generation exceeded `max_tokens` or the conversation exceeded the max context length.\n "`` ; `properties`: \{ `pattern`: \{ `description`: ``"Regular expression pattern to use if `type` is `\"regex\"`"`` ; `type`: ``"string"`` = "string" } ; `schema`: \{ `description`: ``"JSON Schema to use if `type` is `\"json_object\"`"`` ; `properties`: {} = \{} } ; `type`: \{ `type`: ``"Enum"`` = "Enum" } } } | -| `properties.response_format.description` | ``"An object specifying the format that the model must output.\n Setting to `{ \"type\": \"json_object\" }` enables JSON mode, which guarantees the message the model generates is valid JSON.\n **Important:** when using JSON mode, you **must** also instruct the model to produce JSON yourself via a system or user message. Without this, the model may generate an unending stream of whitespace until the generation reaches the token limit, resulting in a long-running and seemingly \"stuck\" request. Also note that the message content may be partially cut off if `finish_reason=\"length\"`, which indicates the generation exceeded `max_tokens` or the conversation exceeded the max context length.\n "`` | -| `properties.response_format.properties` | \{ `pattern`: \{ `description`: ``"Regular expression pattern to use if `type` is `\"regex\"`"`` ; `type`: ``"string"`` = "string" } ; `schema`: \{ `description`: ``"JSON Schema to use if `type` is `\"json_object\"`"`` ; `properties`: {} = \{} } ; `type`: \{ `type`: ``"Enum"`` = "Enum" } } | -| `properties.response_format.properties.pattern` | \{ `description`: ``"Regular expression pattern to use if `type` is `\"regex\"`"`` ; `type`: ``"string"`` = "string" } | -| `properties.response_format.properties.pattern.description` | ``"Regular expression pattern to use if `type` is `\"regex\"`"`` | -| `properties.response_format.properties.pattern.type` | ``"string"`` | -| `properties.response_format.properties.schema` | \{ `description`: ``"JSON Schema to use if `type` is `\"json_object\"`"`` ; `properties`: {} = \{} } | -| `properties.response_format.properties.schema.description` | ``"JSON Schema to use if `type` is `\"json_object\"`"`` | -| `properties.response_format.properties.schema.properties` | {} | -| `properties.response_format.properties.type` | \{ `type`: ``"Enum"`` = "Enum" } | -| `properties.response_format.properties.type.type` | ``"Enum"`` | -| `properties.seed` | \{ `description`: ``"This feature is in Beta.\n If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result.\n Determinism is not guaranteed, and you should refer to the `system_fingerprint` response parameter to monitor changes in the backend.\n "`` ; `isNullable`: ``true`` = true; `maximum`: ``9999`` = 9999; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } | -| `properties.seed.description` | ``"This feature is in Beta.\n If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same `seed` and parameters should return the same result.\n Determinism is not guaranteed, and you should refer to the `system_fingerprint` response parameter to monitor changes in the backend.\n "`` | -| `properties.seed.isNullable` | ``true`` | -| `properties.seed.maximum` | ``9999`` | -| `properties.seed.minimum` | ``-1`` | -| `properties.seed.type` | ``"number"`` | -| `properties.stop` | \{ `contains`: readonly [\{ `isNullable`: ``true`` = true; `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Up to 4 sequences where the API will stop generating further tokens.\n "`` ; `type`: ``"one-of"`` = "one-of" } | -| `properties.stop.contains` | readonly [\{ `isNullable`: ``true`` = true; `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] | -| `properties.stop.description` | ``"Up to 4 sequences where the API will stop generating further tokens.\n "`` | -| `properties.stop.type` | ``"one-of"`` | -| `properties.stream` | \{ `description`: ``"If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format) as they become available, with the stream terminated by a `data: [DONE]` message. [Example Python code](https://cookbook.openai.com/examples/how_to_stream_completions).\n "`` ; `isNullable`: ``true`` = true; `type`: ``"boolean"`` = "boolean" } | -| `properties.stream.description` | ``"If set, partial message deltas will be sent, like in ChatGPT. Tokens will be sent as data-only [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format) as they become available, with the stream terminated by a `data: [DONE]` message. [Example Python code](https://cookbook.openai.com/examples/how_to_stream_completions).\n "`` | -| `properties.stream.isNullable` | ``true`` | -| `properties.stream.type` | ``"boolean"`` | -| `properties.temperature` | \{ `description`: ``"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic."`` ; `isNullable`: ``true`` = true; `maximum`: ``2`` = 2; `type`: ``"number"`` = "number" } | -| `properties.temperature.description` | ``"What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic."`` | -| `properties.temperature.isNullable` | ``true`` | -| `properties.temperature.maximum` | ``2`` | -| `properties.temperature.type` | ``"number"`` | -| `properties.top_p` | \{ `description`: ``"Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both."`` ; `exclusiveMinimum`: ``true`` = true; `isNullable`: ``true`` = true; `maximum`: ``1`` = 1; `type`: ``"number"`` = "number" } | -| `properties.top_p.description` | ``"Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both."`` | -| `properties.top_p.exclusiveMinimum` | ``true`` | -| `properties.top_p.isNullable` | ``true`` | -| `properties.top_p.maximum` | ``1`` | -| `properties.top_p.type` | ``"number"`` | - -#### Defined in - -[src/api/schemas/$ChatSettings.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ChatSettings.ts#L5) - -___ - -### $CompletionUsage - -• `Const` **$CompletionUsage**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"Usage statistics for the completion request."`` | -| `properties` | \{ `completion_tokens`: \{ `description`: ``"Number of tokens in the generated completion."`` ; `isRequired`: ``true`` = true; `type`: ``"number"`` = "number" } ; `prompt_tokens`: \{ `description`: ``"Number of tokens in the prompt."`` ; `isRequired`: ``true`` = true; `type`: ``"number"`` = "number" } ; `total_tokens`: \{ `description`: ``"Total number of tokens used in the request (prompt + completion)."`` ; `isRequired`: ``true`` = true; `type`: ``"number"`` = "number" } } | -| `properties.completion_tokens` | \{ `description`: ``"Number of tokens in the generated completion."`` ; `isRequired`: ``true`` = true; `type`: ``"number"`` = "number" } | -| `properties.completion_tokens.description` | ``"Number of tokens in the generated completion."`` | -| `properties.completion_tokens.isRequired` | ``true`` | -| `properties.completion_tokens.type` | ``"number"`` | -| `properties.prompt_tokens` | \{ `description`: ``"Number of tokens in the prompt."`` ; `isRequired`: ``true`` = true; `type`: ``"number"`` = "number" } | -| `properties.prompt_tokens.description` | ``"Number of tokens in the prompt."`` | -| `properties.prompt_tokens.isRequired` | ``true`` | -| `properties.prompt_tokens.type` | ``"number"`` | -| `properties.total_tokens` | \{ `description`: ``"Total number of tokens used in the request (prompt + completion)."`` ; `isRequired`: ``true`` = true; `type`: ``"number"`` = "number" } | -| `properties.total_tokens.description` | ``"Total number of tokens used in the request (prompt + completion)."`` | -| `properties.total_tokens.isRequired` | ``true`` | -| `properties.total_tokens.type` | ``"number"`` | - -#### Defined in - -[src/api/schemas/$CompletionUsage.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$CompletionUsage.ts#L5) - -___ - -### $CreateAgentRequest - -• `Const` **$CreateAgentRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A valid request payload for creating an agent"`` | -| `properties` | \{ `about`: \{ `description`: ``"About the agent"`` ; `type`: ``"string"`` = "string" } ; `default_settings`: \{ `description`: ``"Default model settings to start every session with"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } ; `docs`: \{ `contains`: \{ `type`: ``"CreateDoc"`` = "CreateDoc" } ; `type`: ``"array"`` = "array" } ; `instructions`: \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } ; `metadata`: \{ `description`: ``"(Optional) metadata"`` ; `properties`: {} = \{} } ; `model`: \{ `description`: ``"Name of the model that the agent is supposed to use"`` ; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"Name of the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `tools`: \{ `contains`: \{ `type`: ``"CreateToolRequest"`` = "CreateToolRequest" } ; `type`: ``"array"`` = "array" } } | -| `properties.about` | \{ `description`: ``"About the agent"`` ; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the agent"`` | -| `properties.about.type` | ``"string"`` | -| `properties.default_settings` | \{ `description`: ``"Default model settings to start every session with"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } | -| `properties.default_settings.description` | ``"Default model settings to start every session with"`` | -| `properties.default_settings.type` | ``"AgentDefaultSettings"`` | -| `properties.docs` | \{ `contains`: \{ `type`: ``"CreateDoc"`` = "CreateDoc" } ; `type`: ``"array"`` = "array" } | -| `properties.docs.contains` | \{ `type`: ``"CreateDoc"`` = "CreateDoc" } | -| `properties.docs.contains.type` | ``"CreateDoc"`` | -| `properties.docs.type` | ``"array"`` | -| `properties.instructions` | \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } | -| `properties.instructions.contains` | readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] | -| `properties.instructions.description` | ``"Instructions for the agent"`` | -| `properties.instructions.type` | ``"one-of"`` | -| `properties.metadata` | \{ `description`: ``"(Optional) metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"(Optional) metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.model` | \{ `description`: ``"Name of the model that the agent is supposed to use"`` ; `type`: ``"string"`` = "string" } | -| `properties.model.description` | ``"Name of the model that the agent is supposed to use"`` | -| `properties.model.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"Name of the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the agent"`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | -| `properties.tools` | \{ `contains`: \{ `type`: ``"CreateToolRequest"`` = "CreateToolRequest" } ; `type`: ``"array"`` = "array" } | -| `properties.tools.contains` | \{ `type`: ``"CreateToolRequest"`` = "CreateToolRequest" } | -| `properties.tools.contains.type` | ``"CreateToolRequest"`` | -| `properties.tools.type` | ``"array"`` | - -#### Defined in - -[src/api/schemas/$CreateAgentRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$CreateAgentRequest.ts#L5) - -___ - -### $CreateDoc - -• `Const` **$CreateDoc**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `content`: \{ `contains`: readonly [\{ `contains`: \{ `minItems`: ``1`` = 1; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }, \{ `description`: ``"A single document chunk"`` ; `type`: ``"string"`` = "string" }] ; `description`: ``"Information content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `title`: \{ `description`: ``"Title describing what this bit of information contains"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.content` | \{ `contains`: readonly [\{ `contains`: \{ `minItems`: ``1`` = 1; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }, \{ `description`: ``"A single document chunk"`` ; `type`: ``"string"`` = "string" }] ; `description`: ``"Information content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.content.contains` | readonly [\{ `contains`: \{ `minItems`: ``1`` = 1; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }, \{ `description`: ``"A single document chunk"`` ; `type`: ``"string"`` = "string" }] | -| `properties.content.description` | ``"Information content"`` | -| `properties.content.isRequired` | ``true`` | -| `properties.content.type` | ``"one-of"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.title` | \{ `description`: ``"Title describing what this bit of information contains"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.title.description` | ``"Title describing what this bit of information contains"`` | -| `properties.title.isRequired` | ``true`` | -| `properties.title.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$CreateDoc.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$CreateDoc.ts#L5) - -___ - -### $CreateSessionRequest - -• `Const` **$CreateSessionRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A valid request payload for creating a session"`` | -| `properties` | \{ `agent_id`: \{ `description`: ``"Agent ID of agent to associate with this session"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `context_overflow`: \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `render_templates`: \{ `description`: ``"Render system and assistant message content as jinja templates"`` ; `type`: ``"boolean"`` = "boolean" } ; `situation`: \{ `description`: ``"A specific situation that sets the background for this session"`` ; `type`: ``"string"`` = "string" } ; `token_budget`: \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } ; `user_id`: \{ `description`: ``"(Optional) User ID of user to associate with this session"`` ; `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } } | -| `properties.agent_id` | \{ `description`: ``"Agent ID of agent to associate with this session"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.agent_id.description` | ``"Agent ID of agent to associate with this session"`` | -| `properties.agent_id.format` | ``"uuid"`` | -| `properties.agent_id.isRequired` | ``true`` | -| `properties.agent_id.type` | ``"string"`` | -| `properties.context_overflow` | \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } | -| `properties.context_overflow.description` | ``"Action to start on context window overflow"`` | -| `properties.context_overflow.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.render_templates` | \{ `description`: ``"Render system and assistant message content as jinja templates"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.render_templates.description` | ``"Render system and assistant message content as jinja templates"`` | -| `properties.render_templates.type` | ``"boolean"`` | -| `properties.situation` | \{ `description`: ``"A specific situation that sets the background for this session"`` ; `type`: ``"string"`` = "string" } | -| `properties.situation.description` | ``"A specific situation that sets the background for this session"`` | -| `properties.situation.type` | ``"string"`` | -| `properties.token_budget` | \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } | -| `properties.token_budget.description` | ``"Threshold value for the adaptive context functionality"`` | -| `properties.token_budget.type` | ``"number"`` | -| `properties.user_id` | \{ `description`: ``"(Optional) User ID of user to associate with this session"`` ; `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } | -| `properties.user_id.description` | ``"(Optional) User ID of user to associate with this session"`` | -| `properties.user_id.format` | ``"uuid"`` | -| `properties.user_id.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$CreateSessionRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$CreateSessionRequest.ts#L5) - -___ - -### $CreateToolRequest - -• `Const` **$CreateToolRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `function`: \{ `contains`: readonly [\{ `type`: ``"FunctionDef"`` = "FunctionDef" }] ; `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `type`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.function` | \{ `contains`: readonly [\{ `type`: ``"FunctionDef"`` = "FunctionDef" }] ; `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.function.contains` | readonly [\{ `type`: ``"FunctionDef"`` = "FunctionDef" }] | -| `properties.function.description` | ``"Function definition and parameters"`` | -| `properties.function.isRequired` | ``true`` | -| `properties.function.type` | ``"one-of"`` | -| `properties.type` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.type.isRequired` | ``true`` | -| `properties.type.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$CreateToolRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$CreateToolRequest.ts#L5) - -___ - -### $CreateUserRequest - -• `Const` **$CreateUserRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A valid request payload for creating a user"`` | -| `properties` | \{ `about`: \{ `description`: ``"About the user"`` ; `type`: ``"string"`` = "string" } ; `docs`: \{ `contains`: \{ `type`: ``"CreateDoc"`` = "CreateDoc" } ; `type`: ``"array"`` = "array" } ; `metadata`: \{ `description`: ``"(Optional) metadata"`` ; `properties`: {} = \{} } ; `name`: \{ `description`: ``"Name of the user"`` ; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the user"`` ; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the user"`` | -| `properties.about.type` | ``"string"`` | -| `properties.docs` | \{ `contains`: \{ `type`: ``"CreateDoc"`` = "CreateDoc" } ; `type`: ``"array"`` = "array" } | -| `properties.docs.contains` | \{ `type`: ``"CreateDoc"`` = "CreateDoc" } | -| `properties.docs.contains.type` | ``"CreateDoc"`` | -| `properties.docs.type` | ``"array"`` | -| `properties.metadata` | \{ `description`: ``"(Optional) metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"(Optional) metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.name` | \{ `description`: ``"Name of the user"`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the user"`` | -| `properties.name.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$CreateUserRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$CreateUserRequest.ts#L5) - -___ - -### $Doc - -• `Const` **$Doc**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `content`: \{ `contains`: readonly [\{ `contains`: \{ `minItems`: ``1`` = 1; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }, \{ `description`: ``"A single document chunk"`` ; `type`: ``"string"`` = "string" }] ; `description`: ``"Information content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `created_at`: \{ `description`: ``"Doc created at"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `id`: \{ `description`: ``"ID of doc"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"optional metadata"`` ; `properties`: {} = \{} } ; `title`: \{ `description`: ``"Title describing what this bit of information contains"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.content` | \{ `contains`: readonly [\{ `contains`: \{ `minItems`: ``1`` = 1; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }, \{ `description`: ``"A single document chunk"`` ; `type`: ``"string"`` = "string" }] ; `description`: ``"Information content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.content.contains` | readonly [\{ `contains`: \{ `minItems`: ``1`` = 1; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }, \{ `description`: ``"A single document chunk"`` ; `type`: ``"string"`` = "string" }] | -| `properties.content.description` | ``"Information content"`` | -| `properties.content.isRequired` | ``true`` | -| `properties.content.type` | ``"one-of"`` | -| `properties.created_at` | \{ `description`: ``"Doc created at"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Doc created at"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.isRequired` | ``true`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.id` | \{ `description`: ``"ID of doc"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"ID of doc"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.title` | \{ `description`: ``"Title describing what this bit of information contains"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.title.description` | ``"Title describing what this bit of information contains"`` | -| `properties.title.isRequired` | ``true`` | -| `properties.title.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$Doc.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$Doc.ts#L5) - -___ - -### $DocIds - -• `Const` **$DocIds**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `agent_doc_ids`: \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } ; `user_doc_ids`: \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } } | -| `properties.agent_doc_ids` | \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } | -| `properties.agent_doc_ids.contains` | \{ `type`: ``"string"`` = "string" } | -| `properties.agent_doc_ids.contains.type` | ``"string"`` | -| `properties.agent_doc_ids.isRequired` | ``true`` | -| `properties.agent_doc_ids.type` | ``"array"`` | -| `properties.user_doc_ids` | \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } | -| `properties.user_doc_ids.contains` | \{ `type`: ``"string"`` = "string" } | -| `properties.user_doc_ids.contains.type` | ``"string"`` | -| `properties.user_doc_ids.isRequired` | ``true`` | -| `properties.user_doc_ids.type` | ``"array"`` | - -#### Defined in - -[src/api/schemas/$DocIds.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$DocIds.ts#L5) - -___ - -### $FunctionCallOption - -• `Const` **$FunctionCallOption**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"Specifying a particular function via `{\"name\": \"my_function\"}` forces the model to call that function.\n "`` | -| `properties` | \{ `name`: \{ `description`: ``"The name of the function to call."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.name` | \{ `description`: ``"The name of the function to call."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"The name of the function to call."`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$FunctionCallOption.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$FunctionCallOption.ts#L5) - -___ - -### $FunctionDef - -• `Const` **$FunctionDef**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `description`: \{ `description`: ``"A description of what the function does, used by the model to choose when and how to call the function."`` ; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `parameters`: \{ `description`: ``"Parameters accepeted by this function"`` ; `isRequired`: ``true`` = true; `type`: ``"FunctionParameters"`` = "FunctionParameters" } } | -| `properties.description` | \{ `description`: ``"A description of what the function does, used by the model to choose when and how to call the function."`` ; `type`: ``"string"`` = "string" } | -| `properties.description.description` | ``"A description of what the function does, used by the model to choose when and how to call the function."`` | -| `properties.description.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64."`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | -| `properties.parameters` | \{ `description`: ``"Parameters accepeted by this function"`` ; `isRequired`: ``true`` = true; `type`: ``"FunctionParameters"`` = "FunctionParameters" } | -| `properties.parameters.description` | ``"Parameters accepeted by this function"`` | -| `properties.parameters.isRequired` | ``true`` | -| `properties.parameters.type` | ``"FunctionParameters"`` | - -#### Defined in - -[src/api/schemas/$FunctionDef.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$FunctionDef.ts#L5) - -___ - -### $FunctionParameters - -• `Const` **$FunctionParameters**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `contains` | \{ `properties`: {} = \{} } | -| `contains.properties` | {} | -| `type` | ``"dictionary"`` | - -#### Defined in - -[src/api/schemas/$FunctionParameters.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$FunctionParameters.ts#L5) - -___ - -### $InputChatMLMessage - -• `Const` **$InputChatMLMessage**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `content`: \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }] ; `description`: ``"ChatML content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `continue`: \{ `description`: ``"Whether to continue this message or return a new one"`` ; `type`: ``"boolean"`` = "boolean" } ; `name`: \{ `description`: ``"ChatML name"`` ; `type`: ``"string"`` = "string" } ; `role`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.content` | \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }] ; `description`: ``"ChatML content"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.content.contains` | readonly [\{ `type`: ``"string"`` = "string" }] | -| `properties.content.description` | ``"ChatML content"`` | -| `properties.content.isRequired` | ``true`` | -| `properties.content.type` | ``"one-of"`` | -| `properties.continue` | \{ `description`: ``"Whether to continue this message or return a new one"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.continue.description` | ``"Whether to continue this message or return a new one"`` | -| `properties.continue.type` | ``"boolean"`` | -| `properties.name` | \{ `description`: ``"ChatML name"`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"ChatML name"`` | -| `properties.name.type` | ``"string"`` | -| `properties.role` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.role.isRequired` | ``true`` | -| `properties.role.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$InputChatMLMessage.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$InputChatMLMessage.ts#L5) - -___ - -### $JobStatus - -• `Const` **$JobStatus**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `created_at`: \{ `description`: ``"Job created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `has_progress`: \{ `description`: ``"Whether this Job supports progress updates"`` ; `type`: ``"boolean"`` = "boolean" } ; `id`: \{ `description`: ``"Job id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"Name of the job"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `progress`: \{ `description`: ``"Progress percentage"`` ; `maximum`: ``100`` = 100; `type`: ``"number"`` = "number" } ; `reason`: \{ `description`: ``"Reason for current state"`` ; `type`: ``"string"`` = "string" } ; `state`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } ; `updated_at`: \{ `description`: ``"Job updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } } | -| `properties.created_at` | \{ `description`: ``"Job created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Job created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.isRequired` | ``true`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.has_progress` | \{ `description`: ``"Whether this Job supports progress updates"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.has_progress.description` | ``"Whether this Job supports progress updates"`` | -| `properties.has_progress.type` | ``"boolean"`` | -| `properties.id` | \{ `description`: ``"Job id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"Job id (UUID)"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"Name of the job"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the job"`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | -| `properties.progress` | \{ `description`: ``"Progress percentage"`` ; `maximum`: ``100`` = 100; `type`: ``"number"`` = "number" } | -| `properties.progress.description` | ``"Progress percentage"`` | -| `properties.progress.maximum` | ``100`` | -| `properties.progress.type` | ``"number"`` | -| `properties.reason` | \{ `description`: ``"Reason for current state"`` ; `type`: ``"string"`` = "string" } | -| `properties.reason.description` | ``"Reason for current state"`` | -| `properties.reason.type` | ``"string"`` | -| `properties.state` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.state.isRequired` | ``true`` | -| `properties.state.type` | ``"Enum"`` | -| `properties.updated_at` | \{ `description`: ``"Job updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.updated_at.description` | ``"Job updated at (RFC-3339 format)"`` | -| `properties.updated_at.format` | ``"date-time"`` | -| `properties.updated_at.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$JobStatus.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$JobStatus.ts#L5) - -___ - -### $Memory - -• `Const` **$Memory**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `agent_id`: \{ `description`: ``"ID of the agent"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `content`: \{ `description`: ``"Content of the memory"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `created_at`: \{ `description`: ``"Memory created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `entities`: \{ `contains`: \{ `properties`: {} = \{} } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } ; `id`: \{ `description`: ``"Memory id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `last_accessed_at`: \{ `description`: ``"Memory last accessed at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `sentiment`: \{ `description`: ``"Sentiment (valence) of the memory on a scale of -1 to 1"`` ; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } ; `timestamp`: \{ `description`: ``"Memory happened at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `user_id`: \{ `description`: ``"ID of the user"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.agent_id` | \{ `description`: ``"ID of the agent"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.agent_id.description` | ``"ID of the agent"`` | -| `properties.agent_id.format` | ``"uuid"`` | -| `properties.agent_id.isRequired` | ``true`` | -| `properties.agent_id.type` | ``"string"`` | -| `properties.content` | \{ `description`: ``"Content of the memory"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.content.description` | ``"Content of the memory"`` | -| `properties.content.isRequired` | ``true`` | -| `properties.content.type` | ``"string"`` | -| `properties.created_at` | \{ `description`: ``"Memory created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Memory created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.isRequired` | ``true`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.entities` | \{ `contains`: \{ `properties`: {} = \{} } ; `isRequired`: ``true`` = true; `type`: ``"array"`` = "array" } | -| `properties.entities.contains` | \{ `properties`: {} = \{} } | -| `properties.entities.contains.properties` | {} | -| `properties.entities.isRequired` | ``true`` | -| `properties.entities.type` | ``"array"`` | -| `properties.id` | \{ `description`: ``"Memory id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"Memory id (UUID)"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.last_accessed_at` | \{ `description`: ``"Memory last accessed at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.last_accessed_at.description` | ``"Memory last accessed at (RFC-3339 format)"`` | -| `properties.last_accessed_at.format` | ``"date-time"`` | -| `properties.last_accessed_at.type` | ``"string"`` | -| `properties.sentiment` | \{ `description`: ``"Sentiment (valence) of the memory on a scale of -1 to 1"`` ; `maximum`: ``1`` = 1; `minimum`: ``-1`` = -1; `type`: ``"number"`` = "number" } | -| `properties.sentiment.description` | ``"Sentiment (valence) of the memory on a scale of -1 to 1"`` | -| `properties.sentiment.maximum` | ``1`` | -| `properties.sentiment.minimum` | ``-1`` | -| `properties.sentiment.type` | ``"number"`` | -| `properties.timestamp` | \{ `description`: ``"Memory happened at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.timestamp.description` | ``"Memory happened at (RFC-3339 format)"`` | -| `properties.timestamp.format` | ``"date-time"`` | -| `properties.timestamp.type` | ``"string"`` | -| `properties.user_id` | \{ `description`: ``"ID of the user"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.user_id.description` | ``"ID of the user"`` | -| `properties.user_id.format` | ``"uuid"`` | -| `properties.user_id.isRequired` | ``true`` | -| `properties.user_id.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$Memory.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$Memory.ts#L5) - -___ - -### $MemoryAccessOptions - -• `Const` **$MemoryAccessOptions**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `recall`: \{ `description`: ``"Whether previous memories should be recalled or not"`` ; `type`: ``"boolean"`` = "boolean" } ; `record`: \{ `description`: ``"Whether this interaction should be recorded in history or not"`` ; `type`: ``"boolean"`` = "boolean" } ; `remember`: \{ `description`: ``"Whether this interaction should form memories or not"`` ; `type`: ``"boolean"`` = "boolean" } } | -| `properties.recall` | \{ `description`: ``"Whether previous memories should be recalled or not"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.recall.description` | ``"Whether previous memories should be recalled or not"`` | -| `properties.recall.type` | ``"boolean"`` | -| `properties.record` | \{ `description`: ``"Whether this interaction should be recorded in history or not"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.record.description` | ``"Whether this interaction should be recorded in history or not"`` | -| `properties.record.type` | ``"boolean"`` | -| `properties.remember` | \{ `description`: ``"Whether this interaction should form memories or not"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.remember.description` | ``"Whether this interaction should form memories or not"`` | -| `properties.remember.type` | ``"boolean"`` | - -#### Defined in - -[src/api/schemas/$MemoryAccessOptions.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$MemoryAccessOptions.ts#L5) - -___ - -### $NamedToolChoice - -• `Const` **$NamedToolChoice**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"Specifies a tool the model should use. Use to force the model to call a specific function."`` | -| `properties` | \{ `function`: \{ `isRequired`: ``true`` = true; `properties`: \{ `name`: \{ `description`: ``"The name of the function to call."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } } ; `type`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.function` | \{ `isRequired`: ``true`` = true; `properties`: \{ `name`: \{ `description`: ``"The name of the function to call."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } } | -| `properties.function.isRequired` | ``true`` | -| `properties.function.properties` | \{ `name`: \{ `description`: ``"The name of the function to call."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.function.properties.name` | \{ `description`: ``"The name of the function to call."`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.function.properties.name.description` | ``"The name of the function to call."`` | -| `properties.function.properties.name.isRequired` | ``true`` | -| `properties.function.properties.name.type` | ``"string"`` | -| `properties.type` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.type.isRequired` | ``true`` | -| `properties.type.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$NamedToolChoice.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$NamedToolChoice.ts#L5) - -___ - -### $PartialFunctionDef - -• `Const` **$PartialFunctionDef**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `description`: \{ `description`: ``"A description of what the function does, used by the model to choose when and how to call the function."`` ; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64."`` ; `type`: ``"string"`` = "string" } ; `parameters`: \{ `description`: ``"Parameters accepeted by this function"`` ; `type`: ``"FunctionParameters"`` = "FunctionParameters" } } | -| `properties.description` | \{ `description`: ``"A description of what the function does, used by the model to choose when and how to call the function."`` ; `type`: ``"string"`` = "string" } | -| `properties.description.description` | ``"A description of what the function does, used by the model to choose when and how to call the function."`` | -| `properties.description.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64."`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"The name of the function to be called. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64."`` | -| `properties.name.type` | ``"string"`` | -| `properties.parameters` | \{ `description`: ``"Parameters accepeted by this function"`` ; `type`: ``"FunctionParameters"`` = "FunctionParameters" } | -| `properties.parameters.description` | ``"Parameters accepeted by this function"`` | -| `properties.parameters.type` | ``"FunctionParameters"`` | - -#### Defined in - -[src/api/schemas/$PartialFunctionDef.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$PartialFunctionDef.ts#L5) - -___ - -### $PatchAgentRequest - -• `Const` **$PatchAgentRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A request for patching an agent"`` | -| `properties` | \{ `about`: \{ `description`: ``"About the agent"`` ; `type`: ``"string"`` = "string" } ; `default_settings`: \{ `description`: ``"Default model settings to start every session with"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } ; `instructions`: \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `model`: \{ `description`: ``"Name of the model that the agent is supposed to use"`` ; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"Name of the agent"`` ; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the agent"`` ; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the agent"`` | -| `properties.about.type` | ``"string"`` | -| `properties.default_settings` | \{ `description`: ``"Default model settings to start every session with"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } | -| `properties.default_settings.description` | ``"Default model settings to start every session with"`` | -| `properties.default_settings.type` | ``"AgentDefaultSettings"`` | -| `properties.instructions` | \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } | -| `properties.instructions.contains` | readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] | -| `properties.instructions.description` | ``"Instructions for the agent"`` | -| `properties.instructions.type` | ``"one-of"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.model` | \{ `description`: ``"Name of the model that the agent is supposed to use"`` ; `type`: ``"string"`` = "string" } | -| `properties.model.description` | ``"Name of the model that the agent is supposed to use"`` | -| `properties.model.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"Name of the agent"`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the agent"`` | -| `properties.name.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$PatchAgentRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$PatchAgentRequest.ts#L5) - -___ - -### $PatchSessionRequest - -• `Const` **$PatchSessionRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A request for patching a session"`` | -| `properties` | \{ `context_overflow`: \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `situation`: \{ `description`: ``"Updated situation for this session"`` ; `type`: ``"string"`` = "string" } ; `token_budget`: \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } } | -| `properties.context_overflow` | \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } | -| `properties.context_overflow.description` | ``"Action to start on context window overflow"`` | -| `properties.context_overflow.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.situation` | \{ `description`: ``"Updated situation for this session"`` ; `type`: ``"string"`` = "string" } | -| `properties.situation.description` | ``"Updated situation for this session"`` | -| `properties.situation.type` | ``"string"`` | -| `properties.token_budget` | \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } | -| `properties.token_budget.description` | ``"Threshold value for the adaptive context functionality"`` | -| `properties.token_budget.type` | ``"number"`` | - -#### Defined in - -[src/api/schemas/$PatchSessionRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$PatchSessionRequest.ts#L5) - -___ - -### $PatchToolRequest - -• `Const` **$PatchToolRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `function`: \{ `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"PartialFunctionDef"`` = "PartialFunctionDef" } } | -| `properties.function` | \{ `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"PartialFunctionDef"`` = "PartialFunctionDef" } | -| `properties.function.description` | ``"Function definition and parameters"`` | -| `properties.function.isRequired` | ``true`` | -| `properties.function.type` | ``"PartialFunctionDef"`` | - -#### Defined in - -[src/api/schemas/$PatchToolRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$PatchToolRequest.ts#L5) - -___ - -### $PatchUserRequest - -• `Const` **$PatchUserRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A request for patching a user"`` | -| `properties` | \{ `about`: \{ `description`: ``"About the user"`` ; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `name`: \{ `description`: ``"Name of the user"`` ; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the user"`` ; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the user"`` | -| `properties.about.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.name` | \{ `description`: ``"Name of the user"`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the user"`` | -| `properties.name.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$PatchUserRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$PatchUserRequest.ts#L5) - -___ - -### $ResourceCreatedResponse - -• `Const` **$ResourceCreatedResponse**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `created_at`: \{ `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `id`: \{ `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `jobs`: \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } } | -| `properties.created_at` | \{ `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.isRequired` | ``true`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.id` | \{ `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.jobs` | \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } | -| `properties.jobs.contains` | \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } | -| `properties.jobs.contains.format` | ``"uuid"`` | -| `properties.jobs.contains.type` | ``"string"`` | -| `properties.jobs.type` | ``"array"`` | - -#### Defined in - -[src/api/schemas/$ResourceCreatedResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ResourceCreatedResponse.ts#L5) - -___ - -### $ResourceDeletedResponse - -• `Const` **$ResourceDeletedResponse**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `deleted_at`: \{ `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `id`: \{ `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `jobs`: \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } } | -| `properties.deleted_at` | \{ `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.deleted_at.format` | ``"date-time"`` | -| `properties.deleted_at.isRequired` | ``true`` | -| `properties.deleted_at.type` | ``"string"`` | -| `properties.id` | \{ `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.jobs` | \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } | -| `properties.jobs.contains` | \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } | -| `properties.jobs.contains.format` | ``"uuid"`` | -| `properties.jobs.contains.type` | ``"string"`` | -| `properties.jobs.type` | ``"array"`` | - -#### Defined in - -[src/api/schemas/$ResourceDeletedResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ResourceDeletedResponse.ts#L5) - -___ - -### $ResourceUpdatedResponse - -• `Const` **$ResourceUpdatedResponse**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `id`: \{ `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `jobs`: \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } ; `updated_at`: \{ `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.id` | \{ `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.jobs` | \{ `contains`: \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" } | -| `properties.jobs.contains` | \{ `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } | -| `properties.jobs.contains.format` | ``"uuid"`` | -| `properties.jobs.contains.type` | ``"string"`` | -| `properties.jobs.type` | ``"array"`` | -| `properties.updated_at` | \{ `format`: ``"date-time"`` = "date-time"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.updated_at.format` | ``"date-time"`` | -| `properties.updated_at.isRequired` | ``true`` | -| `properties.updated_at.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$ResourceUpdatedResponse.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ResourceUpdatedResponse.ts#L5) - -___ - -### $Session - -• `Const` **$Session**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `agent_id`: \{ `description`: ``"Agent ID of agent associated with this session"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `context_overflow`: \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } ; `created_at`: \{ `description`: ``"Session created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `id`: \{ `description`: ``"Session id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `render_templates`: \{ `description`: ``"Render system and assistant message content as jinja templates"`` ; `type`: ``"boolean"`` = "boolean" } ; `situation`: \{ `description`: ``"A specific situation that sets the background for this session"`` ; `type`: ``"string"`` = "string" } ; `summary`: \{ `description`: ``"(null at the beginning) - generated automatically after every interaction"`` ; `type`: ``"string"`` = "string" } ; `token_budget`: \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } ; `updated_at`: \{ `description`: ``"Session updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `user_id`: \{ `description`: ``"User ID of user associated with this session"`` ; `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } } | -| `properties.agent_id` | \{ `description`: ``"Agent ID of agent associated with this session"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.agent_id.description` | ``"Agent ID of agent associated with this session"`` | -| `properties.agent_id.format` | ``"uuid"`` | -| `properties.agent_id.isRequired` | ``true`` | -| `properties.agent_id.type` | ``"string"`` | -| `properties.context_overflow` | \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } | -| `properties.context_overflow.description` | ``"Action to start on context window overflow"`` | -| `properties.context_overflow.type` | ``"string"`` | -| `properties.created_at` | \{ `description`: ``"Session created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Session created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.id` | \{ `description`: ``"Session id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"Session id (UUID)"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.render_templates` | \{ `description`: ``"Render system and assistant message content as jinja templates"`` ; `type`: ``"boolean"`` = "boolean" } | -| `properties.render_templates.description` | ``"Render system and assistant message content as jinja templates"`` | -| `properties.render_templates.type` | ``"boolean"`` | -| `properties.situation` | \{ `description`: ``"A specific situation that sets the background for this session"`` ; `type`: ``"string"`` = "string" } | -| `properties.situation.description` | ``"A specific situation that sets the background for this session"`` | -| `properties.situation.type` | ``"string"`` | -| `properties.summary` | \{ `description`: ``"(null at the beginning) - generated automatically after every interaction"`` ; `type`: ``"string"`` = "string" } | -| `properties.summary.description` | ``"(null at the beginning) - generated automatically after every interaction"`` | -| `properties.summary.type` | ``"string"`` | -| `properties.token_budget` | \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } | -| `properties.token_budget.description` | ``"Threshold value for the adaptive context functionality"`` | -| `properties.token_budget.type` | ``"number"`` | -| `properties.updated_at` | \{ `description`: ``"Session updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.updated_at.description` | ``"Session updated at (RFC-3339 format)"`` | -| `properties.updated_at.format` | ``"date-time"`` | -| `properties.updated_at.type` | ``"string"`` | -| `properties.user_id` | \{ `description`: ``"User ID of user associated with this session"`` ; `format`: ``"uuid"`` = "uuid"; `type`: ``"string"`` = "string" } | -| `properties.user_id.description` | ``"User ID of user associated with this session"`` | -| `properties.user_id.format` | ``"uuid"`` | -| `properties.user_id.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$Session.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$Session.ts#L5) - -___ - -### $Suggestion - -• `Const` **$Suggestion**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `content`: \{ `description`: ``"The content of the suggestion"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `created_at`: \{ `description`: ``"Suggestion created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `message_id`: \{ `description`: ``"The message that produced it"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `session_id`: \{ `description`: ``"Session this suggestion belongs to"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `target`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.content` | \{ `description`: ``"The content of the suggestion"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.content.description` | ``"The content of the suggestion"`` | -| `properties.content.isRequired` | ``true`` | -| `properties.content.type` | ``"string"`` | -| `properties.created_at` | \{ `description`: ``"Suggestion created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"Suggestion created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.message_id` | \{ `description`: ``"The message that produced it"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.message_id.description` | ``"The message that produced it"`` | -| `properties.message_id.format` | ``"uuid"`` | -| `properties.message_id.isRequired` | ``true`` | -| `properties.message_id.type` | ``"string"`` | -| `properties.session_id` | \{ `description`: ``"Session this suggestion belongs to"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.session_id.description` | ``"Session this suggestion belongs to"`` | -| `properties.session_id.format` | ``"uuid"`` | -| `properties.session_id.isRequired` | ``true`` | -| `properties.session_id.type` | ``"string"`` | -| `properties.target` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.target.isRequired` | ``true`` | -| `properties.target.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$Suggestion.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$Suggestion.ts#L5) - -___ - -### $Tool - -• `Const` **$Tool**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `function`: \{ `contains`: readonly [\{ `type`: ``"FunctionDef"`` = "FunctionDef" }] ; `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } ; `id`: \{ `description`: ``"Tool ID"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `type`: \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } } | -| `properties.function` | \{ `contains`: readonly [\{ `type`: ``"FunctionDef"`` = "FunctionDef" }] ; `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"one-of"`` = "one-of" } | -| `properties.function.contains` | readonly [\{ `type`: ``"FunctionDef"`` = "FunctionDef" }] | -| `properties.function.description` | ``"Function definition and parameters"`` | -| `properties.function.isRequired` | ``true`` | -| `properties.function.type` | ``"one-of"`` | -| `properties.id` | \{ `description`: ``"Tool ID"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"Tool ID"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.type` | \{ `isRequired`: ``true`` = true; `type`: ``"Enum"`` = "Enum" } | -| `properties.type.isRequired` | ``true`` | -| `properties.type.type` | ``"Enum"`` | - -#### Defined in - -[src/api/schemas/$Tool.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$Tool.ts#L5) - -___ - -### $ToolChoiceOption - -• `Const` **$ToolChoiceOption**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `contains` | readonly [\{ `type`: ``"Enum"`` = "Enum" }, \{ `type`: ``"NamedToolChoice"`` = "NamedToolChoice" }] | -| `description` | ``"Controls which (if any) function is called by the model.\n `none` means the model will not call a function and instead generates a message.\n `auto` means the model can pick between generating a message or calling a function.\n Specifying a particular function via `{\"type: \"function\", \"function\": {\"name\": \"my_function\"}}` forces the model to call that function.\n `none` is the default when no functions are present. `auto` is the default if functions are present.\n "`` | -| `type` | ``"one-of"`` | - -#### Defined in - -[src/api/schemas/$ToolChoiceOption.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$ToolChoiceOption.ts#L5) - -___ - -### $UpdateAgentRequest - -• `Const` **$UpdateAgentRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A valid request payload for updating an agent"`` | -| `properties` | \{ `about`: \{ `description`: ``"About the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `default_settings`: \{ `description`: ``"Default model settings to start every session with"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } ; `instructions`: \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `model`: \{ `description`: ``"Name of the model that the agent is supposed to use"`` ; `type`: ``"string"`` = "string" } ; `name`: \{ `description`: ``"Name of the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the agent"`` | -| `properties.about.isRequired` | ``true`` | -| `properties.about.type` | ``"string"`` | -| `properties.default_settings` | \{ `description`: ``"Default model settings to start every session with"`` ; `type`: ``"AgentDefaultSettings"`` = "AgentDefaultSettings" } | -| `properties.default_settings.description` | ``"Default model settings to start every session with"`` | -| `properties.default_settings.type` | ``"AgentDefaultSettings"`` | -| `properties.instructions` | \{ `contains`: readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] ; `description`: ``"Instructions for the agent"`` ; `type`: ``"one-of"`` = "one-of" } | -| `properties.instructions.contains` | readonly [\{ `type`: ``"string"`` = "string" }, \{ `contains`: \{ `type`: ``"string"`` = "string" } ; `type`: ``"array"`` = "array" }] | -| `properties.instructions.description` | ``"Instructions for the agent"`` | -| `properties.instructions.type` | ``"one-of"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.model` | \{ `description`: ``"Name of the model that the agent is supposed to use"`` ; `type`: ``"string"`` = "string" } | -| `properties.model.description` | ``"Name of the model that the agent is supposed to use"`` | -| `properties.model.type` | ``"string"`` | -| `properties.name` | \{ `description`: ``"Name of the agent"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the agent"`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$UpdateAgentRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$UpdateAgentRequest.ts#L5) - -___ - -### $UpdateSessionRequest - -• `Const` **$UpdateSessionRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A valid request payload for updating a session"`` | -| `properties` | \{ `context_overflow`: \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `situation`: \{ `description`: ``"Updated situation for this session"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `token_budget`: \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } } | -| `properties.context_overflow` | \{ `description`: ``"Action to start on context window overflow"`` ; `type`: ``"string"`` = "string" } | -| `properties.context_overflow.description` | ``"Action to start on context window overflow"`` | -| `properties.context_overflow.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.situation` | \{ `description`: ``"Updated situation for this session"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.situation.description` | ``"Updated situation for this session"`` | -| `properties.situation.isRequired` | ``true`` | -| `properties.situation.type` | ``"string"`` | -| `properties.token_budget` | \{ `description`: ``"Threshold value for the adaptive context functionality"`` ; `type`: ``"number"`` = "number" } | -| `properties.token_budget.description` | ``"Threshold value for the adaptive context functionality"`` | -| `properties.token_budget.type` | ``"number"`` | - -#### Defined in - -[src/api/schemas/$UpdateSessionRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$UpdateSessionRequest.ts#L5) - -___ - -### $UpdateToolRequest - -• `Const` **$UpdateToolRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `function`: \{ `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"FunctionDef"`` = "FunctionDef" } } | -| `properties.function` | \{ `description`: ``"Function definition and parameters"`` ; `isRequired`: ``true`` = true; `type`: ``"FunctionDef"`` = "FunctionDef" } | -| `properties.function.description` | ``"Function definition and parameters"`` | -| `properties.function.isRequired` | ``true`` | -| `properties.function.type` | ``"FunctionDef"`` | - -#### Defined in - -[src/api/schemas/$UpdateToolRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$UpdateToolRequest.ts#L5) - -___ - -### $UpdateUserRequest - -• `Const` **$UpdateUserRequest**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `description` | ``"A valid request payload for updating a user"`` | -| `properties` | \{ `about`: \{ `description`: ``"About the user"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } ; `name`: \{ `description`: ``"Name of the user"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the user"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the user"`` | -| `properties.about.isRequired` | ``true`` | -| `properties.about.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"Optional metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"Optional metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.name` | \{ `description`: ``"Name of the user"`` ; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the user"`` | -| `properties.name.isRequired` | ``true`` | -| `properties.name.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$UpdateUserRequest.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$UpdateUserRequest.ts#L5) - -___ - -### $User - -• `Const` **$User**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `properties` | \{ `about`: \{ `description`: ``"About the user"`` ; `type`: ``"string"`` = "string" } ; `created_at`: \{ `description`: ``"User created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } ; `id`: \{ `description`: ``"User id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } ; `metadata`: \{ `description`: ``"(Optional) metadata"`` ; `properties`: {} = \{} } ; `name`: \{ `description`: ``"Name of the user"`` ; `type`: ``"string"`` = "string" } ; `updated_at`: \{ `description`: ``"User updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } } | -| `properties.about` | \{ `description`: ``"About the user"`` ; `type`: ``"string"`` = "string" } | -| `properties.about.description` | ``"About the user"`` | -| `properties.about.type` | ``"string"`` | -| `properties.created_at` | \{ `description`: ``"User created at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.created_at.description` | ``"User created at (RFC-3339 format)"`` | -| `properties.created_at.format` | ``"date-time"`` | -| `properties.created_at.type` | ``"string"`` | -| `properties.id` | \{ `description`: ``"User id (UUID)"`` ; `format`: ``"uuid"`` = "uuid"; `isRequired`: ``true`` = true; `type`: ``"string"`` = "string" } | -| `properties.id.description` | ``"User id (UUID)"`` | -| `properties.id.format` | ``"uuid"`` | -| `properties.id.isRequired` | ``true`` | -| `properties.id.type` | ``"string"`` | -| `properties.metadata` | \{ `description`: ``"(Optional) metadata"`` ; `properties`: {} = \{} } | -| `properties.metadata.description` | ``"(Optional) metadata"`` | -| `properties.metadata.properties` | {} | -| `properties.name` | \{ `description`: ``"Name of the user"`` ; `type`: ``"string"`` = "string" } | -| `properties.name.description` | ``"Name of the user"`` | -| `properties.name.type` | ``"string"`` | -| `properties.updated_at` | \{ `description`: ``"User updated at (RFC-3339 format)"`` ; `format`: ``"date-time"`` = "date-time"; `type`: ``"string"`` = "string" } | -| `properties.updated_at.description` | ``"User updated at (RFC-3339 format)"`` | -| `properties.updated_at.format` | ``"date-time"`` | -| `properties.updated_at.type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$User.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$User.ts#L5) - -___ - -### $agent\_id - -• `Const` **$agent\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$agent_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$agent_id.ts#L5) - -___ - -### $doc\_id - -• `Const` **$doc\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$doc_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$doc_id.ts#L5) - -___ - -### $job\_id - -• `Const` **$job\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$job_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$job_id.ts#L5) - -___ - -### $memory\_id - -• `Const` **$memory\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$memory_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$memory_id.ts#L5) - -___ - -### $message\_id - -• `Const` **$message\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$message_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$message_id.ts#L5) - -___ - -### $session\_id - -• `Const` **$session\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$session_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$session_id.ts#L5) - -___ - -### $tool\_id - -• `Const` **$tool\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$tool_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$tool_id.ts#L5) - -___ - -### $user\_id - -• `Const` **$user\_id**: `Object` - -#### Type declaration - -| Name | Type | -| :------ | :------ | -| `format` | ``"uuid"`` | -| `type` | ``"string"`` | - -#### Defined in - -[src/api/schemas/$user_id.ts:5](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/schemas/$user_id.ts#L5) - -___ - -### OpenAPI - -• `Const` **OpenAPI**: [`OpenAPIConfig`](api.md#openapiconfig) - -#### Defined in - -[src/api/core/OpenAPI.ts:22](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/api/core/OpenAPI.ts#L22) diff --git a/docs/js-sdk-docs/modules/api_JulepApiClient.md b/docs/js-sdk-docs/modules/api_JulepApiClient.md deleted file mode 100644 index 07f3cc365..000000000 --- a/docs/js-sdk-docs/modules/api_JulepApiClient.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / api/JulepApiClient - -# Module: api/JulepApiClient - -## Table of contents - -### Classes - -- [JulepApiClient](../classes/api_JulepApiClient.JulepApiClient.md) diff --git a/docs/js-sdk-docs/modules/managers_agent.md b/docs/js-sdk-docs/modules/managers_agent.md deleted file mode 100644 index 6f5ea9677..000000000 --- a/docs/js-sdk-docs/modules/managers_agent.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/agent - -# Module: managers/agent - -## Table of contents - -### Classes - -- [AgentsManager](../classes/managers_agent.AgentsManager.md) diff --git a/docs/js-sdk-docs/modules/managers_base.md b/docs/js-sdk-docs/modules/managers_base.md deleted file mode 100644 index fd0e930a7..000000000 --- a/docs/js-sdk-docs/modules/managers_base.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/base - -# Module: managers/base - -## Table of contents - -### Classes - -- [BaseManager](../classes/managers_base.BaseManager.md) diff --git a/docs/js-sdk-docs/modules/managers_doc.md b/docs/js-sdk-docs/modules/managers_doc.md deleted file mode 100644 index b7a31fa3a..000000000 --- a/docs/js-sdk-docs/modules/managers_doc.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/doc - -# Module: managers/doc - -## Table of contents - -### Classes - -- [DocsManager](../classes/managers_doc.DocsManager.md) diff --git a/docs/js-sdk-docs/modules/managers_memory.md b/docs/js-sdk-docs/modules/managers_memory.md deleted file mode 100644 index 720bd4e70..000000000 --- a/docs/js-sdk-docs/modules/managers_memory.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/memory - -# Module: managers/memory - -## Table of contents - -### Classes - -- [MemoriesManager](../classes/managers_memory.MemoriesManager.md) diff --git a/docs/js-sdk-docs/modules/managers_session.md b/docs/js-sdk-docs/modules/managers_session.md deleted file mode 100644 index 38c9d75ef..000000000 --- a/docs/js-sdk-docs/modules/managers_session.md +++ /dev/null @@ -1,13 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/session - -# Module: managers/session - -## Table of contents - -### Classes - -- [SessionsManager](../classes/managers_session.SessionsManager.md) - -### Interfaces - -- [CreateSessionPayload](../interfaces/managers_session.CreateSessionPayload.md) diff --git a/docs/js-sdk-docs/modules/managers_tool.md b/docs/js-sdk-docs/modules/managers_tool.md deleted file mode 100644 index 1c425999c..000000000 --- a/docs/js-sdk-docs/modules/managers_tool.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/tool - -# Module: managers/tool - -## Table of contents - -### Classes - -- [ToolsManager](../classes/managers_tool.ToolsManager.md) diff --git a/docs/js-sdk-docs/modules/managers_user.md b/docs/js-sdk-docs/modules/managers_user.md deleted file mode 100644 index d0d6bffbf..000000000 --- a/docs/js-sdk-docs/modules/managers_user.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / managers/user - -# Module: managers/user - -## Table of contents - -### Classes - -- [UsersManager](../classes/managers_user.UsersManager.md) diff --git a/docs/js-sdk-docs/modules/utils_invariant.md b/docs/js-sdk-docs/modules/utils_invariant.md deleted file mode 100644 index 47dc67d54..000000000 --- a/docs/js-sdk-docs/modules/utils_invariant.md +++ /dev/null @@ -1,32 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / utils/invariant - -# Module: utils/invariant - -## Table of contents - -### Functions - -- [invariant](utils_invariant.md#invariant) - -## Functions - -### invariant - -▸ **invariant**(`condition`, `message?`): `void` - -Ensures that a condition is met, throwing a custom error message if not. - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `condition` | `any` | `undefined` | The condition to test. If falsy, an error is thrown. | -| `message` | `string` | `"Invariant Violation"` | Optional. The error message to throw if the condition is not met. Defaults to "Invariant Violation". | - -#### Returns - -`void` - -#### Defined in - -[src/utils/invariant.ts:6](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/utils/invariant.ts#L6) diff --git a/docs/js-sdk-docs/modules/utils_isValidUuid4.md b/docs/js-sdk-docs/modules/utils_isValidUuid4.md deleted file mode 100644 index ea1ea5c8d..000000000 --- a/docs/js-sdk-docs/modules/utils_isValidUuid4.md +++ /dev/null @@ -1,36 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / utils/isValidUuid4 - -# Module: utils/isValidUuid4 - -## Table of contents - -### Functions - -- [isValidUuid4](utils_isValidUuid4.md#isvaliduuid4) - -## Functions - -### isValidUuid4 - -▸ **isValidUuid4**(`uuidToTest`): `boolean` - -Validates if the input string is a valid UUID v4. -This function performs a two-step validation process: -1. Validates the format of the UUID using `uuidValidate`. -2. Checks that the version of the UUID is 4 using `uuidVersion`. - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `uuidToTest` | `string` | The string to test for a valid UUID v4. | - -#### Returns - -`boolean` - -True if the input is a valid UUID v4, otherwise false. - -#### Defined in - -[src/utils/isValidUuid4.ts:11](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/utils/isValidUuid4.ts#L11) diff --git a/docs/js-sdk-docs/modules/utils_openaiPatch.md b/docs/js-sdk-docs/modules/utils_openaiPatch.md deleted file mode 100644 index adddee617..000000000 --- a/docs/js-sdk-docs/modules/utils_openaiPatch.md +++ /dev/null @@ -1,33 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / utils/openaiPatch - -# Module: utils/openaiPatch - -## Table of contents - -### Functions - -- [patchCreate](utils_openaiPatch.md#patchcreate) - -## Functions - -### patchCreate - -▸ **patchCreate**(`client`, `scope?`): `any` - -Patches the 'create' method of an OpenAI client instance to ensure a default model is used if none is specified. -This is useful for enforcing a consistent model usage across different parts of the SDK. - -#### Parameters - -| Name | Type | Default value | Description | -| :------ | :------ | :------ | :------ | -| `client` | `any` | `undefined` | The OpenAI client instance to be patched. | -| `scope` | `any` | `null` | Optional. The scope in which the original 'create' method is bound. Defaults to the client itself if not provided. | - -#### Returns - -`any` - -#### Defined in - -[src/utils/openaiPatch.ts:8](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/utils/openaiPatch.ts#L8) diff --git a/docs/js-sdk-docs/modules/utils_requestConstructor.md b/docs/js-sdk-docs/modules/utils_requestConstructor.md deleted file mode 100644 index a18bf52fe..000000000 --- a/docs/js-sdk-docs/modules/utils_requestConstructor.md +++ /dev/null @@ -1,9 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / utils/requestConstructor - -# Module: utils/requestConstructor - -## Table of contents - -### Classes - -- [CustomHttpRequest](../classes/utils_requestConstructor.CustomHttpRequest.md) diff --git a/docs/js-sdk-docs/modules/utils_xor.md b/docs/js-sdk-docs/modules/utils_xor.md deleted file mode 100644 index 7df656742..000000000 --- a/docs/js-sdk-docs/modules/utils_xor.md +++ /dev/null @@ -1,30 +0,0 @@ -[@julep/sdk](../README.md) / [Modules](../modules.md) / utils/xor - -# Module: utils/xor - -## Table of contents - -### Functions - -- [xor](utils_xor.md#xor) - -## Functions - -### xor - -▸ **xor**(`a`, `b`): `any` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `a` | `any` | -| `b` | `any` | - -#### Returns - -`any` - -#### Defined in - -[src/utils/xor.ts:1](https://github.com/julep-ai/julep/blob/1aacc650d71dfc8cc6e2993599c2493784d992ef/sdks/ts/src/utils/xor.ts#L1) diff --git a/docs/python-sdk-docs/README.md b/docs/python-sdk-docs/README.md deleted file mode 100644 index cc09eca06..000000000 --- a/docs/python-sdk-docs/README.md +++ /dev/null @@ -1,211 +0,0 @@ -# Julep Python SDK Index - -> Auto-generated documentation index. - -A full list of `Julep Python SDK` project modules. - -- [Julep](julep/index.md#julep) - - [Julep Python Library](julep/api/index.md#julep-python-library) - - [Client](julep/api/client.md#client) - - [Core](julep/api/core/index.md#core) - - [ApiError](julep/api/core/api_error.md#apierror) - - [Client Wrapper](julep/api/core/client_wrapper.md#client-wrapper) - - [Datetime Utils](julep/api/core/datetime_utils.md#datetime-utils) - - [File](julep/api/core/file.md#file) - - [HttpClient](julep/api/core/http_client.md#httpclient) - - [Jsonable Encoder](julep/api/core/jsonable_encoder.md#jsonable-encoder) - - [Pydantic Utilities](julep/api/core/pydantic_utilities.md#pydantic-utilities) - - [Query Encoder](julep/api/core/query_encoder.md#query-encoder) - - [Remove None From Dict](julep/api/core/remove_none_from_dict.md#remove-none-from-dict) - - [RequestOptions](julep/api/core/request_options.md#requestoptions) - - [Environment](julep/api/environment.md#environment) - - [Types](julep/api/types/index.md#types) - - [Agent Docs Route List Request Direction](julep/api/types/agent_docs_route_list_request_direction.md#agent-docs-route-list-request-direction) - - [Agent Docs Route List Request Sort By](julep/api/types/agent_docs_route_list_request_sort_by.md#agent-docs-route-list-request-sort-by) - - [AgentDocsRouteListResponse](julep/api/types/agent_docs_route_list_response.md#agentdocsroutelistresponse) - - [Agent Tools Route List Request Direction](julep/api/types/agent_tools_route_list_request_direction.md#agent-tools-route-list-request-direction) - - [Agent Tools Route List Request Sort By](julep/api/types/agent_tools_route_list_request_sort_by.md#agent-tools-route-list-request-sort-by) - - [AgentToolsRouteListResponse](julep/api/types/agent_tools_route_list_response.md#agenttoolsroutelistresponse) - - [AgentsAgent](julep/api/types/agents_agent.md#agentsagent) - - [Agents Agent Instructions](julep/api/types/agents_agent_instructions.md#agents-agent-instructions) - - [AgentsCreateAgentRequest](julep/api/types/agents_create_agent_request.md#agentscreateagentrequest) - - [Agents Create Agent Request Instructions](julep/api/types/agents_create_agent_request_instructions.md#agents-create-agent-request-instructions) - - [AgentsCreateOrUpdateAgentRequest](julep/api/types/agents_create_or_update_agent_request.md#agentscreateorupdateagentrequest) - - [Agents Docs Search Route Search Request Body](julep/api/types/agents_docs_search_route_search_request_body.md#agents-docs-search-route-search-request-body) - - [Agents Patch Agent Request Instructions](julep/api/types/agents_patch_agent_request_instructions.md#agents-patch-agent-request-instructions) - - [Agents Route List Request Direction](julep/api/types/agents_route_list_request_direction.md#agents-route-list-request-direction) - - [Agents Route List Request Sort By](julep/api/types/agents_route_list_request_sort_by.md#agents-route-list-request-sort-by) - - [AgentsRouteListResponse](julep/api/types/agents_route_list_response.md#agentsroutelistresponse) - - [AgentsUpdateAgentRequest](julep/api/types/agents_update_agent_request.md#agentsupdateagentrequest) - - [Agents Update Agent Request Instructions](julep/api/types/agents_update_agent_request_instructions.md#agents-update-agent-request-instructions) - - [ChatBaseChatOutput](julep/api/types/chat_base_chat_output.md#chatbasechatoutput) - - [ChatBaseChatResponse](julep/api/types/chat_base_chat_response.md#chatbasechatresponse) - - [ChatBaseTokenLogProb](julep/api/types/chat_base_token_log_prob.md#chatbasetokenlogprob) - - [ChatChatInputData](julep/api/types/chat_chat_input_data.md#chatchatinputdata) - - [Chat Chat Input Data Tool Choice](julep/api/types/chat_chat_input_data_tool_choice.md#chat-chat-input-data-tool-choice) - - [ChatChatOutputChunk](julep/api/types/chat_chat_output_chunk.md#chatchatoutputchunk) - - [ChatChatSettings](julep/api/types/chat_chat_settings.md#chatchatsettings) - - [ChatChunkChatResponse](julep/api/types/chat_chunk_chat_response.md#chatchunkchatresponse) - - [ChatCompetionUsage](julep/api/types/chat_competion_usage.md#chatcompetionusage) - - [ChatCompletionResponseFormat](julep/api/types/chat_completion_response_format.md#chatcompletionresponseformat) - - [Chat Completion Response Format Type](julep/api/types/chat_completion_response_format_type.md#chat-completion-response-format-type) - - [ChatDefaultChatSettings](julep/api/types/chat_default_chat_settings.md#chatdefaultchatsettings) - - [Chat Finish Reason](julep/api/types/chat_finish_reason.md#chat-finish-reason) - - [ChatLogProbResponse](julep/api/types/chat_log_prob_response.md#chatlogprobresponse) - - [ChatMessageChatResponse](julep/api/types/chat_message_chat_response.md#chatmessagechatresponse) - - [Chat Message Chat Response Choices Item](julep/api/types/chat_message_chat_response_choices_item.md#chat-message-chat-response-choices-item) - - [ChatMultipleChatOutput](julep/api/types/chat_multiple_chat_output.md#chatmultiplechatoutput) - - [ChatOpenAiSettings](julep/api/types/chat_open_ai_settings.md#chatopenaisettings) - - [Chat Route Generate Response](julep/api/types/chat_route_generate_response.md#chat-route-generate-response) - - [ChatSingleChatOutput](julep/api/types/chat_single_chat_output.md#chatsinglechatoutput) - - [ChatTokenLogProb](julep/api/types/chat_token_log_prob.md#chattokenlogprob) - - [Common Identifier Safe Unicode](julep/api/types/common_identifier_safe_unicode.md#common-identifier-safe-unicode) - - [Common Limit](julep/api/types/common_limit.md#common-limit) - - [Common Logit Bias](julep/api/types/common_logit_bias.md#common-logit-bias) - - [Common Offset](julep/api/types/common_offset.md#common-offset) - - [Common Py Expression](julep/api/types/common_py_expression.md#common-py-expression) - - [CommonResourceCreatedResponse](julep/api/types/common_resource_created_response.md#commonresourcecreatedresponse) - - [CommonResourceDeletedResponse](julep/api/types/common_resource_deleted_response.md#commonresourcedeletedresponse) - - [CommonResourceUpdatedResponse](julep/api/types/common_resource_updated_response.md#commonresourceupdatedresponse) - - [Common Tool Ref](julep/api/types/common_tool_ref.md#common-tool-ref) - - [Common Uuid](julep/api/types/common_uuid.md#common-uuid) - - [Common Valid Python Identifier](julep/api/types/common_valid_python_identifier.md#common-valid-python-identifier) - - [DocsBaseDocSearchRequest](julep/api/types/docs_base_doc_search_request.md#docsbasedocsearchrequest) - - [DocsCreateDocRequest](julep/api/types/docs_create_doc_request.md#docscreatedocrequest) - - [Docs Create Doc Request Content](julep/api/types/docs_create_doc_request_content.md#docs-create-doc-request-content) - - [DocsDoc](julep/api/types/docs_doc.md#docsdoc) - - [Docs Doc Content](julep/api/types/docs_doc_content.md#docs-doc-content) - - [DocsDocOwner](julep/api/types/docs_doc_owner.md#docsdocowner) - - [Docs Doc Owner Role](julep/api/types/docs_doc_owner_role.md#docs-doc-owner-role) - - [DocsDocReference](julep/api/types/docs_doc_reference.md#docsdocreference) - - [DocsDocSearchResponse](julep/api/types/docs_doc_search_response.md#docsdocsearchresponse) - - [DocsEmbedQueryRequest](julep/api/types/docs_embed_query_request.md#docsembedqueryrequest) - - [Docs Embed Query Request Text](julep/api/types/docs_embed_query_request_text.md#docs-embed-query-request-text) - - [DocsEmbedQueryResponse](julep/api/types/docs_embed_query_response.md#docsembedqueryresponse) - - [DocsHybridDocSearchRequest](julep/api/types/docs_hybrid_doc_search_request.md#docshybriddocsearchrequest) - - [DocsSnippet](julep/api/types/docs_snippet.md#docssnippet) - - [DocsTextOnlyDocSearchRequest](julep/api/types/docs_text_only_doc_search_request.md#docstextonlydocsearchrequest) - - [DocsVectorDocSearchRequest](julep/api/types/docs_vector_doc_search_request.md#docsvectordocsearchrequest) - - [EntriesBaseEntry](julep/api/types/entries_base_entry.md#entriesbaseentry) - - [Entries Base Entry Content](julep/api/types/entries_base_entry_content.md#entries-base-entry-content) - - [Entries Base Entry Content Item](julep/api/types/entries_base_entry_content_item.md#entries-base-entry-content-item) - - [Entries Base Entry Content Item Item](julep/api/types/entries_base_entry_content_item_item.md#entries-base-entry-content-item-item) - - [Entries Base Entry Source](julep/api/types/entries_base_entry_source.md#entries-base-entry-source) - - [EntriesChatMlImageContentPart](julep/api/types/entries_chat_ml_image_content_part.md#entrieschatmlimagecontentpart) - - [Entries Chat Ml Role](julep/api/types/entries_chat_ml_role.md#entries-chat-ml-role) - - [EntriesChatMlTextContentPart](julep/api/types/entries_chat_ml_text_content_part.md#entrieschatmltextcontentpart) - - [EntriesEntry](julep/api/types/entries_entry.md#entriesentry) - - [EntriesHistory](julep/api/types/entries_history.md#entrieshistory) - - [Entries Image Detail](julep/api/types/entries_image_detail.md#entries-image-detail) - - [EntriesImageUrl](julep/api/types/entries_image_url.md#entriesimageurl) - - [EntriesInputChatMlMessage](julep/api/types/entries_input_chat_ml_message.md#entriesinputchatmlmessage) - - [Entries Input Chat Ml Message Content](julep/api/types/entries_input_chat_ml_message_content.md#entries-input-chat-ml-message-content) - - [Entries Input Chat Ml Message Content Item](julep/api/types/entries_input_chat_ml_message_content_item.md#entries-input-chat-ml-message-content-item) - - [EntriesRelation](julep/api/types/entries_relation.md#entriesrelation) - - [Execution Transitions Route List Request Direction](julep/api/types/execution_transitions_route_list_request_direction.md#execution-transitions-route-list-request-direction) - - [Execution Transitions Route List Request Sort By](julep/api/types/execution_transitions_route_list_request_sort_by.md#execution-transitions-route-list-request-sort-by) - - [ExecutionTransitionsRouteListResponse](julep/api/types/execution_transitions_route_list_response.md#executiontransitionsroutelistresponse) - - [ExecutionTransitionsRouteListResponseResultsItem](julep/api/types/execution_transitions_route_list_response_results_item.md#executiontransitionsroutelistresponseresultsitem) - - [ExecutionsExecution](julep/api/types/executions_execution.md#executionsexecution) - - [Executions Execution Status](julep/api/types/executions_execution_status.md#executions-execution-status) - - [ExecutionsResumeExecutionRequest](julep/api/types/executions_resume_execution_request.md#executionsresumeexecutionrequest) - - [ExecutionsStopExecutionRequest](julep/api/types/executions_stop_execution_request.md#executionsstopexecutionrequest) - - [ExecutionsTransition](julep/api/types/executions_transition.md#executionstransition) - - [ExecutionsTransitionTarget](julep/api/types/executions_transition_target.md#executionstransitiontarget) - - [Executions Transition Type](julep/api/types/executions_transition_type.md#executions-transition-type) - - [Executions Update Execution Request](julep/api/types/executions_update_execution_request.md#executions-update-execution-request) - - [Jobs Job State](julep/api/types/jobs_job_state.md#jobs-job-state) - - [JobsJobStatus](julep/api/types/jobs_job_status.md#jobsjobstatus) - - [Sessions Context Overflow Type](julep/api/types/sessions_context_overflow_type.md#sessions-context-overflow-type) - - [SessionsCreateOrUpdateSessionRequest](julep/api/types/sessions_create_or_update_session_request.md#sessionscreateorupdatesessionrequest) - - [SessionsCreateSessionRequest](julep/api/types/sessions_create_session_request.md#sessionscreatesessionrequest) - - [SessionsMultiAgentMultiUserSession](julep/api/types/sessions_multi_agent_multi_user_session.md#sessionsmultiagentmultiusersession) - - [SessionsMultiAgentNoUserSession](julep/api/types/sessions_multi_agent_no_user_session.md#sessionsmultiagentnousersession) - - [SessionsMultiAgentSingleUserSession](julep/api/types/sessions_multi_agent_single_user_session.md#sessionsmultiagentsingleusersession) - - [Sessions Route List Request Direction](julep/api/types/sessions_route_list_request_direction.md#sessions-route-list-request-direction) - - [Sessions Route List Request Sort By](julep/api/types/sessions_route_list_request_sort_by.md#sessions-route-list-request-sort-by) - - [SessionsRouteListResponse](julep/api/types/sessions_route_list_response.md#sessionsroutelistresponse) - - [Sessions Session](julep/api/types/sessions_session.md#sessions-session) - - [SessionsSingleAgentMultiUserSession](julep/api/types/sessions_single_agent_multi_user_session.md#sessionssingleagentmultiusersession) - - [SessionsSingleAgentNoUserSession](julep/api/types/sessions_single_agent_no_user_session.md#sessionssingleagentnousersession) - - [SessionsSingleAgentSingleUserSession](julep/api/types/sessions_single_agent_single_user_session.md#sessionssingleagentsingleusersession) - - [Task Executions Route List Request Direction](julep/api/types/task_executions_route_list_request_direction.md#task-executions-route-list-request-direction) - - [Task Executions Route List Request Sort By](julep/api/types/task_executions_route_list_request_sort_by.md#task-executions-route-list-request-sort-by) - - [TaskExecutionsRouteListResponse](julep/api/types/task_executions_route_list_response.md#taskexecutionsroutelistresponse) - - [Tasks Base Workflow Step](julep/api/types/tasks_base_workflow_step.md#tasks-base-workflow-step) - - [TasksCaseThen](julep/api/types/tasks_case_then.md#taskscasethen) - - [Tasks Case Then Then](julep/api/types/tasks_case_then_then.md#tasks-case-then-then) - - [TasksCreateTaskRequest](julep/api/types/tasks_create_task_request.md#taskscreatetaskrequest) - - [Tasks Create Task Request Main Item](julep/api/types/tasks_create_task_request_main_item.md#tasks-create-task-request-main-item) - - [TasksEmbedStep](julep/api/types/tasks_embed_step.md#tasksembedstep) - - [TasksErrorWorkflowStep](julep/api/types/tasks_error_workflow_step.md#taskserrorworkflowstep) - - [TasksEvaluateStep](julep/api/types/tasks_evaluate_step.md#tasksevaluatestep) - - [TasksForeachDo](julep/api/types/tasks_foreach_do.md#tasksforeachdo) - - [Tasks Foreach Do Do](julep/api/types/tasks_foreach_do_do.md#tasks-foreach-do-do) - - [TasksForeachStep](julep/api/types/tasks_foreach_step.md#tasksforeachstep) - - [TasksGetStep](julep/api/types/tasks_get_step.md#tasksgetstep) - - [TasksIfElseWorkflowStep](julep/api/types/tasks_if_else_workflow_step.md#tasksifelseworkflowstep) - - [Tasks If Else Workflow Step Else](julep/api/types/tasks_if_else_workflow_step_else.md#tasks-if-else-workflow-step-else) - - [Tasks If Else Workflow Step Then](julep/api/types/tasks_if_else_workflow_step_then.md#tasks-if-else-workflow-step-then) - - [TasksLogStep](julep/api/types/tasks_log_step.md#taskslogstep) - - [TasksMapOver](julep/api/types/tasks_map_over.md#tasksmapover) - - [TasksMapReduceStep](julep/api/types/tasks_map_reduce_step.md#tasksmapreducestep) - - [TasksParallelStep](julep/api/types/tasks_parallel_step.md#tasksparallelstep) - - [Tasks Parallel Step Parallel Item](julep/api/types/tasks_parallel_step_parallel_item.md#tasks-parallel-step-parallel-item) - - [Tasks Patch Task Request Main Item](julep/api/types/tasks_patch_task_request_main_item.md#tasks-patch-task-request-main-item) - - [TasksPromptStep](julep/api/types/tasks_prompt_step.md#taskspromptstep) - - [Tasks Prompt Step Prompt](julep/api/types/tasks_prompt_step_prompt.md#tasks-prompt-step-prompt) - - [TasksReturnStep](julep/api/types/tasks_return_step.md#tasksreturnstep) - - [Tasks Route List Request Direction](julep/api/types/tasks_route_list_request_direction.md#tasks-route-list-request-direction) - - [Tasks Route List Request Sort By](julep/api/types/tasks_route_list_request_sort_by.md#tasks-route-list-request-sort-by) - - [TasksRouteListResponse](julep/api/types/tasks_route_list_response.md#tasksroutelistresponse) - - [TasksSearchStep](julep/api/types/tasks_search_step.md#taskssearchstep) - - [Tasks Search Step Search](julep/api/types/tasks_search_step_search.md#tasks-search-step-search) - - [TasksSetKey](julep/api/types/tasks_set_key.md#taskssetkey) - - [TasksSetStep](julep/api/types/tasks_set_step.md#taskssetstep) - - [Tasks Set Step Set](julep/api/types/tasks_set_step_set.md#tasks-set-step-set) - - [TasksSleepFor](julep/api/types/tasks_sleep_for.md#taskssleepfor) - - [TasksSleepStep](julep/api/types/tasks_sleep_step.md#taskssleepstep) - - [TasksSwitchStep](julep/api/types/tasks_switch_step.md#tasksswitchstep) - - [TasksTask](julep/api/types/tasks_task.md#taskstask) - - [Tasks Task Main Item](julep/api/types/tasks_task_main_item.md#tasks-task-main-item) - - [TasksTaskTool](julep/api/types/tasks_task_tool.md#taskstasktool) - - [TasksToolCallStep](julep/api/types/tasks_tool_call_step.md#taskstoolcallstep) - - [Tasks Update Task Request Main Item](julep/api/types/tasks_update_task_request_main_item.md#tasks-update-task-request-main-item) - - [TasksWaitForInputStep](julep/api/types/tasks_wait_for_input_step.md#taskswaitforinputstep) - - [TasksYieldStep](julep/api/types/tasks_yield_step.md#tasksyieldstep) - - [ToolsChosenFunctionCall](julep/api/types/tools_chosen_function_call.md#toolschosenfunctioncall) - - [Tools Chosen Tool Call](julep/api/types/tools_chosen_tool_call.md#tools-chosen-tool-call) - - [ToolsCreateToolRequest](julep/api/types/tools_create_tool_request.md#toolscreatetoolrequest) - - [ToolsFunctionCallOption](julep/api/types/tools_function_call_option.md#toolsfunctioncalloption) - - [ToolsFunctionDef](julep/api/types/tools_function_def.md#toolsfunctiondef) - - [ToolsFunctionTool](julep/api/types/tools_function_tool.md#toolsfunctiontool) - - [ToolsNamedFunctionChoice](julep/api/types/tools_named_function_choice.md#toolsnamedfunctionchoice) - - [Tools Named Tool Choice](julep/api/types/tools_named_tool_choice.md#tools-named-tool-choice) - - [Tools Tool](julep/api/types/tools_tool.md#tools-tool) - - [ToolsToolResponse](julep/api/types/tools_tool_response.md#toolstoolresponse) - - [Tools Tool Type](julep/api/types/tools_tool_type.md#tools-tool-type) - - [User Docs Route List Request Direction](julep/api/types/user_docs_route_list_request_direction.md#user-docs-route-list-request-direction) - - [User Docs Route List Request Sort By](julep/api/types/user_docs_route_list_request_sort_by.md#user-docs-route-list-request-sort-by) - - [UserDocsRouteListResponse](julep/api/types/user_docs_route_list_response.md#userdocsroutelistresponse) - - [User Docs Search Route Search Request Body](julep/api/types/user_docs_search_route_search_request_body.md#user-docs-search-route-search-request-body) - - [UsersCreateOrUpdateUserRequest](julep/api/types/users_create_or_update_user_request.md#userscreateorupdateuserrequest) - - [UsersCreateUserRequest](julep/api/types/users_create_user_request.md#userscreateuserrequest) - - [Users Route List Request Direction](julep/api/types/users_route_list_request_direction.md#users-route-list-request-direction) - - [Users Route List Request Sort By](julep/api/types/users_route_list_request_sort_by.md#users-route-list-request-sort-by) - - [UsersRouteListResponse](julep/api/types/users_route_list_response.md#usersroutelistresponse) - - [UsersUser](julep/api/types/users_user.md#usersuser) - - [Client](julep/client.md#client) - - [Env](julep/env.md#env) - - [Managers](julep/managers/index.md#managers) - - [Agent](julep/managers/agent.md#agent) - - [Base](julep/managers/base.md#base) - - [Doc](julep/managers/doc.md#doc) - - [Memory](julep/managers/memory.md#memory) - - [Session](julep/managers/session.md#session) - - [Task](julep/managers/task.md#task) - - [Tool](julep/managers/tool.md#tool) - - [Types](julep/managers/types.md#types) - - [User](julep/managers/user.md#user) - - [Utils](julep/utils/index.md#utils) - - [Openai Patch](julep/utils/openai_patch.md#openai-patch) diff --git a/docs/python-sdk-docs/julep/api/client.md b/docs/python-sdk-docs/julep/api/client.md deleted file mode 100644 index 34fe3b1f4..000000000 --- a/docs/python-sdk-docs/julep/api/client.md +++ /dev/null @@ -1,6554 +0,0 @@ -# Client - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Julep Python Library](./index.md#julep-python-library) / Client - -> Auto-generated documentation for [julep.api.client](../../../../../../julep/api/client.py) module. - -#### Attributes - -- `OMIT` - this is used as the default value for optional parameters: typing.cast(typing.Any, ...) - - -- [Client](#client) - - [AsyncJulepApi](#asyncjulepapi) - - [JulepApi](#julepapi) - -## AsyncJulepApi - -[Show source in client.py:3706](../../../../../../julep/api/client.py#L3706) - -Use this class to access the different functions within the SDK. You can instantiate any number of clients with different configuration that will propagate to these functions. - -Parameters ----------- -base_url : typing.Optional[str] - The base url to use for requests from the client. - -environment : JulepApiEnvironment - The environment to use for requests from the client. from .environment import JulepApiEnvironment - -Defaults to JulepApiEnvironment.DEFAULT - -auth_key : str -api_key : str -timeout : typing.Optional[float] - The timeout to be used, in seconds, for requests. By default the timeout is 300 seconds, unless a custom httpx client is used, in which case this default is not enforced. - -follow_redirects : typing.Optional[bool] - Whether the default httpx client follows redirects or not, this is irrelevant if a custom httpx client is passed in. - -httpx_client : typing.Optional[httpx.AsyncClient] - The httpx client to use for making requests, a preconfigured client is used by default, however this is useful should you want to pass in any custom httpx configuration. - -Examples --------- -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -#### Signature - -```python -class AsyncJulepApi: - def __init__( - self, - base_url: typing.Optional[str] = None, - environment: JulepApiEnvironment = JulepApiEnvironment.DEFAULT, - auth_key: str, - api_key: str, - timeout: typing.Optional[float] = None, - follow_redirects: typing.Optional[bool] = True, - httpx_client: typing.Optional[httpx.AsyncClient] = None, - ): ... -``` - -### AsyncJulepApi().agent_docs_route_create - -[Show source in client.py:4404](../../../../../../julep/api/client.py#L4404) - -Create a Doc for this Agent - -Parameters ----------- -id : CommonUuid - ID of parent resource - -title : CommonIdentifierSafeUnicode - Title describing what this document contains - -content : DocsCreateDocRequestContent - Contents of the document - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_docs_route_create( - id="id", - title="title", - content="content", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_docs_route_create( - self, - id: CommonUuid, - title: CommonIdentifierSafeUnicode, - content: DocsCreateDocRequestContent, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agent_docs_route_delete - -[Show source in client.py:4474](../../../../../../julep/api/client.py#L4474) - -Delete a Doc for this Agent - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_docs_route_delete( - id="id", - child_id="child_id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_docs_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().agent_docs_route_list - -[Show source in client.py:4317](../../../../../../julep/api/client.py#L4317) - -List Docs owned by an Agent - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : AgentDocsRouteListRequestSortBy - Sort by a field - -direction : AgentDocsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentDocsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_docs_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_docs_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: AgentDocsRouteListRequestSortBy, - direction: AgentDocsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> AgentDocsRouteListResponse: ... -``` - -### AsyncJulepApi().agent_tools_route_create - -[Show source in client.py:5127](../../../../../../julep/api/client.py#L5127) - -Create a new tool for this agent - -Parameters ----------- -id : CommonUuid - ID of parent resource - -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsCreateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_tools_route_create( - id="id", - name="name", - about="about", - model="model", - instructions="instructions", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_tools_route_create( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsCreateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agent_tools_route_delete - -[Show source in client.py:5309](../../../../../../julep/api/client.py#L5309) - -Delete an existing tool by id - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_tools_route_delete( - id="id", - child_id="child_id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_tools_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().agent_tools_route_list - -[Show source in client.py:5040](../../../../../../julep/api/client.py#L5040) - -List tools of the given agent - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : AgentToolsRouteListRequestSortBy - Sort by a field - -direction : AgentToolsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentToolsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_tools_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_tools_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: AgentToolsRouteListRequestSortBy, - direction: AgentToolsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> AgentToolsRouteListResponse: ... -``` - -### AsyncJulepApi().agent_tools_route_patch - -[Show source in client.py:5369](../../../../../../julep/api/client.py#L5369) - -Update an existing tool (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be patched - -type : typing.Optional[ToolsToolType] - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - -name : typing.Optional[CommonValidPythonIdentifier] - Name of the tool (must be unique for this agent and a valid python identifier string ) - -function : typing.Optional[ToolsFunctionDef] - -integration : typing.Optional[typing.Any] - -system : typing.Optional[typing.Any] - -api_call : typing.Optional[typing.Any] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_tools_route_patch( - id="id", - child_id="child_id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_tools_route_patch( - self, - id: CommonUuid, - child_id: CommonUuid, - type: typing.Optional[ToolsToolType] = OMIT, - name: typing.Optional[CommonValidPythonIdentifier] = OMIT, - function: typing.Optional[ToolsFunctionDef] = OMIT, - integration: typing.Optional[typing.Any] = OMIT, - system: typing.Optional[typing.Any] = OMIT, - api_call: typing.Optional[typing.Any] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agent_tools_route_update - -[Show source in client.py:5218](../../../../../../julep/api/client.py#L5218) - -Update an existing tool (overwrite existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be updated - -type : ToolsToolType - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - -name : CommonValidPythonIdentifier - Name of the tool (must be unique for this agent and a valid python identifier string ) - -function : typing.Optional[ToolsFunctionDef] - -integration : typing.Optional[typing.Any] - -system : typing.Optional[typing.Any] - -api_call : typing.Optional[typing.Any] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agent_tools_route_update( - id="id", - child_id="child_id", - type="function", - name="name", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agent_tools_route_update( - self, - id: CommonUuid, - child_id: CommonUuid, - type: ToolsToolType, - name: CommonValidPythonIdentifier, - function: typing.Optional[ToolsFunctionDef] = OMIT, - integration: typing.Optional[typing.Any] = OMIT, - system: typing.Optional[typing.Any] = OMIT, - api_call: typing.Optional[typing.Any] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agents_docs_search_route_search - -[Show source in client.py:4534](../../../../../../julep/api/client.py#L4534) - -Search Docs owned by an Agent - -Parameters ----------- -id : CommonUuid - ID of the parent - -body : AgentsDocsSearchRouteSearchRequestBody - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsDocSearchResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import DocsVectorDocSearchRequest -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_docs_search_route_search( - id="id", - body=DocsVectorDocSearchRequest( - limit=1, - confidence=1.1, - vector=[1.1], - ), - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_docs_search_route_search( - self, - id: CommonUuid, - body: AgentsDocsSearchRouteSearchRequestBody, - request_options: typing.Optional[RequestOptions] = None, -) -> DocsDocSearchResponse: ... -``` - -### AsyncJulepApi().agents_route_create - -[Show source in client.py:3859](../../../../../../julep/api/client.py#L3859) - -Create a new Agent - -Parameters ----------- -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsCreateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_create( - name="name", - about="about", - model="model", - instructions="instructions", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_create( - self, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsCreateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agents_route_create_or_update - -[Show source in client.py:3997](../../../../../../julep/api/client.py#L3997) - -Create or update an Agent - -Parameters ----------- -id : CommonUuid - -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsUpdateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_create_or_update( - id="id", - name="name", - about="about", - model="model", - instructions="instructions", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_create_or_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsUpdateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agents_route_delete - -[Show source in client.py:4178](../../../../../../julep/api/client.py#L4178) - -Delete Agent by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_delete( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().agents_route_get - -[Show source in client.py:3945](../../../../../../julep/api/client.py#L3945) - -Get an Agent by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentsAgent - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_get( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> AgentsAgent: ... -``` - -### AsyncJulepApi().agents_route_list - -[Show source in client.py:3777](../../../../../../julep/api/client.py#L3777) - -List Agents (paginated) - -Parameters ----------- -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : AgentsRouteListRequestSortBy - Sort by a field - -direction : AgentsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_list( - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_list( - self, - limit: CommonLimit, - offset: CommonOffset, - sort_by: AgentsRouteListRequestSortBy, - direction: AgentsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> AgentsRouteListResponse: ... -``` - -### AsyncJulepApi().agents_route_patch - -[Show source in client.py:4230](../../../../../../julep/api/client.py#L4230) - -Update an existing Agent by id (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -name : typing.Optional[CommonIdentifierSafeUnicode] - Name of the agent - -about : typing.Optional[str] - About the agent - -model : typing.Optional[str] - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : typing.Optional[AgentsPatchAgentRequestInstructions] - Instructions for the agent - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_patch( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_patch( - self, - id: CommonUuid, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - name: typing.Optional[CommonIdentifierSafeUnicode] = OMIT, - about: typing.Optional[str] = OMIT, - model: typing.Optional[str] = OMIT, - instructions: typing.Optional[AgentsPatchAgentRequestInstructions] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().agents_route_update - -[Show source in client.py:4087](../../../../../../julep/api/client.py#L4087) - -Update an existing Agent by id (overwrites existing values; use PATCH for merging instead) - -Parameters ----------- -id : CommonUuid - ID of the resource - -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsUpdateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.agents_route_update( - id="id", - name="name", - about="about", - model="model", - instructions="instructions", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def agents_route_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsUpdateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().chat_route_generate - -[Show source in client.py:6541](../../../../../../julep/api/client.py#L6541) - -Generate a response from the model - -Parameters ----------- -id : CommonUuid - The session ID - -remember : bool - DISABLED: Whether this interaction should form new memories or not (will be enabled in a future release) - -recall : bool - Whether previous memories and docs should be recalled or not - -save : bool - Whether this interaction should be stored in the session history or not - -stream : bool - Indicates if the server should stream the response as it's generated - -messages : typing.Sequence[EntriesInputChatMlMessage] - A list of new input messages comprising the conversation so far. - -model : typing.Optional[CommonIdentifierSafeUnicode] - Identifier of the model to be used - -stop : typing.Optional[typing.Sequence[str]] - Up to 4 sequences where the API will stop generating further tokens. - -seed : typing.Optional[int] - If specified, the system will make a best effort to sample deterministically for that particular seed value - -max_tokens : typing.Optional[int] - The maximum number of tokens to generate in the chat completion - -logit_bias : typing.Optional[typing.Dict[str, CommonLogitBias]] - Modify the likelihood of specified tokens appearing in the completion - -response_format : typing.Optional[ChatCompletionResponseFormat] - Response format (set to `json_object` to restrict output to JSON) - -agent : typing.Optional[CommonUuid] - Agent ID of the agent to use for this interaction. (Only applicable for multi-agent sessions) - -repetition_penalty : typing.Optional[float] - Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - -length_penalty : typing.Optional[float] - Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. - -min_p : typing.Optional[float] - Minimum probability compared to leading token to be considered - -frequency_penalty : typing.Optional[float] - Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - -presence_penalty : typing.Optional[float] - Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - -temperature : typing.Optional[float] - What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. - -top_p : typing.Optional[float] - Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. - -tools : typing.Optional[typing.Sequence[ToolsFunctionTool]] - (Advanced) List of tools that are provided in addition to agent's default set of tools. - -tool_choice : typing.Optional[ChatChatInputDataToolChoice] - Can be one of existing tools given to the agent earlier or the ones provided in this request. - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -ChatRouteGenerateResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import EntriesInputChatMlMessage -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.chat_route_generate( - id="id", - messages=[ - EntriesInputChatMlMessage( - role="user", - content="content", - ) - ], - remember=True, - recall=True, - save=True, - stream=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def chat_route_generate( - self, - id: CommonUuid, - remember: bool, - recall: bool, - save: bool, - stream: bool, - messages: typing.Sequence[EntriesInputChatMlMessage], - model: typing.Optional[CommonIdentifierSafeUnicode] = OMIT, - stop: typing.Optional[typing.Sequence[str]] = OMIT, - seed: typing.Optional[int] = OMIT, - max_tokens: typing.Optional[int] = OMIT, - logit_bias: typing.Optional[typing.Dict[str, CommonLogitBias]] = OMIT, - response_format: typing.Optional[ChatCompletionResponseFormat] = OMIT, - agent: typing.Optional[CommonUuid] = OMIT, - repetition_penalty: typing.Optional[float] = OMIT, - length_penalty: typing.Optional[float] = OMIT, - min_p: typing.Optional[float] = OMIT, - frequency_penalty: typing.Optional[float] = OMIT, - presence_penalty: typing.Optional[float] = OMIT, - temperature: typing.Optional[float] = OMIT, - top_p: typing.Optional[float] = OMIT, - tools: typing.Optional[typing.Sequence[ToolsFunctionTool]] = OMIT, - tool_choice: typing.Optional[ChatChatInputDataToolChoice] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> ChatRouteGenerateResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().embed_route_embed - -[Show source in client.py:5615](../../../../../../julep/api/client.py#L5615) - -Embed a query for search - -Parameters ----------- -body : DocsEmbedQueryRequest - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsEmbedQueryResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import DocsEmbedQueryRequest -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.embed_route_embed( - body=DocsEmbedQueryRequest( - text="text", - ), - ) - -asyncio.run(main()) - -#### Signature - -```python -async def embed_route_embed( - self, - body: DocsEmbedQueryRequest, - request_options: typing.Optional[RequestOptions] = None, -) -> DocsEmbedQueryResponse: ... -``` - -### AsyncJulepApi().execution_transitions_route_list - -[Show source in client.py:5852](../../../../../../julep/api/client.py#L5852) - -List the Transitions of an Execution by id - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : ExecutionTransitionsRouteListRequestSortBy - Sort by a field - -direction : ExecutionTransitionsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -ExecutionTransitionsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.execution_transitions_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def execution_transitions_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: ExecutionTransitionsRouteListRequestSortBy, - direction: ExecutionTransitionsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> ExecutionTransitionsRouteListResponse: ... -``` - -### AsyncJulepApi().executions_route_get - -[Show source in client.py:5736](../../../../../../julep/api/client.py#L5736) - -Get an Execution by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -ExecutionsExecution - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.executions_route_get( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def executions_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> ExecutionsExecution: ... -``` - -### AsyncJulepApi().executions_route_resume_with_task_token - -[Show source in client.py:5674](../../../../../../julep/api/client.py#L5674) - -Resume an execution with a task token - -Parameters ----------- -task_token : str - A Task Token is a unique identifier for a specific Task Execution. - -input : typing.Optional[typing.Dict[str, typing.Any]] - The input to resume the execution with - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.executions_route_resume_with_task_token( - task_token="task_token", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def executions_route_resume_with_task_token( - self, - task_token: str, - input: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().executions_route_update - -[Show source in client.py:5788](../../../../../../julep/api/client.py#L5788) - -Update an existing Execution - -Parameters ----------- -id : CommonUuid - ID of the resource - -request : ExecutionsUpdateExecutionRequest - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import ExecutionsUpdateExecutionRequest_Cancelled -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.executions_route_update( - id="string", - request=ExecutionsUpdateExecutionRequest_Cancelled( - reason="string", - ), - ) - -asyncio.run(main()) - -#### Signature - -```python -async def executions_route_update( - self, - id: CommonUuid, - request: ExecutionsUpdateExecutionRequest, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -### AsyncJulepApi().history_route_delete - -[Show source in client.py:6767](../../../../../../julep/api/client.py#L6767) - -Clear the history of a Session (resets the Session) - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.history_route_delete( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def history_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().history_route_history - -[Show source in client.py:6715](../../../../../../julep/api/client.py#L6715) - -Get history of a Session - -Parameters ----------- -id : CommonUuid - ID of parent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -EntriesHistory - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.history_route_history( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def history_route_history( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> EntriesHistory: ... -``` - -### AsyncJulepApi().individual_docs_route_get - -[Show source in client.py:5563](../../../../../../julep/api/client.py#L5563) - -Get Doc by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsDoc - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.individual_docs_route_get( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def individual_docs_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> DocsDoc: ... -``` - -### AsyncJulepApi().job_route_get - -[Show source in client.py:5939](../../../../../../julep/api/client.py#L5939) - -Get the status of an existing Job by its id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -JobsJobStatus - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.job_route_get( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def job_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> JobsJobStatus: ... -``` - -### AsyncJulepApi().sessions_route_create - -[Show source in client.py:6073](../../../../../../julep/api/client.py#L6073) - -Create a new session - -Parameters ----------- -situation : str - A specific situation that sets the background for this session - -render_templates : bool - Render system and assistant message content as jinja templates - -user : typing.Optional[CommonUuid] - User ID of user associated with this session - -users : typing.Optional[typing.Sequence[CommonUuid]] - -agent : typing.Optional[CommonUuid] - Agent ID of agent associated with this session - -agents : typing.Optional[typing.Sequence[CommonUuid]] - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_create( - situation="situation", - render_templates=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_create( - self, - situation: str, - render_templates: bool, - user: typing.Optional[CommonUuid] = OMIT, - users: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - agent: typing.Optional[CommonUuid] = OMIT, - agents: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().sessions_route_create_or_update - -[Show source in client.py:6222](../../../../../../julep/api/client.py#L6222) - -Create or update a session - -Parameters ----------- -id : CommonUuid - -situation : str - A specific situation that sets the background for this session - -render_templates : bool - Render system and assistant message content as jinja templates - -user : typing.Optional[CommonUuid] - User ID of user associated with this session - -users : typing.Optional[typing.Sequence[CommonUuid]] - -agent : typing.Optional[CommonUuid] - Agent ID of agent associated with this session - -agents : typing.Optional[typing.Sequence[CommonUuid]] - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_create_or_update( - id="id", - situation="situation", - render_templates=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_create_or_update( - self, - id: CommonUuid, - situation: str, - render_templates: bool, - user: typing.Optional[CommonUuid] = OMIT, - users: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - agent: typing.Optional[CommonUuid] = OMIT, - agents: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().sessions_route_delete - -[Show source in client.py:6407](../../../../../../julep/api/client.py#L6407) - -Delete a session by its id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_delete( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().sessions_route_get - -[Show source in client.py:6170](../../../../../../julep/api/client.py#L6170) - -Get a session by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -SessionsSession - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_get( - id="string", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> SessionsSession: ... -``` - -### AsyncJulepApi().sessions_route_list - -[Show source in client.py:5991](../../../../../../julep/api/client.py#L5991) - -List sessions (paginated) - -Parameters ----------- -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : SessionsRouteListRequestSortBy - Sort by a field - -direction : SessionsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -SessionsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_list( - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_list( - self, - limit: CommonLimit, - offset: CommonOffset, - sort_by: SessionsRouteListRequestSortBy, - direction: SessionsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> SessionsRouteListResponse: ... -``` - -### AsyncJulepApi().sessions_route_patch - -[Show source in client.py:6459](../../../../../../julep/api/client.py#L6459) - -Update an existing session by its id (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -situation : typing.Optional[str] - A specific situation that sets the background for this session - -render_templates : typing.Optional[bool] - Render system and assistant message content as jinja templates - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_patch( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_patch( - self, - id: CommonUuid, - situation: typing.Optional[str] = OMIT, - render_templates: typing.Optional[bool] = OMIT, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().sessions_route_update - -[Show source in client.py:6323](../../../../../../julep/api/client.py#L6323) - -Update an existing session by its id (overwrites all existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -situation : str - A specific situation that sets the background for this session - -render_templates : bool - Render system and assistant message content as jinja templates - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.sessions_route_update( - id="id", - situation="situation", - render_templates=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def sessions_route_update( - self, - id: CommonUuid, - situation: str, - render_templates: bool, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().task_executions_route_create - -[Show source in client.py:6906](../../../../../../julep/api/client.py#L6906) - -Create an execution for the given task - -Parameters ----------- -id : CommonUuid - ID of parent resource - -input : typing.Dict[str, typing.Any] - The input to the execution - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.task_executions_route_create( - id="id", - input={"key": "value"}, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def task_executions_route_create( - self, - id: CommonUuid, - input: typing.Dict[str, typing.Any], - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().task_executions_route_list - -[Show source in client.py:6819](../../../../../../julep/api/client.py#L6819) - -List executions of the given task - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : TaskExecutionsRouteListRequestSortBy - Sort by a field - -direction : TaskExecutionsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -TaskExecutionsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.task_executions_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def task_executions_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: TaskExecutionsRouteListRequestSortBy, - direction: TaskExecutionsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> TaskExecutionsRouteListResponse: ... -``` - -### AsyncJulepApi().tasks_create_or_update_route_create_or_update - -[Show source in client.py:5458](../../../../../../julep/api/client.py#L5458) - -Create or update a task - -Parameters ----------- -parent_id : CommonUuid - ID of the agent - -id : CommonUuid - -name : str - -description : str - -main : typing.Sequence[TasksCreateTaskRequestMainItem] - The entrypoint of the task. - -tools : typing.Sequence[TasksTaskTool] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : bool - Whether to inherit tools from the parent agent or not. Defaults to true. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep import TasksTaskTool -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.tasks_create_or_update_route_create_or_update( - parent_id="parent_id", - id="id", - name="name", - description="description", - main=[], - tools=[ - TasksTaskTool( - type="function", - name="name", - ) - ], - inherit_tools=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def tasks_create_or_update_route_create_or_update( - self, - parent_id: CommonUuid, - id: CommonUuid, - name: str, - description: str, - main: typing.Sequence[TasksCreateTaskRequestMainItem], - tools: typing.Sequence[TasksTaskTool], - inherit_tools: bool, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().tasks_route_create - -[Show source in client.py:4687](../../../../../../julep/api/client.py#L4687) - -Create a new task - -Parameters ----------- -id : CommonUuid - ID of parent resource - -name : str - -description : str - -main : typing.Sequence[TasksCreateTaskRequestMainItem] - The entrypoint of the task. - -tools : typing.Sequence[TasksTaskTool] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : bool - Whether to inherit tools from the parent agent or not. Defaults to true. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import TasksTaskTool -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.tasks_route_create( - id="id", - name="name", - description="description", - main=[], - tools=[ - TasksTaskTool( - type="function", - name="name", - ) - ], - inherit_tools=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def tasks_route_create( - self, - id: CommonUuid, - name: str, - description: str, - main: typing.Sequence[TasksCreateTaskRequestMainItem], - tools: typing.Sequence[TasksTaskTool], - inherit_tools: bool, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().tasks_route_delete - -[Show source in client.py:4889](../../../../../../julep/api/client.py#L4889) - -Delete a task by its id - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.tasks_route_delete( - id="id", - child_id="child_id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def tasks_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().tasks_route_list - -[Show source in client.py:4600](../../../../../../julep/api/client.py#L4600) - -List tasks (paginated) - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : TasksRouteListRequestSortBy - Sort by a field - -direction : TasksRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -TasksRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.tasks_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def tasks_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: TasksRouteListRequestSortBy, - direction: TasksRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> TasksRouteListResponse: ... -``` - -### AsyncJulepApi().tasks_route_patch - -[Show source in client.py:4949](../../../../../../julep/api/client.py#L4949) - -Update an existing task (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be patched - -description : typing.Optional[str] - -main : typing.Optional[typing.Sequence[TasksPatchTaskRequestMainItem]] - The entrypoint of the task. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -tools : typing.Optional[typing.Sequence[TasksTaskTool]] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : typing.Optional[bool] - Whether to inherit tools from the parent agent or not. Defaults to true. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.tasks_route_patch( - id="id", - child_id="child_id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def tasks_route_patch( - self, - id: CommonUuid, - child_id: CommonUuid, - description: typing.Optional[str] = OMIT, - main: typing.Optional[typing.Sequence[TasksPatchTaskRequestMainItem]] = OMIT, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - tools: typing.Optional[typing.Sequence[TasksTaskTool]] = OMIT, - inherit_tools: typing.Optional[bool] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().tasks_route_update - -[Show source in client.py:4788](../../../../../../julep/api/client.py#L4788) - -Update an existing task (overwrite existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be updated - -description : str - -main : typing.Sequence[TasksUpdateTaskRequestMainItem] - The entrypoint of the task. - -tools : typing.Sequence[TasksTaskTool] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : bool - Whether to inherit tools from the parent agent or not. Defaults to true. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import TasksTaskTool -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.tasks_route_update( - id="id", - child_id="child_id", - description="description", - main=[], - tools=[ - TasksTaskTool( - type="function", - name="name", - ) - ], - inherit_tools=True, - ) - -asyncio.run(main()) - -#### Signature - -```python -async def tasks_route_update( - self, - id: CommonUuid, - child_id: CommonUuid, - description: str, - main: typing.Sequence[TasksUpdateTaskRequestMainItem], - tools: typing.Sequence[TasksTaskTool], - inherit_tools: bool, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().user_docs_route_create - -[Show source in client.py:7516](../../../../../../julep/api/client.py#L7516) - -Create a Doc for this User - -Parameters ----------- -id : CommonUuid - ID of parent resource - -title : CommonIdentifierSafeUnicode - Title describing what this document contains - -content : DocsCreateDocRequestContent - Contents of the document - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.user_docs_route_create( - id="id", - title="title", - content="content", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def user_docs_route_create( - self, - id: CommonUuid, - title: CommonIdentifierSafeUnicode, - content: DocsCreateDocRequestContent, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().user_docs_route_delete - -[Show source in client.py:7586](../../../../../../julep/api/client.py#L7586) - -Delete a Doc for this User - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.user_docs_route_delete( - id="id", - child_id="child_id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def user_docs_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().user_docs_route_list - -[Show source in client.py:7429](../../../../../../julep/api/client.py#L7429) - -List Docs owned by a User - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : UserDocsRouteListRequestSortBy - Sort by a field - -direction : UserDocsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -UserDocsRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.user_docs_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def user_docs_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: UserDocsRouteListRequestSortBy, - direction: UserDocsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> UserDocsRouteListResponse: ... -``` - -### AsyncJulepApi().user_docs_search_route_search - -[Show source in client.py:7646](../../../../../../julep/api/client.py#L7646) - -Search Docs owned by a User - -Parameters ----------- -id : CommonUuid - ID of the parent - -body : UserDocsSearchRouteSearchRequestBody - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsDocSearchResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep import DocsVectorDocSearchRequest -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.user_docs_search_route_search( - id="id", - body=DocsVectorDocSearchRequest( - limit=1, - confidence=1.1, - vector=[1.1], - ), - ) - -asyncio.run(main()) - -#### Signature - -```python -async def user_docs_search_route_search( - self, - id: CommonUuid, - body: UserDocsSearchRouteSearchRequestBody, - request_options: typing.Optional[RequestOptions] = None, -) -> DocsDocSearchResponse: ... -``` - -### AsyncJulepApi().users_route_create - -[Show source in client.py:7053](../../../../../../julep/api/client.py#L7053) - -Create a new user - -Parameters ----------- -name : CommonIdentifierSafeUnicode - Name of the user - -about : str - About the user - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_create( - name="name", - about="about", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_create( - self, - name: CommonIdentifierSafeUnicode, - about: str, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().users_route_create_or_update - -[Show source in client.py:7170](../../../../../../julep/api/client.py#L7170) - -Create or update a user - -Parameters ----------- -id : CommonUuid - -name : CommonIdentifierSafeUnicode - Name of the user - -about : str - About the user - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_create_or_update( - id="id", - name="name", - about="about", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_create_or_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().users_route_delete - -[Show source in client.py:7309](../../../../../../julep/api/client.py#L7309) - -Delete a user by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_delete( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### AsyncJulepApi().users_route_get - -[Show source in client.py:7118](../../../../../../julep/api/client.py#L7118) - -Get a user by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -UsersUser - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_get( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> UsersUser: ... -``` - -### AsyncJulepApi().users_route_list - -[Show source in client.py:6971](../../../../../../julep/api/client.py#L6971) - -List users (paginated) - -Parameters ----------- -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : UsersRouteListRequestSortBy - Sort by a field - -direction : UsersRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -UsersRouteListResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_list( - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_list( - self, - limit: CommonLimit, - offset: CommonOffset, - sort_by: UsersRouteListRequestSortBy, - direction: UsersRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> UsersRouteListResponse: ... -``` - -### AsyncJulepApi().users_route_patch - -[Show source in client.py:7361](../../../../../../julep/api/client.py#L7361) - -Update an existing user by id (merge with existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -name : typing.Optional[CommonIdentifierSafeUnicode] - Name of the user - -about : typing.Optional[str] - About the user - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_patch( - id="id", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_patch( - self, - id: CommonUuid, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - name: typing.Optional[CommonIdentifierSafeUnicode] = OMIT, - about: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### AsyncJulepApi().users_route_update - -[Show source in client.py:7239](../../../../../../julep/api/client.py#L7239) - -Update an existing user by id (overwrite existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -name : CommonIdentifierSafeUnicode - Name of the user - -about : str - About the user - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -import asyncio - -from julep.client import AsyncJulepApi - -client = AsyncJulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -async def main() -> None: - await client.users_route_update( - id="id", - name="name", - about="about", - ) - -asyncio.run(main()) - -#### Signature - -```python -async def users_route_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - - - -## JulepApi - -[Show source in client.py:115](../../../../../../julep/api/client.py#L115) - -Use this class to access the different functions within the SDK. You can instantiate any number of clients with different configuration that will propagate to these functions. - -Parameters ----------- -base_url : typing.Optional[str] - The base url to use for requests from the client. - -environment : JulepApiEnvironment - The environment to use for requests from the client. from .environment import JulepApiEnvironment - -Defaults to JulepApiEnvironment.DEFAULT - -auth_key : str -api_key : str -timeout : typing.Optional[float] - The timeout to be used, in seconds, for requests. By default the timeout is 300 seconds, unless a custom httpx client is used, in which case this default is not enforced. - -follow_redirects : typing.Optional[bool] - Whether the default httpx client follows redirects or not, this is irrelevant if a custom httpx client is passed in. - -httpx_client : typing.Optional[httpx.Client] - The httpx client to use for making requests, a preconfigured client is used by default, however this is useful should you want to pass in any custom httpx configuration. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) - -#### Signature - -```python -class JulepApi: - def __init__( - self, - base_url: typing.Optional[str] = None, - environment: JulepApiEnvironment = JulepApiEnvironment.DEFAULT, - auth_key: str, - api_key: str, - timeout: typing.Optional[float] = None, - follow_redirects: typing.Optional[bool] = True, - httpx_client: typing.Optional[httpx.Client] = None, - ): ... -``` - -### JulepApi().agent_docs_route_create - -[Show source in client.py:749](../../../../../../julep/api/client.py#L749) - -Create a Doc for this Agent - -Parameters ----------- -id : CommonUuid - ID of parent resource - -title : CommonIdentifierSafeUnicode - Title describing what this document contains - -content : DocsCreateDocRequestContent - Contents of the document - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_docs_route_create( - id="id", - title="title", - content="content", -) - -#### Signature - -```python -def agent_docs_route_create( - self, - id: CommonUuid, - title: CommonIdentifierSafeUnicode, - content: DocsCreateDocRequestContent, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agent_docs_route_delete - -[Show source in client.py:811](../../../../../../julep/api/client.py#L811) - -Delete a Doc for this Agent - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_docs_route_delete( - id="id", - child_id="child_id", -) - -#### Signature - -```python -def agent_docs_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().agent_docs_route_list - -[Show source in client.py:670](../../../../../../julep/api/client.py#L670) - -List Docs owned by an Agent - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : AgentDocsRouteListRequestSortBy - Sort by a field - -direction : AgentDocsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentDocsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_docs_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def agent_docs_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: AgentDocsRouteListRequestSortBy, - direction: AgentDocsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> AgentDocsRouteListResponse: ... -``` - -### JulepApi().agent_tools_route_create - -[Show source in client.py:1400](../../../../../../julep/api/client.py#L1400) - -Create a new tool for this agent - -Parameters ----------- -id : CommonUuid - ID of parent resource - -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsCreateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_tools_route_create( - id="id", - name="name", - about="about", - model="model", - instructions="instructions", -) - -#### Signature - -```python -def agent_tools_route_create( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsCreateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agent_tools_route_delete - -[Show source in client.py:1566](../../../../../../julep/api/client.py#L1566) - -Delete an existing tool by id - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_tools_route_delete( - id="id", - child_id="child_id", -) - -#### Signature - -```python -def agent_tools_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().agent_tools_route_list - -[Show source in client.py:1321](../../../../../../julep/api/client.py#L1321) - -List tools of the given agent - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : AgentToolsRouteListRequestSortBy - Sort by a field - -direction : AgentToolsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentToolsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_tools_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def agent_tools_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: AgentToolsRouteListRequestSortBy, - direction: AgentToolsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> AgentToolsRouteListResponse: ... -``` - -### JulepApi().agent_tools_route_patch - -[Show source in client.py:1618](../../../../../../julep/api/client.py#L1618) - -Update an existing tool (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be patched - -type : typing.Optional[ToolsToolType] - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - -name : typing.Optional[CommonValidPythonIdentifier] - Name of the tool (must be unique for this agent and a valid python identifier string ) - -function : typing.Optional[ToolsFunctionDef] - -integration : typing.Optional[typing.Any] - -system : typing.Optional[typing.Any] - -api_call : typing.Optional[typing.Any] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_tools_route_patch( - id="id", - child_id="child_id", -) - -#### Signature - -```python -def agent_tools_route_patch( - self, - id: CommonUuid, - child_id: CommonUuid, - type: typing.Optional[ToolsToolType] = OMIT, - name: typing.Optional[CommonValidPythonIdentifier] = OMIT, - function: typing.Optional[ToolsFunctionDef] = OMIT, - integration: typing.Optional[typing.Any] = OMIT, - system: typing.Optional[typing.Any] = OMIT, - api_call: typing.Optional[typing.Any] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agent_tools_route_update - -[Show source in client.py:1483](../../../../../../julep/api/client.py#L1483) - -Update an existing tool (overwrite existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be updated - -type : ToolsToolType - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - -name : CommonValidPythonIdentifier - Name of the tool (must be unique for this agent and a valid python identifier string ) - -function : typing.Optional[ToolsFunctionDef] - -integration : typing.Optional[typing.Any] - -system : typing.Optional[typing.Any] - -api_call : typing.Optional[typing.Any] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agent_tools_route_update( - id="id", - child_id="child_id", - type="function", - name="name", -) - -#### Signature - -```python -def agent_tools_route_update( - self, - id: CommonUuid, - child_id: CommonUuid, - type: ToolsToolType, - name: CommonValidPythonIdentifier, - function: typing.Optional[ToolsFunctionDef] = OMIT, - integration: typing.Optional[typing.Any] = OMIT, - system: typing.Optional[typing.Any] = OMIT, - api_call: typing.Optional[typing.Any] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agents_docs_search_route_search - -[Show source in client.py:863](../../../../../../julep/api/client.py#L863) - -Search Docs owned by an Agent - -Parameters ----------- -id : CommonUuid - ID of the parent - -body : AgentsDocsSearchRouteSearchRequestBody - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsDocSearchResponse - The request has succeeded. - -Examples --------- -from julep import DocsVectorDocSearchRequest -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_docs_search_route_search( - id="id", - body=DocsVectorDocSearchRequest( - limit=1, - confidence=1.1, - vector=[1.1], - ), -) - -#### Signature - -```python -def agents_docs_search_route_search( - self, - id: CommonUuid, - body: AgentsDocsSearchRouteSearchRequestBody, - request_options: typing.Optional[RequestOptions] = None, -) -> DocsDocSearchResponse: ... -``` - -### JulepApi().agents_route_create - -[Show source in client.py:260](../../../../../../julep/api/client.py#L260) - -Create a new Agent - -Parameters ----------- -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsCreateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_create( - name="name", - about="about", - model="model", - instructions="instructions", -) - -#### Signature - -```python -def agents_route_create( - self, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsCreateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agents_route_create_or_update - -[Show source in client.py:382](../../../../../../julep/api/client.py#L382) - -Create or update an Agent - -Parameters ----------- -id : CommonUuid - -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsUpdateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_create_or_update( - id="id", - name="name", - about="about", - model="model", - instructions="instructions", -) - -#### Signature - -```python -def agents_route_create_or_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsUpdateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agents_route_delete - -[Show source in client.py:547](../../../../../../julep/api/client.py#L547) - -Delete Agent by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_delete( - id="id", -) - -#### Signature - -```python -def agents_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().agents_route_get - -[Show source in client.py:338](../../../../../../julep/api/client.py#L338) - -Get an Agent by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentsAgent - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_get( - id="id", -) - -#### Signature - -```python -def agents_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> AgentsAgent: ... -``` - -### JulepApi().agents_route_list - -[Show source in client.py:186](../../../../../../julep/api/client.py#L186) - -List Agents (paginated) - -Parameters ----------- -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : AgentsRouteListRequestSortBy - Sort by a field - -direction : AgentsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -AgentsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_list( - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def agents_route_list( - self, - limit: CommonLimit, - offset: CommonOffset, - sort_by: AgentsRouteListRequestSortBy, - direction: AgentsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> AgentsRouteListResponse: ... -``` - -### JulepApi().agents_route_patch - -[Show source in client.py:591](../../../../../../julep/api/client.py#L591) - -Update an existing Agent by id (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -name : typing.Optional[CommonIdentifierSafeUnicode] - Name of the agent - -about : typing.Optional[str] - About the agent - -model : typing.Optional[str] - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : typing.Optional[AgentsPatchAgentRequestInstructions] - Instructions for the agent - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_patch( - id="id", -) - -#### Signature - -```python -def agents_route_patch( - self, - id: CommonUuid, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - name: typing.Optional[CommonIdentifierSafeUnicode] = OMIT, - about: typing.Optional[str] = OMIT, - model: typing.Optional[str] = OMIT, - instructions: typing.Optional[AgentsPatchAgentRequestInstructions] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().agents_route_update - -[Show source in client.py:464](../../../../../../julep/api/client.py#L464) - -Update an existing Agent by id (overwrites existing values; use PATCH for merging instead) - -Parameters ----------- -id : CommonUuid - ID of the resource - -name : CommonIdentifierSafeUnicode - Name of the agent - -about : str - About the agent - -model : str - Model name to use (gpt-4-turbo, gemini-nano etc) - -instructions : AgentsUpdateAgentRequestInstructions - Instructions for the agent - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -default_settings : typing.Optional[ChatDefaultChatSettings] - Default settings for all sessions created by this agent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.agents_route_update( - id="id", - name="name", - about="about", - model="model", - instructions="instructions", -) - -#### Signature - -```python -def agents_route_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - model: str, - instructions: AgentsUpdateAgentRequestInstructions, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - default_settings: typing.Optional[ChatDefaultChatSettings] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().chat_route_generate - -[Show source in client.py:2662](../../../../../../julep/api/client.py#L2662) - -Generate a response from the model - -Parameters ----------- -id : CommonUuid - The session ID - -remember : bool - DISABLED: Whether this interaction should form new memories or not (will be enabled in a future release) - -recall : bool - Whether previous memories and docs should be recalled or not - -save : bool - Whether this interaction should be stored in the session history or not - -stream : bool - Indicates if the server should stream the response as it's generated - -messages : typing.Sequence[EntriesInputChatMlMessage] - A list of new input messages comprising the conversation so far. - -model : typing.Optional[CommonIdentifierSafeUnicode] - Identifier of the model to be used - -stop : typing.Optional[typing.Sequence[str]] - Up to 4 sequences where the API will stop generating further tokens. - -seed : typing.Optional[int] - If specified, the system will make a best effort to sample deterministically for that particular seed value - -max_tokens : typing.Optional[int] - The maximum number of tokens to generate in the chat completion - -logit_bias : typing.Optional[typing.Dict[str, CommonLogitBias]] - Modify the likelihood of specified tokens appearing in the completion - -response_format : typing.Optional[ChatCompletionResponseFormat] - Response format (set to `json_object` to restrict output to JSON) - -agent : typing.Optional[CommonUuid] - Agent ID of the agent to use for this interaction. (Only applicable for multi-agent sessions) - -repetition_penalty : typing.Optional[float] - Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - -length_penalty : typing.Optional[float] - Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. - -min_p : typing.Optional[float] - Minimum probability compared to leading token to be considered - -frequency_penalty : typing.Optional[float] - Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - -presence_penalty : typing.Optional[float] - Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. - -temperature : typing.Optional[float] - What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. - -top_p : typing.Optional[float] - Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. - -tools : typing.Optional[typing.Sequence[ToolsFunctionTool]] - (Advanced) List of tools that are provided in addition to agent's default set of tools. - -tool_choice : typing.Optional[ChatChatInputDataToolChoice] - Can be one of existing tools given to the agent earlier or the ones provided in this request. - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -ChatRouteGenerateResponse - The request has succeeded. - -Examples --------- -from julep import EntriesInputChatMlMessage -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.chat_route_generate( - id="id", - messages=[ - EntriesInputChatMlMessage( - role="user", - content="content", - ) - ], - remember=True, - recall=True, - save=True, - stream=True, -) - -#### Signature - -```python -def chat_route_generate( - self, - id: CommonUuid, - remember: bool, - recall: bool, - save: bool, - stream: bool, - messages: typing.Sequence[EntriesInputChatMlMessage], - model: typing.Optional[CommonIdentifierSafeUnicode] = OMIT, - stop: typing.Optional[typing.Sequence[str]] = OMIT, - seed: typing.Optional[int] = OMIT, - max_tokens: typing.Optional[int] = OMIT, - logit_bias: typing.Optional[typing.Dict[str, CommonLogitBias]] = OMIT, - response_format: typing.Optional[ChatCompletionResponseFormat] = OMIT, - agent: typing.Optional[CommonUuid] = OMIT, - repetition_penalty: typing.Optional[float] = OMIT, - length_penalty: typing.Optional[float] = OMIT, - min_p: typing.Optional[float] = OMIT, - frequency_penalty: typing.Optional[float] = OMIT, - presence_penalty: typing.Optional[float] = OMIT, - temperature: typing.Optional[float] = OMIT, - top_p: typing.Optional[float] = OMIT, - tools: typing.Optional[typing.Sequence[ToolsFunctionTool]] = OMIT, - tool_choice: typing.Optional[ChatChatInputDataToolChoice] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> ChatRouteGenerateResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().embed_route_embed - -[Show source in client.py:1840](../../../../../../julep/api/client.py#L1840) - -Embed a query for search - -Parameters ----------- -body : DocsEmbedQueryRequest - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsEmbedQueryResponse - The request has succeeded. - -Examples --------- -from julep import DocsEmbedQueryRequest -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.embed_route_embed( - body=DocsEmbedQueryRequest( - text="text", - ), -) - -#### Signature - -```python -def embed_route_embed( - self, - body: DocsEmbedQueryRequest, - request_options: typing.Optional[RequestOptions] = None, -) -> DocsEmbedQueryResponse: ... -``` - -### JulepApi().execution_transitions_route_list - -[Show source in client.py:2045](../../../../../../julep/api/client.py#L2045) - -List the Transitions of an Execution by id - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : ExecutionTransitionsRouteListRequestSortBy - Sort by a field - -direction : ExecutionTransitionsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -ExecutionTransitionsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.execution_transitions_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def execution_transitions_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: ExecutionTransitionsRouteListRequestSortBy, - direction: ExecutionTransitionsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> ExecutionTransitionsRouteListResponse: ... -``` - -### JulepApi().executions_route_get - -[Show source in client.py:1945](../../../../../../julep/api/client.py#L1945) - -Get an Execution by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -ExecutionsExecution - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.executions_route_get( - id="id", -) - -#### Signature - -```python -def executions_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> ExecutionsExecution: ... -``` - -### JulepApi().executions_route_resume_with_task_token - -[Show source in client.py:1891](../../../../../../julep/api/client.py#L1891) - -Resume an execution with a task token - -Parameters ----------- -task_token : str - A Task Token is a unique identifier for a specific Task Execution. - -input : typing.Optional[typing.Dict[str, typing.Any]] - The input to resume the execution with - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.executions_route_resume_with_task_token( - task_token="task_token", -) - -#### Signature - -```python -def executions_route_resume_with_task_token( - self, - task_token: str, - input: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().executions_route_update - -[Show source in client.py:1989](../../../../../../julep/api/client.py#L1989) - -Update an existing Execution - -Parameters ----------- -id : CommonUuid - ID of the resource - -request : ExecutionsUpdateExecutionRequest - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep import ExecutionsUpdateExecutionRequest_Cancelled -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.executions_route_update( - id="string", - request=ExecutionsUpdateExecutionRequest_Cancelled( - reason="string", - ), -) - -#### Signature - -```python -def executions_route_update( - self, - id: CommonUuid, - request: ExecutionsUpdateExecutionRequest, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -### JulepApi().history_route_delete - -[Show source in client.py:2872](../../../../../../julep/api/client.py#L2872) - -Clear the history of a Session (resets the Session) - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.history_route_delete( - id="id", -) - -#### Signature - -```python -def history_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().history_route_history - -[Show source in client.py:2828](../../../../../../julep/api/client.py#L2828) - -Get history of a Session - -Parameters ----------- -id : CommonUuid - ID of parent - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -EntriesHistory - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.history_route_history( - id="id", -) - -#### Signature - -```python -def history_route_history( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> EntriesHistory: ... -``` - -### JulepApi().individual_docs_route_get - -[Show source in client.py:1796](../../../../../../julep/api/client.py#L1796) - -Get Doc by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsDoc - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.individual_docs_route_get( - id="id", -) - -#### Signature - -```python -def individual_docs_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> DocsDoc: ... -``` - -### JulepApi().job_route_get - -[Show source in client.py:2124](../../../../../../julep/api/client.py#L2124) - -Get the status of an existing Job by its id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -JobsJobStatus - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.job_route_get( - id="id", -) - -#### Signature - -```python -def job_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> JobsJobStatus: ... -``` - -### JulepApi().sessions_route_create - -[Show source in client.py:2242](../../../../../../julep/api/client.py#L2242) - -Create a new session - -Parameters ----------- -situation : str - A specific situation that sets the background for this session - -render_templates : bool - Render system and assistant message content as jinja templates - -user : typing.Optional[CommonUuid] - User ID of user associated with this session - -users : typing.Optional[typing.Sequence[CommonUuid]] - -agent : typing.Optional[CommonUuid] - Agent ID of agent associated with this session - -agents : typing.Optional[typing.Sequence[CommonUuid]] - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_create( - situation="situation", - render_templates=True, -) - -#### Signature - -```python -def sessions_route_create( - self, - situation: str, - render_templates: bool, - user: typing.Optional[CommonUuid] = OMIT, - users: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - agent: typing.Optional[CommonUuid] = OMIT, - agents: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().sessions_route_create_or_update - -[Show source in client.py:2375](../../../../../../julep/api/client.py#L2375) - -Create or update a session - -Parameters ----------- -id : CommonUuid - -situation : str - A specific situation that sets the background for this session - -render_templates : bool - Render system and assistant message content as jinja templates - -user : typing.Optional[CommonUuid] - User ID of user associated with this session - -users : typing.Optional[typing.Sequence[CommonUuid]] - -agent : typing.Optional[CommonUuid] - Agent ID of agent associated with this session - -agents : typing.Optional[typing.Sequence[CommonUuid]] - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_create_or_update( - id="id", - situation="situation", - render_templates=True, -) - -#### Signature - -```python -def sessions_route_create_or_update( - self, - id: CommonUuid, - situation: str, - render_templates: bool, - user: typing.Optional[CommonUuid] = OMIT, - users: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - agent: typing.Optional[CommonUuid] = OMIT, - agents: typing.Optional[typing.Sequence[CommonUuid]] = OMIT, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().sessions_route_delete - -[Show source in client.py:2544](../../../../../../julep/api/client.py#L2544) - -Delete a session by its id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_delete( - id="id", -) - -#### Signature - -```python -def sessions_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().sessions_route_get - -[Show source in client.py:2331](../../../../../../julep/api/client.py#L2331) - -Get a session by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -SessionsSession - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_get( - id="string", -) - -#### Signature - -```python -def sessions_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> SessionsSession: ... -``` - -### JulepApi().sessions_route_list - -[Show source in client.py:2168](../../../../../../julep/api/client.py#L2168) - -List sessions (paginated) - -Parameters ----------- -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : SessionsRouteListRequestSortBy - Sort by a field - -direction : SessionsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -SessionsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_list( - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def sessions_route_list( - self, - limit: CommonLimit, - offset: CommonOffset, - sort_by: SessionsRouteListRequestSortBy, - direction: SessionsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> SessionsRouteListResponse: ... -``` - -### JulepApi().sessions_route_patch - -[Show source in client.py:2588](../../../../../../julep/api/client.py#L2588) - -Update an existing session by its id (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -situation : typing.Optional[str] - A specific situation that sets the background for this session - -render_templates : typing.Optional[bool] - Render system and assistant message content as jinja templates - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_patch( - id="id", -) - -#### Signature - -```python -def sessions_route_patch( - self, - id: CommonUuid, - situation: typing.Optional[str] = OMIT, - render_templates: typing.Optional[bool] = OMIT, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().sessions_route_update - -[Show source in client.py:2468](../../../../../../julep/api/client.py#L2468) - -Update an existing session by its id (overwrites all existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -situation : str - A specific situation that sets the background for this session - -render_templates : bool - Render system and assistant message content as jinja templates - -token_budget : typing.Optional[int] - Threshold value for the adaptive context functionality - -context_overflow : typing.Optional[SessionsContextOverflowType] - Action to start on context window overflow - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.sessions_route_update( - id="id", - situation="situation", - render_templates=True, -) - -#### Signature - -```python -def sessions_route_update( - self, - id: CommonUuid, - situation: str, - render_templates: bool, - token_budget: typing.Optional[int] = OMIT, - context_overflow: typing.Optional[SessionsContextOverflowType] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().task_executions_route_create - -[Show source in client.py:2995](../../../../../../julep/api/client.py#L2995) - -Create an execution for the given task - -Parameters ----------- -id : CommonUuid - ID of parent resource - -input : typing.Dict[str, typing.Any] - The input to the execution - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.task_executions_route_create( - id="id", - input={"key": "value"}, -) - -#### Signature - -```python -def task_executions_route_create( - self, - id: CommonUuid, - input: typing.Dict[str, typing.Any], - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().task_executions_route_list - -[Show source in client.py:2916](../../../../../../julep/api/client.py#L2916) - -List executions of the given task - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : TaskExecutionsRouteListRequestSortBy - Sort by a field - -direction : TaskExecutionsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -TaskExecutionsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.task_executions_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def task_executions_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: TaskExecutionsRouteListRequestSortBy, - direction: TaskExecutionsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> TaskExecutionsRouteListResponse: ... -``` - -### JulepApi().tasks_create_or_update_route_create_or_update - -[Show source in client.py:1699](../../../../../../julep/api/client.py#L1699) - -Create or update a task - -Parameters ----------- -parent_id : CommonUuid - ID of the agent - -id : CommonUuid - -name : str - -description : str - -main : typing.Sequence[TasksCreateTaskRequestMainItem] - The entrypoint of the task. - -tools : typing.Sequence[TasksTaskTool] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : bool - Whether to inherit tools from the parent agent or not. Defaults to true. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep import TasksTaskTool -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.tasks_create_or_update_route_create_or_update( - parent_id="parent_id", - id="id", - name="name", - description="description", - main=[], - tools=[ - TasksTaskTool( - type="function", - name="name", - ) - ], - inherit_tools=True, -) - -#### Signature - -```python -def tasks_create_or_update_route_create_or_update( - self, - parent_id: CommonUuid, - id: CommonUuid, - name: str, - description: str, - main: typing.Sequence[TasksCreateTaskRequestMainItem], - tools: typing.Sequence[TasksTaskTool], - inherit_tools: bool, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().tasks_route_create - -[Show source in client.py:1000](../../../../../../julep/api/client.py#L1000) - -Create a new task - -Parameters ----------- -id : CommonUuid - ID of parent resource - -name : str - -description : str - -main : typing.Sequence[TasksCreateTaskRequestMainItem] - The entrypoint of the task. - -tools : typing.Sequence[TasksTaskTool] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : bool - Whether to inherit tools from the parent agent or not. Defaults to true. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded. - -Examples --------- -from julep import TasksTaskTool -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.tasks_route_create( - id="id", - name="name", - description="description", - main=[], - tools=[ - TasksTaskTool( - type="function", - name="name", - ) - ], - inherit_tools=True, -) - -#### Signature - -```python -def tasks_route_create( - self, - id: CommonUuid, - name: str, - description: str, - main: typing.Sequence[TasksCreateTaskRequestMainItem], - tools: typing.Sequence[TasksTaskTool], - inherit_tools: bool, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().tasks_route_delete - -[Show source in client.py:1186](../../../../../../julep/api/client.py#L1186) - -Delete a task by its id - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.tasks_route_delete( - id="id", - child_id="child_id", -) - -#### Signature - -```python -def tasks_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().tasks_route_list - -[Show source in client.py:921](../../../../../../julep/api/client.py#L921) - -List tasks (paginated) - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : TasksRouteListRequestSortBy - Sort by a field - -direction : TasksRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -TasksRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.tasks_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def tasks_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: TasksRouteListRequestSortBy, - direction: TasksRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> TasksRouteListResponse: ... -``` - -### JulepApi().tasks_route_patch - -[Show source in client.py:1238](../../../../../../julep/api/client.py#L1238) - -Update an existing task (merges with existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be patched - -description : typing.Optional[str] - -main : typing.Optional[typing.Sequence[TasksPatchTaskRequestMainItem]] - The entrypoint of the task. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -tools : typing.Optional[typing.Sequence[TasksTaskTool]] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : typing.Optional[bool] - Whether to inherit tools from the parent agent or not. Defaults to true. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.tasks_route_patch( - id="id", - child_id="child_id", -) - -#### Signature - -```python -def tasks_route_patch( - self, - id: CommonUuid, - child_id: CommonUuid, - description: typing.Optional[str] = OMIT, - main: typing.Optional[typing.Sequence[TasksPatchTaskRequestMainItem]] = OMIT, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - tools: typing.Optional[typing.Sequence[TasksTaskTool]] = OMIT, - inherit_tools: typing.Optional[bool] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().tasks_route_update - -[Show source in client.py:1093](../../../../../../julep/api/client.py#L1093) - -Update an existing task (overwrite existing values) - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be updated - -description : str - -main : typing.Sequence[TasksUpdateTaskRequestMainItem] - The entrypoint of the task. - -tools : typing.Sequence[TasksTaskTool] - Tools defined specifically for this task not included in the Agent itself. - -inherit_tools : bool - Whether to inherit tools from the parent agent or not. Defaults to true. - -input_schema : typing.Optional[typing.Dict[str, typing.Any]] - The schema for the input to the task. `null` means all inputs are valid. - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep import TasksTaskTool -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.tasks_route_update( - id="id", - child_id="child_id", - description="description", - main=[], - tools=[ - TasksTaskTool( - type="function", - name="name", - ) - ], - inherit_tools=True, -) - -#### Signature - -```python -def tasks_route_update( - self, - id: CommonUuid, - child_id: CommonUuid, - description: str, - main: typing.Sequence[TasksUpdateTaskRequestMainItem], - tools: typing.Sequence[TasksTaskTool], - inherit_tools: bool, - input_schema: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().user_docs_route_create - -[Show source in client.py:3533](../../../../../../julep/api/client.py#L3533) - -Create a Doc for this User - -Parameters ----------- -id : CommonUuid - ID of parent resource - -title : CommonIdentifierSafeUnicode - Title describing what this document contains - -content : DocsCreateDocRequestContent - Contents of the document - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.user_docs_route_create( - id="id", - title="title", - content="content", -) - -#### Signature - -```python -def user_docs_route_create( - self, - id: CommonUuid, - title: CommonIdentifierSafeUnicode, - content: DocsCreateDocRequestContent, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().user_docs_route_delete - -[Show source in client.py:3595](../../../../../../julep/api/client.py#L3595) - -Delete a Doc for this User - -Parameters ----------- -id : CommonUuid - ID of parent resource - -child_id : CommonUuid - ID of the resource to be deleted - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.user_docs_route_delete( - id="id", - child_id="child_id", -) - -#### Signature - -```python -def user_docs_route_delete( - self, - id: CommonUuid, - child_id: CommonUuid, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().user_docs_route_list - -[Show source in client.py:3454](../../../../../../julep/api/client.py#L3454) - -List Docs owned by a User - -Parameters ----------- -id : CommonUuid - ID of parent - -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : UserDocsRouteListRequestSortBy - Sort by a field - -direction : UserDocsRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -UserDocsRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.user_docs_route_list( - id="id", - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def user_docs_route_list( - self, - id: CommonUuid, - limit: CommonLimit, - offset: CommonOffset, - sort_by: UserDocsRouteListRequestSortBy, - direction: UserDocsRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> UserDocsRouteListResponse: ... -``` - -### JulepApi().user_docs_search_route_search - -[Show source in client.py:3647](../../../../../../julep/api/client.py#L3647) - -Search Docs owned by a User - -Parameters ----------- -id : CommonUuid - ID of the parent - -body : UserDocsSearchRouteSearchRequestBody - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -DocsDocSearchResponse - The request has succeeded. - -Examples --------- -from julep import DocsVectorDocSearchRequest -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.user_docs_search_route_search( - id="id", - body=DocsVectorDocSearchRequest( - limit=1, - confidence=1.1, - vector=[1.1], - ), -) - -#### Signature - -```python -def user_docs_search_route_search( - self, - id: CommonUuid, - body: UserDocsSearchRouteSearchRequestBody, - request_options: typing.Optional[RequestOptions] = None, -) -> DocsDocSearchResponse: ... -``` - -### JulepApi().users_route_create - -[Show source in client.py:3126](../../../../../../julep/api/client.py#L3126) - -Create a new user - -Parameters ----------- -name : CommonIdentifierSafeUnicode - Name of the user - -about : str - About the user - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceCreatedResponse - The request has succeeded and a new resource has been created as a result. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_create( - name="name", - about="about", -) - -#### Signature - -```python -def users_route_create( - self, - name: CommonIdentifierSafeUnicode, - about: str, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceCreatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().users_route_create_or_update - -[Show source in client.py:3227](../../../../../../julep/api/client.py#L3227) - -Create or update a user - -Parameters ----------- -id : CommonUuid - -name : CommonIdentifierSafeUnicode - Name of the user - -about : str - About the user - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_create_or_update( - id="id", - name="name", - about="about", -) - -#### Signature - -```python -def users_route_create_or_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().users_route_delete - -[Show source in client.py:3350](../../../../../../julep/api/client.py#L3350) - -Delete a user by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceDeletedResponse - The request has been accepted for processing, but processing has not yet completed. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_delete( - id="id", -) - -#### Signature - -```python -def users_route_delete( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> CommonResourceDeletedResponse: ... -``` - -### JulepApi().users_route_get - -[Show source in client.py:3183](../../../../../../julep/api/client.py#L3183) - -Get a user by id - -Parameters ----------- -id : CommonUuid - ID of the resource - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -UsersUser - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_get( - id="id", -) - -#### Signature - -```python -def users_route_get( - self, id: CommonUuid, request_options: typing.Optional[RequestOptions] = None -) -> UsersUser: ... -``` - -### JulepApi().users_route_list - -[Show source in client.py:3052](../../../../../../julep/api/client.py#L3052) - -List users (paginated) - -Parameters ----------- -limit : CommonLimit - Limit the number of items returned - -offset : CommonOffset - Offset the items returned - -sort_by : UsersRouteListRequestSortBy - Sort by a field - -direction : UsersRouteListRequestDirection - Sort direction - -metadata_filter : str - JSON string of object that should be used to filter objects by metadata - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -UsersRouteListResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_list( - limit=1, - offset=1, - sort_by="created_at", - direction="asc", - metadata_filter="metadata_filter", -) - -#### Signature - -```python -def users_route_list( - self, - limit: CommonLimit, - offset: CommonOffset, - sort_by: UsersRouteListRequestSortBy, - direction: UsersRouteListRequestDirection, - metadata_filter: str, - request_options: typing.Optional[RequestOptions] = None, -) -> UsersRouteListResponse: ... -``` - -### JulepApi().users_route_patch - -[Show source in client.py:3394](../../../../../../julep/api/client.py#L3394) - -Update an existing user by id (merge with existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -name : typing.Optional[CommonIdentifierSafeUnicode] - Name of the user - -about : typing.Optional[str] - About the user - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_patch( - id="id", -) - -#### Signature - -```python -def users_route_patch( - self, - id: CommonUuid, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - name: typing.Optional[CommonIdentifierSafeUnicode] = OMIT, - about: typing.Optional[str] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) - -### JulepApi().users_route_update - -[Show source in client.py:3288](../../../../../../julep/api/client.py#L3288) - -Update an existing user by id (overwrite existing values) - -Parameters ----------- -id : CommonUuid - ID of the resource - -name : CommonIdentifierSafeUnicode - Name of the user - -about : str - About the user - -metadata : typing.Optional[typing.Dict[str, typing.Any]] - -request_options : typing.Optional[RequestOptions] - Request-specific configuration. - -Returns -------- -CommonResourceUpdatedResponse - The request has succeeded. - -Examples --------- -from julep.client import JulepApi - -client = JulepApi( - auth_key="YOUR_AUTH_KEY", - api_key="YOUR_API_KEY", -) -client.users_route_update( - id="id", - name="name", - about="about", -) - -#### Signature - -```python -def users_route_update( - self, - id: CommonUuid, - name: CommonIdentifierSafeUnicode, - about: str, - metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT, - request_options: typing.Optional[RequestOptions] = None, -) -> CommonResourceUpdatedResponse: ... -``` - -#### See also - -- [OMIT](#omit) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/api_error.md b/docs/python-sdk-docs/julep/api/core/api_error.md deleted file mode 100644 index 7a1374c8a..000000000 --- a/docs/python-sdk-docs/julep/api/core/api_error.md +++ /dev/null @@ -1,21 +0,0 @@ -# ApiError - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / ApiError - -> Auto-generated documentation for [julep.api.core.api_error](../../../../../../../julep/api/core/api_error.py) module. - -- [ApiError](#apierror) - - [ApiError](#apierror-1) - -## ApiError - -[Show source in api_error.py:6](../../../../../../../julep/api/core/api_error.py#L6) - -#### Signature - -```python -class ApiError(Exception): - def __init__( - self, status_code: typing.Optional[int] = None, body: typing.Any = None - ): ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/client_wrapper.md b/docs/python-sdk-docs/julep/api/core/client_wrapper.md deleted file mode 100644 index 876018f69..000000000 --- a/docs/python-sdk-docs/julep/api/core/client_wrapper.md +++ /dev/null @@ -1,105 +0,0 @@ -# Client Wrapper - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / Client Wrapper - -> Auto-generated documentation for [julep.api.core.client_wrapper](../../../../../../../julep/api/core/client_wrapper.py) module. - -- [Client Wrapper](#client-wrapper) - - [AsyncClientWrapper](#asyncclientwrapper) - - [BaseClientWrapper](#baseclientwrapper) - - [SyncClientWrapper](#syncclientwrapper) - -## AsyncClientWrapper - -[Show source in client_wrapper.py:58](../../../../../../../julep/api/core/client_wrapper.py#L58) - -#### Signature - -```python -class AsyncClientWrapper(BaseClientWrapper): - def __init__( - self, - auth_key: str, - api_key: str, - base_url: str, - timeout: typing.Optional[float] = None, - httpx_client: httpx.AsyncClient, - ): ... -``` - -#### See also - -- [BaseClientWrapper](#baseclientwrapper) - - - -## BaseClientWrapper - -[Show source in client_wrapper.py:10](../../../../../../../julep/api/core/client_wrapper.py#L10) - -#### Signature - -```python -class BaseClientWrapper: - def __init__( - self, - auth_key: str, - api_key: str, - base_url: str, - timeout: typing.Optional[float] = None, - ): ... -``` - -### BaseClientWrapper().get_base_url - -[Show source in client_wrapper.py:30](../../../../../../../julep/api/core/client_wrapper.py#L30) - -#### Signature - -```python -def get_base_url(self) -> str: ... -``` - -### BaseClientWrapper().get_headers - -[Show source in client_wrapper.py:24](../../../../../../../julep/api/core/client_wrapper.py#L24) - -#### Signature - -```python -def get_headers(self) -> typing.Dict[str, str]: ... -``` - -### BaseClientWrapper().get_timeout - -[Show source in client_wrapper.py:33](../../../../../../../julep/api/core/client_wrapper.py#L33) - -#### Signature - -```python -def get_timeout(self) -> typing.Optional[float]: ... -``` - - - -## SyncClientWrapper - -[Show source in client_wrapper.py:37](../../../../../../../julep/api/core/client_wrapper.py#L37) - -#### Signature - -```python -class SyncClientWrapper(BaseClientWrapper): - def __init__( - self, - auth_key: str, - api_key: str, - base_url: str, - timeout: typing.Optional[float] = None, - httpx_client: httpx.Client, - ): ... -``` - -#### See also - -- [BaseClientWrapper](#baseclientwrapper) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/datetime_utils.md b/docs/python-sdk-docs/julep/api/core/datetime_utils.md deleted file mode 100644 index 079e9b9c1..000000000 --- a/docs/python-sdk-docs/julep/api/core/datetime_utils.md +++ /dev/null @@ -1,24 +0,0 @@ -# Datetime Utils - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / Datetime Utils - -> Auto-generated documentation for [julep.api.core.datetime_utils](../../../../../../../julep/api/core/datetime_utils.py) module. - -- [Datetime Utils](#datetime-utils) - - [serialize_datetime](#serialize_datetime) - -## serialize_datetime - -[Show source in datetime_utils.py:6](../../../../../../../julep/api/core/datetime_utils.py#L6) - -Serialize a datetime including timezone info. - -Uses the timezone info provided if present, otherwise uses the current runtime's timezone info. - -UTC datetimes end in "Z" while all other timezones are represented as offset from UTC, e.g. +05:00. - -#### Signature - -```python -def serialize_datetime(v: dt.datetime) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/file.md b/docs/python-sdk-docs/julep/api/core/file.md deleted file mode 100644 index 79d76c4cf..000000000 --- a/docs/python-sdk-docs/julep/api/core/file.md +++ /dev/null @@ -1,36 +0,0 @@ -# File - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / File - -> Auto-generated documentation for [julep.api.core.file](../../../../../../../julep/api/core/file.py) module. - -#### Attributes - -- `FileContent` - File typing inspired by the flexibility of types within the httpx library - https://github.com/encode/httpx/blob/master/httpx/_types.py: typing.Union[typing.IO[bytes], bytes, str] - - -- [File](#file) - - [convert_file_dict_to_httpx_tuples](#convert_file_dict_to_httpx_tuples) - -## convert_file_dict_to_httpx_tuples - -[Show source in file.py:25](../../../../../../../julep/api/core/file.py#L25) - -The format we use is a list of tuples, where the first element is the -name of the file and the second is the file object. Typically HTTPX wants -a dict, but to be able to send lists of files, you have to use the list -approach (which also works for non-lists) -https://github.com/encode/httpx/pull/1032 - -#### Signature - -```python -def convert_file_dict_to_httpx_tuples( - d: typing.Dict[str, typing.Union[File, typing.List[File]]], -) -> typing.List[typing.Tuple[str, File]]: ... -``` - -#### See also - -- [File](#file) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/http_client.md b/docs/python-sdk-docs/julep/api/core/http_client.md deleted file mode 100644 index bdfc9598a..000000000 --- a/docs/python-sdk-docs/julep/api/core/http_client.md +++ /dev/null @@ -1,264 +0,0 @@ -# HttpClient - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / HttpClient - -> Auto-generated documentation for [julep.api.core.http_client](../../../../../../../julep/api/core/http_client.py) module. - -- [HttpClient](#httpclient) - - [AsyncHttpClient](#asynchttpclient) - - [HttpClient](#httpclient-1) - - [_parse_retry_after](#_parse_retry_after) - - [_retry_timeout](#_retry_timeout) - - [get_request_body](#get_request_body) - - [maybe_filter_request_body](#maybe_filter_request_body) - - [remove_omit_from_dict](#remove_omit_from_dict) - -## AsyncHttpClient - -[Show source in http_client.py:357](../../../../../../../julep/api/core/http_client.py#L357) - -#### Signature - -```python -class AsyncHttpClient: - def __init__( - self, - httpx_client: httpx.AsyncClient, - base_timeout: typing.Optional[float], - base_headers: typing.Dict[str, str], - base_url: typing.Optional[str] = None, - ): ... -``` - -### AsyncHttpClient().get_base_url - -[Show source in http_client.py:371](../../../../../../../julep/api/core/http_client.py#L371) - -#### Signature - -```python -def get_base_url(self, maybe_base_url: typing.Optional[str]) -> str: ... -``` - -### AsyncHttpClient().request - -[Show source in http_client.py:379](../../../../../../../julep/api/core/http_client.py#L379) - -#### Signature - -```python -async def request( - self, - path: typing.Optional[str] = None, - method: str, - base_url: typing.Optional[str] = None, - params: typing.Optional[typing.Dict[str, typing.Any]] = None, - json: typing.Optional[typing.Any] = None, - data: typing.Optional[typing.Any] = None, - content: typing.Optional[ - typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] - ] = None, - files: typing.Optional[ - typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]] - ] = None, - headers: typing.Optional[typing.Dict[str, typing.Any]] = None, - request_options: typing.Optional[RequestOptions] = None, - retries: int = 0, - omit: typing.Optional[typing.Any] = None, -) -> httpx.Response: ... -``` - -### AsyncHttpClient().stream - -[Show source in http_client.py:480](../../../../../../../julep/api/core/http_client.py#L480) - -#### Signature - -```python -@asynccontextmanager -async def stream( - self, - path: typing.Optional[str] = None, - method: str, - base_url: typing.Optional[str] = None, - params: typing.Optional[typing.Dict[str, typing.Any]] = None, - json: typing.Optional[typing.Any] = None, - data: typing.Optional[typing.Any] = None, - content: typing.Optional[ - typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] - ] = None, - files: typing.Optional[ - typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]] - ] = None, - headers: typing.Optional[typing.Dict[str, typing.Any]] = None, - request_options: typing.Optional[RequestOptions] = None, - retries: int = 0, - omit: typing.Optional[typing.Any] = None, -) -> typing.AsyncIterator[httpx.Response]: ... -``` - - - -## HttpClient - -[Show source in http_client.py:153](../../../../../../../julep/api/core/http_client.py#L153) - -#### Signature - -```python -class HttpClient: - def __init__( - self, - httpx_client: httpx.Client, - base_timeout: typing.Optional[float], - base_headers: typing.Dict[str, str], - base_url: typing.Optional[str] = None, - ): ... -``` - -### HttpClient().get_base_url - -[Show source in http_client.py:167](../../../../../../../julep/api/core/http_client.py#L167) - -#### Signature - -```python -def get_base_url(self, maybe_base_url: typing.Optional[str]) -> str: ... -``` - -### HttpClient().request - -[Show source in http_client.py:175](../../../../../../../julep/api/core/http_client.py#L175) - -#### Signature - -```python -def request( - self, - path: typing.Optional[str] = None, - method: str, - base_url: typing.Optional[str] = None, - params: typing.Optional[typing.Dict[str, typing.Any]] = None, - json: typing.Optional[typing.Any] = None, - data: typing.Optional[typing.Any] = None, - content: typing.Optional[ - typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] - ] = None, - files: typing.Optional[ - typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]] - ] = None, - headers: typing.Optional[typing.Dict[str, typing.Any]] = None, - request_options: typing.Optional[RequestOptions] = None, - retries: int = 0, - omit: typing.Optional[typing.Any] = None, -) -> httpx.Response: ... -``` - -### HttpClient().stream - -[Show source in http_client.py:276](../../../../../../../julep/api/core/http_client.py#L276) - -#### Signature - -```python -@contextmanager -def stream( - self, - path: typing.Optional[str] = None, - method: str, - base_url: typing.Optional[str] = None, - params: typing.Optional[typing.Dict[str, typing.Any]] = None, - json: typing.Optional[typing.Any] = None, - data: typing.Optional[typing.Any] = None, - content: typing.Optional[ - typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] - ] = None, - files: typing.Optional[ - typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]] - ] = None, - headers: typing.Optional[typing.Dict[str, typing.Any]] = None, - request_options: typing.Optional[RequestOptions] = None, - retries: int = 0, - omit: typing.Optional[typing.Any] = None, -) -> typing.Iterator[httpx.Response]: ... -``` - - - -## _parse_retry_after - -[Show source in http_client.py:26](../../../../../../../julep/api/core/http_client.py#L26) - -This function parses the `Retry-After` header in a HTTP response and returns the number of seconds to wait. - -Inspired by the urllib3 retry implementation. - -#### Signature - -```python -def _parse_retry_after(response_headers: httpx.Headers) -> typing.Optional[float]: ... -``` - - - -## _retry_timeout - -[Show source in http_client.py:67](../../../../../../../julep/api/core/http_client.py#L67) - -Determine the amount of time to wait before retrying a request. -This function begins by trying to parse a retry-after header from the response, and then proceeds to use exponential backoff -with a jitter to determine the number of seconds to wait. - -#### Signature - -```python -def _retry_timeout(response: httpx.Response, retries: int) -> float: ... -``` - - - -## get_request_body - -[Show source in http_client.py:135](../../../../../../../julep/api/core/http_client.py#L135) - -#### Signature - -```python -def get_request_body( - json: typing.Optional[typing.Any], - data: typing.Optional[typing.Any], - request_options: typing.Optional[RequestOptions], - omit: typing.Optional[typing.Any], -) -> typing.Tuple[typing.Optional[typing.Any], typing.Optional[typing.Any]]: ... -``` - - - -## maybe_filter_request_body - -[Show source in http_client.py:107](../../../../../../../julep/api/core/http_client.py#L107) - -#### Signature - -```python -def maybe_filter_request_body( - data: typing.Optional[typing.Any], - request_options: typing.Optional[RequestOptions], - omit: typing.Optional[typing.Any], -) -> typing.Optional[typing.Any]: ... -``` - - - -## remove_omit_from_dict - -[Show source in http_client.py:94](../../../../../../../julep/api/core/http_client.py#L94) - -#### Signature - -```python -def remove_omit_from_dict( - original: typing.Dict[str, typing.Optional[typing.Any]], - omit: typing.Optional[typing.Any], -) -> typing.Dict[str, typing.Any]: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/index.md b/docs/python-sdk-docs/julep/api/core/index.md deleted file mode 100644 index 66561bb3a..000000000 --- a/docs/python-sdk-docs/julep/api/core/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# Core - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / Core - -> Auto-generated documentation for [julep.api.core](../../../../../../../julep/api/core/__init__.py) module. - -- [Core](#core) - - [Modules](#modules) - -## Modules - -- [ApiError](./api_error.md) -- [Client Wrapper](./client_wrapper.md) -- [Datetime Utils](./datetime_utils.md) -- [File](./file.md) -- [HttpClient](./http_client.md) -- [Jsonable Encoder](./jsonable_encoder.md) -- [Pydantic Utilities](./pydantic_utilities.md) -- [Query Encoder](./query_encoder.md) -- [Remove None From Dict](./remove_none_from_dict.md) -- [RequestOptions](./request_options.md) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/jsonable_encoder.md b/docs/python-sdk-docs/julep/api/core/jsonable_encoder.md deleted file mode 100644 index 0f9ec18f8..000000000 --- a/docs/python-sdk-docs/julep/api/core/jsonable_encoder.md +++ /dev/null @@ -1,35 +0,0 @@ -# Jsonable Encoder - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / Jsonable Encoder - -> Auto-generated documentation for [julep.api.core.jsonable_encoder](../../../../../../../julep/api/core/jsonable_encoder.py) module. - -- [Jsonable Encoder](#jsonable-encoder) - - [generate_encoders_by_class_tuples](#generate_encoders_by_class_tuples) - - [jsonable_encoder](#jsonable_encoder) - -## generate_encoders_by_class_tuples - -[Show source in jsonable_encoder.py:26](../../../../../../../julep/api/core/jsonable_encoder.py#L26) - -#### Signature - -```python -def generate_encoders_by_class_tuples( - type_encoder_map: Dict[Any, Callable[[Any], Any]], -) -> Dict[Callable[[Any], Any], Tuple[Any, ...]]: ... -``` - - - -## jsonable_encoder - -[Show source in jsonable_encoder.py:42](../../../../../../../julep/api/core/jsonable_encoder.py#L42) - -#### Signature - -```python -def jsonable_encoder( - obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any], Any]]] = None -) -> Any: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/pydantic_utilities.md b/docs/python-sdk-docs/julep/api/core/pydantic_utilities.md deleted file mode 100644 index 032fa4805..000000000 --- a/docs/python-sdk-docs/julep/api/core/pydantic_utilities.md +++ /dev/null @@ -1,6 +0,0 @@ -# Pydantic Utilities - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / Pydantic Utilities - -> Auto-generated documentation for [julep.api.core.pydantic_utilities](../../../../../../../julep/api/core/pydantic_utilities.py) module. -- [Pydantic Utilities](#pydantic-utilities) diff --git a/docs/python-sdk-docs/julep/api/core/query_encoder.md b/docs/python-sdk-docs/julep/api/core/query_encoder.md deleted file mode 100644 index 2c4b4f65d..000000000 --- a/docs/python-sdk-docs/julep/api/core/query_encoder.md +++ /dev/null @@ -1,46 +0,0 @@ -# Query Encoder - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / Query Encoder - -> Auto-generated documentation for [julep.api.core.query_encoder](../../../../../../../julep/api/core/query_encoder.py) module. - -- [Query Encoder](#query-encoder) - - [encode_query](#encode_query) - - [single_query_encoder](#single_query_encoder) - - [traverse_query_dict](#traverse_query_dict) - -## encode_query - -[Show source in query_encoder.py:34](../../../../../../../julep/api/core/query_encoder.py#L34) - -#### Signature - -```python -def encode_query(query: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]: ... -``` - - - -## single_query_encoder - -[Show source in query_encoder.py:23](../../../../../../../julep/api/core/query_encoder.py#L23) - -#### Signature - -```python -def single_query_encoder(query_key: str, query_value: Any) -> Dict[str, Any]: ... -``` - - - -## traverse_query_dict - -[Show source in query_encoder.py:10](../../../../../../../julep/api/core/query_encoder.py#L10) - -#### Signature - -```python -def traverse_query_dict( - dict_flat: Dict[str, Any], key_prefix: Optional[str] = None -) -> Dict[str, Any]: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/remove_none_from_dict.md b/docs/python-sdk-docs/julep/api/core/remove_none_from_dict.md deleted file mode 100644 index 532583b48..000000000 --- a/docs/python-sdk-docs/julep/api/core/remove_none_from_dict.md +++ /dev/null @@ -1,18 +0,0 @@ -# Remove None From Dict - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / Remove None From Dict - -> Auto-generated documentation for [julep.api.core.remove_none_from_dict](../../../../../../../julep/api/core/remove_none_from_dict.py) module. - -- [Remove None From Dict](#remove-none-from-dict) - - [remove_none_from_dict](#remove_none_from_dict) - -## remove_none_from_dict - -[Show source in remove_none_from_dict.py:6](../../../../../../../julep/api/core/remove_none_from_dict.py#L6) - -#### Signature - -```python -def remove_none_from_dict(original: Mapping[str, Optional[Any]]) -> Dict[str, Any]: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/core/request_options.md b/docs/python-sdk-docs/julep/api/core/request_options.md deleted file mode 100644 index cac44806f..000000000 --- a/docs/python-sdk-docs/julep/api/core/request_options.md +++ /dev/null @@ -1,33 +0,0 @@ -# RequestOptions - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Core](./index.md#core) / RequestOptions - -> Auto-generated documentation for [julep.api.core.request_options](../../../../../../../julep/api/core/request_options.py) module. - -- [RequestOptions](#requestoptions) - - [RequestOptions](#requestoptions-1) - -## RequestOptions - -[Show source in request_options.py:11](../../../../../../../julep/api/core/request_options.py#L11) - -Additional options for request-specific configuration when calling APIs via the SDK. -This is used primarily as an optional final parameter for service functions. - -#### Attributes - -- `-` *timeout_in_seconds* - int. The number of seconds to await an API call before timing out. - -- `-` *max_retries* - int. The max number of retries to attempt if the API call fails. - -- `-` *additional_headers* - typing.Dict[str, typing.Any]. A dictionary containing additional parameters to spread into the request's header dict - -- `-` *additional_query_parameters* - typing.Dict[str, typing.Any]. A dictionary containing additional parameters to spread into the request's query parameters dict - -- `-` *additional_body_parameters* - typing.Dict[str, typing.Any]. A dictionary containing additional parameters to spread into the request's body parameters dict - -#### Signature - -```python -class RequestOptions(typing.TypedDict): ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/environment.md b/docs/python-sdk-docs/julep/api/environment.md deleted file mode 100644 index d10e1aa22..000000000 --- a/docs/python-sdk-docs/julep/api/environment.md +++ /dev/null @@ -1,18 +0,0 @@ -# Environment - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Julep Python Library](./index.md#julep-python-library) / Environment - -> Auto-generated documentation for [julep.api.environment](../../../../../../julep/api/environment.py) module. - -- [Environment](#environment) - - [JulepApiEnvironment](#julepapienvironment) - -## JulepApiEnvironment - -[Show source in environment.py:6](../../../../../../julep/api/environment.py#L6) - -#### Signature - -```python -class JulepApiEnvironment(enum.Enum): ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/index.md b/docs/python-sdk-docs/julep/api/index.md deleted file mode 100644 index f943d9357..000000000 --- a/docs/python-sdk-docs/julep/api/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Julep Python Library - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / Julep Python Library - -> Auto-generated documentation for [julep.api](../../../../../../julep/api/__init__.py) module. - -- [Julep Python Library](#julep-python-library) - - [Modules](#modules) - -## Modules - -- [Client](./client.md) -- [Core](core/index.md) -- [Environment](./environment.md) -- [Types](types/index.md) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_direction.md deleted file mode 100644 index 6073fd184..000000000 --- a/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agent Docs Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agent Docs Route List Request Direction - -> Auto-generated documentation for [julep.api.types.agent_docs_route_list_request_direction](../../../../../../../julep/api/types/agent_docs_route_list_request_direction.py) module. -- [Agent Docs Route List Request Direction](#agent-docs-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_sort_by.md deleted file mode 100644 index 5c28c8198..000000000 --- a/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agent Docs Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agent Docs Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.agent_docs_route_list_request_sort_by](../../../../../../../julep/api/types/agent_docs_route_list_request_sort_by.py) module. -- [Agent Docs Route List Request Sort By](#agent-docs-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_response.md b/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_response.md deleted file mode 100644 index 07b9352e5..000000000 --- a/docs/python-sdk-docs/julep/api/types/agent_docs_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# AgentDocsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentDocsRouteListResponse - -> Auto-generated documentation for [julep.api.types.agent_docs_route_list_response](../../../../../../../julep/api/types/agent_docs_route_list_response.py) module. - -- [AgentDocsRouteListResponse](#agentdocsroutelistresponse) - - [AgentDocsRouteListResponse](#agentdocsroutelistresponse-1) - -## AgentDocsRouteListResponse - -[Show source in agent_docs_route_list_response.py:11](../../../../../../../julep/api/types/agent_docs_route_list_response.py#L11) - -#### Signature - -```python -class AgentDocsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### AgentDocsRouteListResponse().dict - -[Show source in agent_docs_route_list_response.py:22](../../../../../../../julep/api/types/agent_docs_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentDocsRouteListResponse().json - -[Show source in agent_docs_route_list_response.py:14](../../../../../../../julep/api/types/agent_docs_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_direction.md deleted file mode 100644 index 6a9f1e4c2..000000000 --- a/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agent Tools Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agent Tools Route List Request Direction - -> Auto-generated documentation for [julep.api.types.agent_tools_route_list_request_direction](../../../../../../../julep/api/types/agent_tools_route_list_request_direction.py) module. -- [Agent Tools Route List Request Direction](#agent-tools-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_sort_by.md deleted file mode 100644 index f8ce5d292..000000000 --- a/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agent Tools Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agent Tools Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.agent_tools_route_list_request_sort_by](../../../../../../../julep/api/types/agent_tools_route_list_request_sort_by.py) module. -- [Agent Tools Route List Request Sort By](#agent-tools-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_response.md b/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_response.md deleted file mode 100644 index 49377b911..000000000 --- a/docs/python-sdk-docs/julep/api/types/agent_tools_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# AgentToolsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentToolsRouteListResponse - -> Auto-generated documentation for [julep.api.types.agent_tools_route_list_response](../../../../../../../julep/api/types/agent_tools_route_list_response.py) module. - -- [AgentToolsRouteListResponse](#agenttoolsroutelistresponse) - - [AgentToolsRouteListResponse](#agenttoolsroutelistresponse-1) - -## AgentToolsRouteListResponse - -[Show source in agent_tools_route_list_response.py:11](../../../../../../../julep/api/types/agent_tools_route_list_response.py#L11) - -#### Signature - -```python -class AgentToolsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### AgentToolsRouteListResponse().dict - -[Show source in agent_tools_route_list_response.py:22](../../../../../../../julep/api/types/agent_tools_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentToolsRouteListResponse().json - -[Show source in agent_tools_route_list_response.py:14](../../../../../../../julep/api/types/agent_tools_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agents_agent.md b/docs/python-sdk-docs/julep/api/types/agents_agent.md deleted file mode 100644 index 0e1b52be6..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_agent.md +++ /dev/null @@ -1,38 +0,0 @@ -# AgentsAgent - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentsAgent - -> Auto-generated documentation for [julep.api.types.agents_agent](../../../../../../../julep/api/types/agents_agent.py) module. - -- [AgentsAgent](#agentsagent) - - [AgentsAgent](#agentsagent-1) - -## AgentsAgent - -[Show source in agents_agent.py:14](../../../../../../../julep/api/types/agents_agent.py#L14) - -#### Signature - -```python -class AgentsAgent(pydantic_v1.BaseModel): ... -``` - -### AgentsAgent().dict - -[Show source in agents_agent.py:62](../../../../../../../julep/api/types/agents_agent.py#L62) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentsAgent().json - -[Show source in agents_agent.py:54](../../../../../../../julep/api/types/agents_agent.py#L54) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agents_agent_instructions.md b/docs/python-sdk-docs/julep/api/types/agents_agent_instructions.md deleted file mode 100644 index fde3264fe..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_agent_instructions.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Agent Instructions - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Agent Instructions - -> Auto-generated documentation for [julep.api.types.agents_agent_instructions](../../../../../../../julep/api/types/agents_agent_instructions.py) module. -- [Agents Agent Instructions](#agents-agent-instructions) diff --git a/docs/python-sdk-docs/julep/api/types/agents_create_agent_request.md b/docs/python-sdk-docs/julep/api/types/agents_create_agent_request.md deleted file mode 100644 index 0102d2005..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_create_agent_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# AgentsCreateAgentRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentsCreateAgentRequest - -> Auto-generated documentation for [julep.api.types.agents_create_agent_request](../../../../../../../julep/api/types/agents_create_agent_request.py) module. - -- [AgentsCreateAgentRequest](#agentscreateagentrequest) - - [AgentsCreateAgentRequest](#agentscreateagentrequest-1) - -## AgentsCreateAgentRequest - -[Show source in agents_create_agent_request.py:15](../../../../../../../julep/api/types/agents_create_agent_request.py#L15) - -Payload for creating a agent (and associated documents) - -#### Signature - -```python -class AgentsCreateAgentRequest(pydantic_v1.BaseModel): ... -``` - -### AgentsCreateAgentRequest().dict - -[Show source in agents_create_agent_request.py:56](../../../../../../../julep/api/types/agents_create_agent_request.py#L56) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentsCreateAgentRequest().json - -[Show source in agents_create_agent_request.py:48](../../../../../../../julep/api/types/agents_create_agent_request.py#L48) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agents_create_agent_request_instructions.md b/docs/python-sdk-docs/julep/api/types/agents_create_agent_request_instructions.md deleted file mode 100644 index 3b7d98899..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_create_agent_request_instructions.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Create Agent Request Instructions - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Create Agent Request Instructions - -> Auto-generated documentation for [julep.api.types.agents_create_agent_request_instructions](../../../../../../../julep/api/types/agents_create_agent_request_instructions.py) module. -- [Agents Create Agent Request Instructions](#agents-create-agent-request-instructions) diff --git a/docs/python-sdk-docs/julep/api/types/agents_create_or_update_agent_request.md b/docs/python-sdk-docs/julep/api/types/agents_create_or_update_agent_request.md deleted file mode 100644 index e13f3c7e3..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_create_or_update_agent_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# AgentsCreateOrUpdateAgentRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentsCreateOrUpdateAgentRequest - -> Auto-generated documentation for [julep.api.types.agents_create_or_update_agent_request](../../../../../../../julep/api/types/agents_create_or_update_agent_request.py) module. - -- [AgentsCreateOrUpdateAgentRequest](#agentscreateorupdateagentrequest) - - [AgentsCreateOrUpdateAgentRequest](#agentscreateorupdateagentrequest-1) - -## AgentsCreateOrUpdateAgentRequest - -[Show source in agents_create_or_update_agent_request.py:16](../../../../../../../julep/api/types/agents_create_or_update_agent_request.py#L16) - -#### Signature - -```python -class AgentsCreateOrUpdateAgentRequest(pydantic_v1.BaseModel): ... -``` - -### AgentsCreateOrUpdateAgentRequest().dict - -[Show source in agents_create_or_update_agent_request.py:54](../../../../../../../julep/api/types/agents_create_or_update_agent_request.py#L54) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentsCreateOrUpdateAgentRequest().json - -[Show source in agents_create_or_update_agent_request.py:46](../../../../../../../julep/api/types/agents_create_or_update_agent_request.py#L46) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agents_docs_search_route_search_request_body.md b/docs/python-sdk-docs/julep/api/types/agents_docs_search_route_search_request_body.md deleted file mode 100644 index bb7c047be..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_docs_search_route_search_request_body.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Docs Search Route Search Request Body - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Docs Search Route Search Request Body - -> Auto-generated documentation for [julep.api.types.agents_docs_search_route_search_request_body](../../../../../../../julep/api/types/agents_docs_search_route_search_request_body.py) module. -- [Agents Docs Search Route Search Request Body](#agents-docs-search-route-search-request-body) diff --git a/docs/python-sdk-docs/julep/api/types/agents_patch_agent_request_instructions.md b/docs/python-sdk-docs/julep/api/types/agents_patch_agent_request_instructions.md deleted file mode 100644 index d05f16482..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_patch_agent_request_instructions.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Patch Agent Request Instructions - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Patch Agent Request Instructions - -> Auto-generated documentation for [julep.api.types.agents_patch_agent_request_instructions](../../../../../../../julep/api/types/agents_patch_agent_request_instructions.py) module. -- [Agents Patch Agent Request Instructions](#agents-patch-agent-request-instructions) diff --git a/docs/python-sdk-docs/julep/api/types/agents_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/agents_route_list_request_direction.md deleted file mode 100644 index c723dd549..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Route List Request Direction - -> Auto-generated documentation for [julep.api.types.agents_route_list_request_direction](../../../../../../../julep/api/types/agents_route_list_request_direction.py) module. -- [Agents Route List Request Direction](#agents-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/agents_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/agents_route_list_request_sort_by.md deleted file mode 100644 index dae7a82ba..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.agents_route_list_request_sort_by](../../../../../../../julep/api/types/agents_route_list_request_sort_by.py) module. -- [Agents Route List Request Sort By](#agents-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/agents_route_list_response.md b/docs/python-sdk-docs/julep/api/types/agents_route_list_response.md deleted file mode 100644 index cbe615c1e..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# AgentsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentsRouteListResponse - -> Auto-generated documentation for [julep.api.types.agents_route_list_response](../../../../../../../julep/api/types/agents_route_list_response.py) module. - -- [AgentsRouteListResponse](#agentsroutelistresponse) - - [AgentsRouteListResponse](#agentsroutelistresponse-1) - -## AgentsRouteListResponse - -[Show source in agents_route_list_response.py:11](../../../../../../../julep/api/types/agents_route_list_response.py#L11) - -#### Signature - -```python -class AgentsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### AgentsRouteListResponse().dict - -[Show source in agents_route_list_response.py:22](../../../../../../../julep/api/types/agents_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentsRouteListResponse().json - -[Show source in agents_route_list_response.py:14](../../../../../../../julep/api/types/agents_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agents_update_agent_request.md b/docs/python-sdk-docs/julep/api/types/agents_update_agent_request.md deleted file mode 100644 index 8f906f097..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_update_agent_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# AgentsUpdateAgentRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / AgentsUpdateAgentRequest - -> Auto-generated documentation for [julep.api.types.agents_update_agent_request](../../../../../../../julep/api/types/agents_update_agent_request.py) module. - -- [AgentsUpdateAgentRequest](#agentsupdateagentrequest) - - [AgentsUpdateAgentRequest](#agentsupdateagentrequest-1) - -## AgentsUpdateAgentRequest - -[Show source in agents_update_agent_request.py:15](../../../../../../../julep/api/types/agents_update_agent_request.py#L15) - -Payload for updating a agent - -#### Signature - -```python -class AgentsUpdateAgentRequest(pydantic_v1.BaseModel): ... -``` - -### AgentsUpdateAgentRequest().dict - -[Show source in agents_update_agent_request.py:56](../../../../../../../julep/api/types/agents_update_agent_request.py#L56) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### AgentsUpdateAgentRequest().json - -[Show source in agents_update_agent_request.py:48](../../../../../../../julep/api/types/agents_update_agent_request.py#L48) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/agents_update_agent_request_instructions.md b/docs/python-sdk-docs/julep/api/types/agents_update_agent_request_instructions.md deleted file mode 100644 index a2a61914f..000000000 --- a/docs/python-sdk-docs/julep/api/types/agents_update_agent_request_instructions.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agents Update Agent Request Instructions - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Agents Update Agent Request Instructions - -> Auto-generated documentation for [julep.api.types.agents_update_agent_request_instructions](../../../../../../../julep/api/types/agents_update_agent_request_instructions.py) module. -- [Agents Update Agent Request Instructions](#agents-update-agent-request-instructions) diff --git a/docs/python-sdk-docs/julep/api/types/chat_base_chat_output.md b/docs/python-sdk-docs/julep/api/types/chat_base_chat_output.md deleted file mode 100644 index 4f6fde8bc..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_base_chat_output.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatBaseChatOutput - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatBaseChatOutput - -> Auto-generated documentation for [julep.api.types.chat_base_chat_output](../../../../../../../julep/api/types/chat_base_chat_output.py) module. - -- [ChatBaseChatOutput](#chatbasechatoutput) - - [ChatBaseChatOutput](#chatbasechatoutput-1) - -## ChatBaseChatOutput - -[Show source in chat_base_chat_output.py:12](../../../../../../../julep/api/types/chat_base_chat_output.py#L12) - -#### Signature - -```python -class ChatBaseChatOutput(pydantic_v1.BaseModel): ... -``` - -### ChatBaseChatOutput().dict - -[Show source in chat_base_chat_output.py:32](../../../../../../../julep/api/types/chat_base_chat_output.py#L32) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatBaseChatOutput().json - -[Show source in chat_base_chat_output.py:24](../../../../../../../julep/api/types/chat_base_chat_output.py#L24) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_base_chat_response.md b/docs/python-sdk-docs/julep/api/types/chat_base_chat_response.md deleted file mode 100644 index 9eef6113b..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_base_chat_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatBaseChatResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatBaseChatResponse - -> Auto-generated documentation for [julep.api.types.chat_base_chat_response](../../../../../../../julep/api/types/chat_base_chat_response.py) module. - -- [ChatBaseChatResponse](#chatbasechatresponse) - - [ChatBaseChatResponse](#chatbasechatresponse-1) - -## ChatBaseChatResponse - -[Show source in chat_base_chat_response.py:13](../../../../../../../julep/api/types/chat_base_chat_response.py#L13) - -#### Signature - -```python -class ChatBaseChatResponse(pydantic_v1.BaseModel): ... -``` - -### ChatBaseChatResponse().dict - -[Show source in chat_base_chat_response.py:44](../../../../../../../julep/api/types/chat_base_chat_response.py#L44) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatBaseChatResponse().json - -[Show source in chat_base_chat_response.py:36](../../../../../../../julep/api/types/chat_base_chat_response.py#L36) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_base_token_log_prob.md b/docs/python-sdk-docs/julep/api/types/chat_base_token_log_prob.md deleted file mode 100644 index 02074dd4e..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_base_token_log_prob.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatBaseTokenLogProb - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatBaseTokenLogProb - -> Auto-generated documentation for [julep.api.types.chat_base_token_log_prob](../../../../../../../julep/api/types/chat_base_token_log_prob.py) module. - -- [ChatBaseTokenLogProb](#chatbasetokenlogprob) - - [ChatBaseTokenLogProb](#chatbasetokenlogprob-1) - -## ChatBaseTokenLogProb - -[Show source in chat_base_token_log_prob.py:10](../../../../../../../julep/api/types/chat_base_token_log_prob.py#L10) - -#### Signature - -```python -class ChatBaseTokenLogProb(pydantic_v1.BaseModel): ... -``` - -### ChatBaseTokenLogProb().dict - -[Show source in chat_base_token_log_prob.py:27](../../../../../../../julep/api/types/chat_base_token_log_prob.py#L27) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatBaseTokenLogProb().json - -[Show source in chat_base_token_log_prob.py:19](../../../../../../../julep/api/types/chat_base_token_log_prob.py#L19) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_chat_input_data.md b/docs/python-sdk-docs/julep/api/types/chat_chat_input_data.md deleted file mode 100644 index a830d7fa5..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_chat_input_data.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatChatInputData - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatChatInputData - -> Auto-generated documentation for [julep.api.types.chat_chat_input_data](../../../../../../../julep/api/types/chat_chat_input_data.py) module. - -- [ChatChatInputData](#chatchatinputdata) - - [ChatChatInputData](#chatchatinputdata-1) - -## ChatChatInputData - -[Show source in chat_chat_input_data.py:13](../../../../../../../julep/api/types/chat_chat_input_data.py#L13) - -#### Signature - -```python -class ChatChatInputData(pydantic_v1.BaseModel): ... -``` - -### ChatChatInputData().dict - -[Show source in chat_chat_input_data.py:41](../../../../../../../julep/api/types/chat_chat_input_data.py#L41) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatChatInputData().json - -[Show source in chat_chat_input_data.py:33](../../../../../../../julep/api/types/chat_chat_input_data.py#L33) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_chat_input_data_tool_choice.md b/docs/python-sdk-docs/julep/api/types/chat_chat_input_data_tool_choice.md deleted file mode 100644 index 819c98d14..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_chat_input_data_tool_choice.md +++ /dev/null @@ -1,6 +0,0 @@ -# Chat Chat Input Data Tool Choice - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Chat Chat Input Data Tool Choice - -> Auto-generated documentation for [julep.api.types.chat_chat_input_data_tool_choice](../../../../../../../julep/api/types/chat_chat_input_data_tool_choice.py) module. -- [Chat Chat Input Data Tool Choice](#chat-chat-input-data-tool-choice) diff --git a/docs/python-sdk-docs/julep/api/types/chat_chat_output_chunk.md b/docs/python-sdk-docs/julep/api/types/chat_chat_output_chunk.md deleted file mode 100644 index 25f16b4ba..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_chat_output_chunk.md +++ /dev/null @@ -1,40 +0,0 @@ -# ChatChatOutputChunk - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatChatOutputChunk - -> Auto-generated documentation for [julep.api.types.chat_chat_output_chunk](../../../../../../../julep/api/types/chat_chat_output_chunk.py) module. - -- [ChatChatOutputChunk](#chatchatoutputchunk) - - [ChatChatOutputChunk](#chatchatoutputchunk-1) - -## ChatChatOutputChunk - -[Show source in chat_chat_output_chunk.py:12](../../../../../../../julep/api/types/chat_chat_output_chunk.py#L12) - -Streaming chat completion output - -#### Signature - -```python -class ChatChatOutputChunk(ChatBaseChatOutput): ... -``` - -### ChatChatOutputChunk().dict - -[Show source in chat_chat_output_chunk.py:30](../../../../../../../julep/api/types/chat_chat_output_chunk.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatChatOutputChunk().json - -[Show source in chat_chat_output_chunk.py:22](../../../../../../../julep/api/types/chat_chat_output_chunk.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_chat_settings.md b/docs/python-sdk-docs/julep/api/types/chat_chat_settings.md deleted file mode 100644 index af2b74943..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_chat_settings.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatChatSettings - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatChatSettings - -> Auto-generated documentation for [julep.api.types.chat_chat_settings](../../../../../../../julep/api/types/chat_chat_settings.py) module. - -- [ChatChatSettings](#chatchatsettings) - - [ChatChatSettings](#chatchatsettings-1) - -## ChatChatSettings - -[Show source in chat_chat_settings.py:15](../../../../../../../julep/api/types/chat_chat_settings.py#L15) - -#### Signature - -```python -class ChatChatSettings(ChatDefaultChatSettings): ... -``` - -### ChatChatSettings().dict - -[Show source in chat_chat_settings.py:70](../../../../../../../julep/api/types/chat_chat_settings.py#L70) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatChatSettings().json - -[Show source in chat_chat_settings.py:62](../../../../../../../julep/api/types/chat_chat_settings.py#L62) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_chunk_chat_response.md b/docs/python-sdk-docs/julep/api/types/chat_chunk_chat_response.md deleted file mode 100644 index 2ec411b53..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_chunk_chat_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatChunkChatResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatChunkChatResponse - -> Auto-generated documentation for [julep.api.types.chat_chunk_chat_response](../../../../../../../julep/api/types/chat_chunk_chat_response.py) module. - -- [ChatChunkChatResponse](#chatchunkchatresponse) - - [ChatChunkChatResponse](#chatchunkchatresponse-1) - -## ChatChunkChatResponse - -[Show source in chat_chunk_chat_response.py:12](../../../../../../../julep/api/types/chat_chunk_chat_response.py#L12) - -#### Signature - -```python -class ChatChunkChatResponse(ChatBaseChatResponse): ... -``` - -### ChatChunkChatResponse().dict - -[Show source in chat_chunk_chat_response.py:26](../../../../../../../julep/api/types/chat_chunk_chat_response.py#L26) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatChunkChatResponse().json - -[Show source in chat_chunk_chat_response.py:18](../../../../../../../julep/api/types/chat_chunk_chat_response.py#L18) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_competion_usage.md b/docs/python-sdk-docs/julep/api/types/chat_competion_usage.md deleted file mode 100644 index 8c55bb12c..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_competion_usage.md +++ /dev/null @@ -1,40 +0,0 @@ -# ChatCompetionUsage - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatCompetionUsage - -> Auto-generated documentation for [julep.api.types.chat_competion_usage](../../../../../../../julep/api/types/chat_competion_usage.py) module. - -- [ChatCompetionUsage](#chatcompetionusage) - - [ChatCompetionUsage](#chatcompetionusage-1) - -## ChatCompetionUsage - -[Show source in chat_competion_usage.py:10](../../../../../../../julep/api/types/chat_competion_usage.py#L10) - -Usage statistics for the completion request - -#### Signature - -```python -class ChatCompetionUsage(pydantic_v1.BaseModel): ... -``` - -### ChatCompetionUsage().dict - -[Show source in chat_competion_usage.py:38](../../../../../../../julep/api/types/chat_competion_usage.py#L38) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatCompetionUsage().json - -[Show source in chat_competion_usage.py:30](../../../../../../../julep/api/types/chat_competion_usage.py#L30) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_completion_response_format.md b/docs/python-sdk-docs/julep/api/types/chat_completion_response_format.md deleted file mode 100644 index c18aab307..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_completion_response_format.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatCompletionResponseFormat - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatCompletionResponseFormat - -> Auto-generated documentation for [julep.api.types.chat_completion_response_format](../../../../../../../julep/api/types/chat_completion_response_format.py) module. - -- [ChatCompletionResponseFormat](#chatcompletionresponseformat) - - [ChatCompletionResponseFormat](#chatcompletionresponseformat-1) - -## ChatCompletionResponseFormat - -[Show source in chat_completion_response_format.py:11](../../../../../../../julep/api/types/chat_completion_response_format.py#L11) - -#### Signature - -```python -class ChatCompletionResponseFormat(pydantic_v1.BaseModel): ... -``` - -### ChatCompletionResponseFormat().dict - -[Show source in chat_completion_response_format.py:25](../../../../../../../julep/api/types/chat_completion_response_format.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatCompletionResponseFormat().json - -[Show source in chat_completion_response_format.py:17](../../../../../../../julep/api/types/chat_completion_response_format.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_completion_response_format_type.md b/docs/python-sdk-docs/julep/api/types/chat_completion_response_format_type.md deleted file mode 100644 index 0630b2d84..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_completion_response_format_type.md +++ /dev/null @@ -1,6 +0,0 @@ -# Chat Completion Response Format Type - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Chat Completion Response Format Type - -> Auto-generated documentation for [julep.api.types.chat_completion_response_format_type](../../../../../../../julep/api/types/chat_completion_response_format_type.py) module. -- [Chat Completion Response Format Type](#chat-completion-response-format-type) diff --git a/docs/python-sdk-docs/julep/api/types/chat_default_chat_settings.md b/docs/python-sdk-docs/julep/api/types/chat_default_chat_settings.md deleted file mode 100644 index 5905defde..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_default_chat_settings.md +++ /dev/null @@ -1,40 +0,0 @@ -# ChatDefaultChatSettings - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatDefaultChatSettings - -> Auto-generated documentation for [julep.api.types.chat_default_chat_settings](../../../../../../../julep/api/types/chat_default_chat_settings.py) module. - -- [ChatDefaultChatSettings](#chatdefaultchatsettings) - - [ChatDefaultChatSettings](#chatdefaultchatsettings-1) - -## ChatDefaultChatSettings - -[Show source in chat_default_chat_settings.py:11](../../../../../../../julep/api/types/chat_default_chat_settings.py#L11) - -Default settings for the chat session (also used by the agent) - -#### Signature - -```python -class ChatDefaultChatSettings(ChatOpenAiSettings): ... -``` - -### ChatDefaultChatSettings().dict - -[Show source in chat_default_chat_settings.py:39](../../../../../../../julep/api/types/chat_default_chat_settings.py#L39) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatDefaultChatSettings().json - -[Show source in chat_default_chat_settings.py:31](../../../../../../../julep/api/types/chat_default_chat_settings.py#L31) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_finish_reason.md b/docs/python-sdk-docs/julep/api/types/chat_finish_reason.md deleted file mode 100644 index b01a1c85e..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_finish_reason.md +++ /dev/null @@ -1,6 +0,0 @@ -# Chat Finish Reason - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Chat Finish Reason - -> Auto-generated documentation for [julep.api.types.chat_finish_reason](../../../../../../../julep/api/types/chat_finish_reason.py) module. -- [Chat Finish Reason](#chat-finish-reason) diff --git a/docs/python-sdk-docs/julep/api/types/chat_log_prob_response.md b/docs/python-sdk-docs/julep/api/types/chat_log_prob_response.md deleted file mode 100644 index 3b72f98c7..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_log_prob_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatLogProbResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatLogProbResponse - -> Auto-generated documentation for [julep.api.types.chat_log_prob_response](../../../../../../../julep/api/types/chat_log_prob_response.py) module. - -- [ChatLogProbResponse](#chatlogprobresponse) - - [ChatLogProbResponse](#chatlogprobresponse-1) - -## ChatLogProbResponse - -[Show source in chat_log_prob_response.py:11](../../../../../../../julep/api/types/chat_log_prob_response.py#L11) - -#### Signature - -```python -class ChatLogProbResponse(pydantic_v1.BaseModel): ... -``` - -### ChatLogProbResponse().dict - -[Show source in chat_log_prob_response.py:27](../../../../../../../julep/api/types/chat_log_prob_response.py#L27) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatLogProbResponse().json - -[Show source in chat_log_prob_response.py:19](../../../../../../../julep/api/types/chat_log_prob_response.py#L19) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_message_chat_response.md b/docs/python-sdk-docs/julep/api/types/chat_message_chat_response.md deleted file mode 100644 index 361a12782..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_message_chat_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatMessageChatResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatMessageChatResponse - -> Auto-generated documentation for [julep.api.types.chat_message_chat_response](../../../../../../../julep/api/types/chat_message_chat_response.py) module. - -- [ChatMessageChatResponse](#chatmessagechatresponse) - - [ChatMessageChatResponse](#chatmessagechatresponse-1) - -## ChatMessageChatResponse - -[Show source in chat_message_chat_response.py:12](../../../../../../../julep/api/types/chat_message_chat_response.py#L12) - -#### Signature - -```python -class ChatMessageChatResponse(ChatBaseChatResponse): ... -``` - -### ChatMessageChatResponse().dict - -[Show source in chat_message_chat_response.py:26](../../../../../../../julep/api/types/chat_message_chat_response.py#L26) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatMessageChatResponse().json - -[Show source in chat_message_chat_response.py:18](../../../../../../../julep/api/types/chat_message_chat_response.py#L18) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_message_chat_response_choices_item.md b/docs/python-sdk-docs/julep/api/types/chat_message_chat_response_choices_item.md deleted file mode 100644 index 8cdf93ded..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_message_chat_response_choices_item.md +++ /dev/null @@ -1,6 +0,0 @@ -# Chat Message Chat Response Choices Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Chat Message Chat Response Choices Item - -> Auto-generated documentation for [julep.api.types.chat_message_chat_response_choices_item](../../../../../../../julep/api/types/chat_message_chat_response_choices_item.py) module. -- [Chat Message Chat Response Choices Item](#chat-message-chat-response-choices-item) diff --git a/docs/python-sdk-docs/julep/api/types/chat_multiple_chat_output.md b/docs/python-sdk-docs/julep/api/types/chat_multiple_chat_output.md deleted file mode 100644 index e6e1502ba..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_multiple_chat_output.md +++ /dev/null @@ -1,40 +0,0 @@ -# ChatMultipleChatOutput - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatMultipleChatOutput - -> Auto-generated documentation for [julep.api.types.chat_multiple_chat_output](../../../../../../../julep/api/types/chat_multiple_chat_output.py) module. - -- [ChatMultipleChatOutput](#chatmultiplechatoutput) - - [ChatMultipleChatOutput](#chatmultiplechatoutput-1) - -## ChatMultipleChatOutput - -[Show source in chat_multiple_chat_output.py:12](../../../../../../../julep/api/types/chat_multiple_chat_output.py#L12) - -The output returned by the model. Note that, depending on the model provider, they might return more than one message. - -#### Signature - -```python -class ChatMultipleChatOutput(ChatBaseChatOutput): ... -``` - -### ChatMultipleChatOutput().dict - -[Show source in chat_multiple_chat_output.py:27](../../../../../../../julep/api/types/chat_multiple_chat_output.py#L27) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatMultipleChatOutput().json - -[Show source in chat_multiple_chat_output.py:19](../../../../../../../julep/api/types/chat_multiple_chat_output.py#L19) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_open_ai_settings.md b/docs/python-sdk-docs/julep/api/types/chat_open_ai_settings.md deleted file mode 100644 index d04291d75..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_open_ai_settings.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatOpenAiSettings - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatOpenAiSettings - -> Auto-generated documentation for [julep.api.types.chat_open_ai_settings](../../../../../../../julep/api/types/chat_open_ai_settings.py) module. - -- [ChatOpenAiSettings](#chatopenaisettings) - - [ChatOpenAiSettings](#chatopenaisettings-1) - -## ChatOpenAiSettings - -[Show source in chat_open_ai_settings.py:10](../../../../../../../julep/api/types/chat_open_ai_settings.py#L10) - -#### Signature - -```python -class ChatOpenAiSettings(pydantic_v1.BaseModel): ... -``` - -### ChatOpenAiSettings().dict - -[Show source in chat_open_ai_settings.py:39](../../../../../../../julep/api/types/chat_open_ai_settings.py#L39) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatOpenAiSettings().json - -[Show source in chat_open_ai_settings.py:31](../../../../../../../julep/api/types/chat_open_ai_settings.py#L31) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_route_generate_response.md b/docs/python-sdk-docs/julep/api/types/chat_route_generate_response.md deleted file mode 100644 index 947f8c61e..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_route_generate_response.md +++ /dev/null @@ -1,6 +0,0 @@ -# Chat Route Generate Response - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Chat Route Generate Response - -> Auto-generated documentation for [julep.api.types.chat_route_generate_response](../../../../../../../julep/api/types/chat_route_generate_response.py) module. -- [Chat Route Generate Response](#chat-route-generate-response) diff --git a/docs/python-sdk-docs/julep/api/types/chat_single_chat_output.md b/docs/python-sdk-docs/julep/api/types/chat_single_chat_output.md deleted file mode 100644 index dac22a9c6..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_single_chat_output.md +++ /dev/null @@ -1,40 +0,0 @@ -# ChatSingleChatOutput - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatSingleChatOutput - -> Auto-generated documentation for [julep.api.types.chat_single_chat_output](../../../../../../../julep/api/types/chat_single_chat_output.py) module. - -- [ChatSingleChatOutput](#chatsinglechatoutput) - - [ChatSingleChatOutput](#chatsinglechatoutput-1) - -## ChatSingleChatOutput - -[Show source in chat_single_chat_output.py:12](../../../../../../../julep/api/types/chat_single_chat_output.py#L12) - -The output returned by the model. Note that, depending on the model provider, they might return more than one message. - -#### Signature - -```python -class ChatSingleChatOutput(ChatBaseChatOutput): ... -``` - -### ChatSingleChatOutput().dict - -[Show source in chat_single_chat_output.py:27](../../../../../../../julep/api/types/chat_single_chat_output.py#L27) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatSingleChatOutput().json - -[Show source in chat_single_chat_output.py:19](../../../../../../../julep/api/types/chat_single_chat_output.py#L19) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/chat_token_log_prob.md b/docs/python-sdk-docs/julep/api/types/chat_token_log_prob.md deleted file mode 100644 index d4a37cd47..000000000 --- a/docs/python-sdk-docs/julep/api/types/chat_token_log_prob.md +++ /dev/null @@ -1,38 +0,0 @@ -# ChatTokenLogProb - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ChatTokenLogProb - -> Auto-generated documentation for [julep.api.types.chat_token_log_prob](../../../../../../../julep/api/types/chat_token_log_prob.py) module. - -- [ChatTokenLogProb](#chattokenlogprob) - - [ChatTokenLogProb](#chattokenlogprob-1) - -## ChatTokenLogProb - -[Show source in chat_token_log_prob.py:11](../../../../../../../julep/api/types/chat_token_log_prob.py#L11) - -#### Signature - -```python -class ChatTokenLogProb(ChatBaseTokenLogProb): ... -``` - -### ChatTokenLogProb().dict - -[Show source in chat_token_log_prob.py:22](../../../../../../../julep/api/types/chat_token_log_prob.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ChatTokenLogProb().json - -[Show source in chat_token_log_prob.py:14](../../../../../../../julep/api/types/chat_token_log_prob.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/common_identifier_safe_unicode.md b/docs/python-sdk-docs/julep/api/types/common_identifier_safe_unicode.md deleted file mode 100644 index 4c4999309..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_identifier_safe_unicode.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Identifier Safe Unicode - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Identifier Safe Unicode - -> Auto-generated documentation for [julep.api.types.common_identifier_safe_unicode](../../../../../../../julep/api/types/common_identifier_safe_unicode.py) module. -- [Common Identifier Safe Unicode](#common-identifier-safe-unicode) diff --git a/docs/python-sdk-docs/julep/api/types/common_limit.md b/docs/python-sdk-docs/julep/api/types/common_limit.md deleted file mode 100644 index df209cd76..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_limit.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Limit - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Limit - -> Auto-generated documentation for [julep.api.types.common_limit](../../../../../../../julep/api/types/common_limit.py) module. -- [Common Limit](#common-limit) diff --git a/docs/python-sdk-docs/julep/api/types/common_logit_bias.md b/docs/python-sdk-docs/julep/api/types/common_logit_bias.md deleted file mode 100644 index ebdfac95c..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_logit_bias.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Logit Bias - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Logit Bias - -> Auto-generated documentation for [julep.api.types.common_logit_bias](../../../../../../../julep/api/types/common_logit_bias.py) module. -- [Common Logit Bias](#common-logit-bias) diff --git a/docs/python-sdk-docs/julep/api/types/common_offset.md b/docs/python-sdk-docs/julep/api/types/common_offset.md deleted file mode 100644 index 1cda9e94c..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_offset.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Offset - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Offset - -> Auto-generated documentation for [julep.api.types.common_offset](../../../../../../../julep/api/types/common_offset.py) module. -- [Common Offset](#common-offset) diff --git a/docs/python-sdk-docs/julep/api/types/common_py_expression.md b/docs/python-sdk-docs/julep/api/types/common_py_expression.md deleted file mode 100644 index 857f14bb7..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_py_expression.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Py Expression - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Py Expression - -> Auto-generated documentation for [julep.api.types.common_py_expression](../../../../../../../julep/api/types/common_py_expression.py) module. -- [Common Py Expression](#common-py-expression) diff --git a/docs/python-sdk-docs/julep/api/types/common_resource_created_response.md b/docs/python-sdk-docs/julep/api/types/common_resource_created_response.md deleted file mode 100644 index 888c00989..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_resource_created_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# CommonResourceCreatedResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / CommonResourceCreatedResponse - -> Auto-generated documentation for [julep.api.types.common_resource_created_response](../../../../../../../julep/api/types/common_resource_created_response.py) module. - -- [CommonResourceCreatedResponse](#commonresourcecreatedresponse) - - [CommonResourceCreatedResponse](#commonresourcecreatedresponse-1) - -## CommonResourceCreatedResponse - -[Show source in common_resource_created_response.py:11](../../../../../../../julep/api/types/common_resource_created_response.py#L11) - -#### Signature - -```python -class CommonResourceCreatedResponse(pydantic_v1.BaseModel): ... -``` - -### CommonResourceCreatedResponse().dict - -[Show source in common_resource_created_response.py:35](../../../../../../../julep/api/types/common_resource_created_response.py#L35) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### CommonResourceCreatedResponse().json - -[Show source in common_resource_created_response.py:27](../../../../../../../julep/api/types/common_resource_created_response.py#L27) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/common_resource_deleted_response.md b/docs/python-sdk-docs/julep/api/types/common_resource_deleted_response.md deleted file mode 100644 index 4b1f510b3..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_resource_deleted_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# CommonResourceDeletedResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / CommonResourceDeletedResponse - -> Auto-generated documentation for [julep.api.types.common_resource_deleted_response](../../../../../../../julep/api/types/common_resource_deleted_response.py) module. - -- [CommonResourceDeletedResponse](#commonresourcedeletedresponse) - - [CommonResourceDeletedResponse](#commonresourcedeletedresponse-1) - -## CommonResourceDeletedResponse - -[Show source in common_resource_deleted_response.py:11](../../../../../../../julep/api/types/common_resource_deleted_response.py#L11) - -#### Signature - -```python -class CommonResourceDeletedResponse(pydantic_v1.BaseModel): ... -``` - -### CommonResourceDeletedResponse().dict - -[Show source in common_resource_deleted_response.py:35](../../../../../../../julep/api/types/common_resource_deleted_response.py#L35) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### CommonResourceDeletedResponse().json - -[Show source in common_resource_deleted_response.py:27](../../../../../../../julep/api/types/common_resource_deleted_response.py#L27) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/common_resource_updated_response.md b/docs/python-sdk-docs/julep/api/types/common_resource_updated_response.md deleted file mode 100644 index c01549486..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_resource_updated_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# CommonResourceUpdatedResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / CommonResourceUpdatedResponse - -> Auto-generated documentation for [julep.api.types.common_resource_updated_response](../../../../../../../julep/api/types/common_resource_updated_response.py) module. - -- [CommonResourceUpdatedResponse](#commonresourceupdatedresponse) - - [CommonResourceUpdatedResponse](#commonresourceupdatedresponse-1) - -## CommonResourceUpdatedResponse - -[Show source in common_resource_updated_response.py:11](../../../../../../../julep/api/types/common_resource_updated_response.py#L11) - -#### Signature - -```python -class CommonResourceUpdatedResponse(pydantic_v1.BaseModel): ... -``` - -### CommonResourceUpdatedResponse().dict - -[Show source in common_resource_updated_response.py:35](../../../../../../../julep/api/types/common_resource_updated_response.py#L35) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### CommonResourceUpdatedResponse().json - -[Show source in common_resource_updated_response.py:27](../../../../../../../julep/api/types/common_resource_updated_response.py#L27) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/common_tool_ref.md b/docs/python-sdk-docs/julep/api/types/common_tool_ref.md deleted file mode 100644 index eaeedab94..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_tool_ref.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Tool Ref - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Tool Ref - -> Auto-generated documentation for [julep.api.types.common_tool_ref](../../../../../../../julep/api/types/common_tool_ref.py) module. -- [Common Tool Ref](#common-tool-ref) diff --git a/docs/python-sdk-docs/julep/api/types/common_uuid.md b/docs/python-sdk-docs/julep/api/types/common_uuid.md deleted file mode 100644 index 6946cadd2..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_uuid.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Uuid - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Uuid - -> Auto-generated documentation for [julep.api.types.common_uuid](../../../../../../../julep/api/types/common_uuid.py) module. -- [Common Uuid](#common-uuid) diff --git a/docs/python-sdk-docs/julep/api/types/common_valid_python_identifier.md b/docs/python-sdk-docs/julep/api/types/common_valid_python_identifier.md deleted file mode 100644 index 4f7723b0f..000000000 --- a/docs/python-sdk-docs/julep/api/types/common_valid_python_identifier.md +++ /dev/null @@ -1,6 +0,0 @@ -# Common Valid Python Identifier - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Common Valid Python Identifier - -> Auto-generated documentation for [julep.api.types.common_valid_python_identifier](../../../../../../../julep/api/types/common_valid_python_identifier.py) module. -- [Common Valid Python Identifier](#common-valid-python-identifier) diff --git a/docs/python-sdk-docs/julep/api/types/docs_base_doc_search_request.md b/docs/python-sdk-docs/julep/api/types/docs_base_doc_search_request.md deleted file mode 100644 index dfbf3cdd8..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_base_doc_search_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsBaseDocSearchRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsBaseDocSearchRequest - -> Auto-generated documentation for [julep.api.types.docs_base_doc_search_request](../../../../../../../julep/api/types/docs_base_doc_search_request.py) module. - -- [DocsBaseDocSearchRequest](#docsbasedocsearchrequest) - - [DocsBaseDocSearchRequest](#docsbasedocsearchrequest-1) - -## DocsBaseDocSearchRequest - -[Show source in docs_base_doc_search_request.py:10](../../../../../../../julep/api/types/docs_base_doc_search_request.py#L10) - -#### Signature - -```python -class DocsBaseDocSearchRequest(pydantic_v1.BaseModel): ... -``` - -### DocsBaseDocSearchRequest().dict - -[Show source in docs_base_doc_search_request.py:25](../../../../../../../julep/api/types/docs_base_doc_search_request.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsBaseDocSearchRequest().json - -[Show source in docs_base_doc_search_request.py:17](../../../../../../../julep/api/types/docs_base_doc_search_request.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_create_doc_request.md b/docs/python-sdk-docs/julep/api/types/docs_create_doc_request.md deleted file mode 100644 index ae70487ac..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_create_doc_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# DocsCreateDocRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsCreateDocRequest - -> Auto-generated documentation for [julep.api.types.docs_create_doc_request](../../../../../../../julep/api/types/docs_create_doc_request.py) module. - -- [DocsCreateDocRequest](#docscreatedocrequest) - - [DocsCreateDocRequest](#docscreatedocrequest-1) - -## DocsCreateDocRequest - -[Show source in docs_create_doc_request.py:12](../../../../../../../julep/api/types/docs_create_doc_request.py#L12) - -Payload for creating a doc - -#### Signature - -```python -class DocsCreateDocRequest(pydantic_v1.BaseModel): ... -``` - -### DocsCreateDocRequest().dict - -[Show source in docs_create_doc_request.py:36](../../../../../../../julep/api/types/docs_create_doc_request.py#L36) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsCreateDocRequest().json - -[Show source in docs_create_doc_request.py:28](../../../../../../../julep/api/types/docs_create_doc_request.py#L28) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_create_doc_request_content.md b/docs/python-sdk-docs/julep/api/types/docs_create_doc_request_content.md deleted file mode 100644 index abb30a801..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_create_doc_request_content.md +++ /dev/null @@ -1,6 +0,0 @@ -# Docs Create Doc Request Content - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Docs Create Doc Request Content - -> Auto-generated documentation for [julep.api.types.docs_create_doc_request_content](../../../../../../../julep/api/types/docs_create_doc_request_content.py) module. -- [Docs Create Doc Request Content](#docs-create-doc-request-content) diff --git a/docs/python-sdk-docs/julep/api/types/docs_doc.md b/docs/python-sdk-docs/julep/api/types/docs_doc.md deleted file mode 100644 index 514c94ec5..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_doc.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsDoc - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsDoc - -> Auto-generated documentation for [julep.api.types.docs_doc](../../../../../../../julep/api/types/docs_doc.py) module. - -- [DocsDoc](#docsdoc) - - [DocsDoc](#docsdoc-1) - -## DocsDoc - -[Show source in docs_doc.py:13](../../../../../../../julep/api/types/docs_doc.py#L13) - -#### Signature - -```python -class DocsDoc(pydantic_v1.BaseModel): ... -``` - -### DocsDoc().dict - -[Show source in docs_doc.py:39](../../../../../../../julep/api/types/docs_doc.py#L39) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsDoc().json - -[Show source in docs_doc.py:31](../../../../../../../julep/api/types/docs_doc.py#L31) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_doc_content.md b/docs/python-sdk-docs/julep/api/types/docs_doc_content.md deleted file mode 100644 index 5215c33da..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_doc_content.md +++ /dev/null @@ -1,6 +0,0 @@ -# Docs Doc Content - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Docs Doc Content - -> Auto-generated documentation for [julep.api.types.docs_doc_content](../../../../../../../julep/api/types/docs_doc_content.py) module. -- [Docs Doc Content](#docs-doc-content) diff --git a/docs/python-sdk-docs/julep/api/types/docs_doc_owner.md b/docs/python-sdk-docs/julep/api/types/docs_doc_owner.md deleted file mode 100644 index aea6da18c..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_doc_owner.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsDocOwner - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsDocOwner - -> Auto-generated documentation for [julep.api.types.docs_doc_owner](../../../../../../../julep/api/types/docs_doc_owner.py) module. - -- [DocsDocOwner](#docsdocowner) - - [DocsDocOwner](#docsdocowner-1) - -## DocsDocOwner - -[Show source in docs_doc_owner.py:12](../../../../../../../julep/api/types/docs_doc_owner.py#L12) - -#### Signature - -```python -class DocsDocOwner(pydantic_v1.BaseModel): ... -``` - -### DocsDocOwner().dict - -[Show source in docs_doc_owner.py:24](../../../../../../../julep/api/types/docs_doc_owner.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsDocOwner().json - -[Show source in docs_doc_owner.py:16](../../../../../../../julep/api/types/docs_doc_owner.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_doc_owner_role.md b/docs/python-sdk-docs/julep/api/types/docs_doc_owner_role.md deleted file mode 100644 index 847c151be..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_doc_owner_role.md +++ /dev/null @@ -1,6 +0,0 @@ -# Docs Doc Owner Role - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Docs Doc Owner Role - -> Auto-generated documentation for [julep.api.types.docs_doc_owner_role](../../../../../../../julep/api/types/docs_doc_owner_role.py) module. -- [Docs Doc Owner Role](#docs-doc-owner-role) diff --git a/docs/python-sdk-docs/julep/api/types/docs_doc_reference.md b/docs/python-sdk-docs/julep/api/types/docs_doc_reference.md deleted file mode 100644 index 7c0f740fa..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_doc_reference.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsDocReference - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsDocReference - -> Auto-generated documentation for [julep.api.types.docs_doc_reference](../../../../../../../julep/api/types/docs_doc_reference.py) module. - -- [DocsDocReference](#docsdocreference) - - [DocsDocReference](#docsdocreference-1) - -## DocsDocReference - -[Show source in docs_doc_reference.py:13](../../../../../../../julep/api/types/docs_doc_reference.py#L13) - -#### Signature - -```python -class DocsDocReference(pydantic_v1.BaseModel): ... -``` - -### DocsDocReference().dict - -[Show source in docs_doc_reference.py:36](../../../../../../../julep/api/types/docs_doc_reference.py#L36) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsDocReference().json - -[Show source in docs_doc_reference.py:28](../../../../../../../julep/api/types/docs_doc_reference.py#L28) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_doc_search_response.md b/docs/python-sdk-docs/julep/api/types/docs_doc_search_response.md deleted file mode 100644 index ce99b009c..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_doc_search_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsDocSearchResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsDocSearchResponse - -> Auto-generated documentation for [julep.api.types.docs_doc_search_response](../../../../../../../julep/api/types/docs_doc_search_response.py) module. - -- [DocsDocSearchResponse](#docsdocsearchresponse) - - [DocsDocSearchResponse](#docsdocsearchresponse-1) - -## DocsDocSearchResponse - -[Show source in docs_doc_search_response.py:11](../../../../../../../julep/api/types/docs_doc_search_response.py#L11) - -#### Signature - -```python -class DocsDocSearchResponse(pydantic_v1.BaseModel): ... -``` - -### DocsDocSearchResponse().dict - -[Show source in docs_doc_search_response.py:30](../../../../../../../julep/api/types/docs_doc_search_response.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsDocSearchResponse().json - -[Show source in docs_doc_search_response.py:22](../../../../../../../julep/api/types/docs_doc_search_response.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_embed_query_request.md b/docs/python-sdk-docs/julep/api/types/docs_embed_query_request.md deleted file mode 100644 index 2d1f92fe2..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_embed_query_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsEmbedQueryRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsEmbedQueryRequest - -> Auto-generated documentation for [julep.api.types.docs_embed_query_request](../../../../../../../julep/api/types/docs_embed_query_request.py) module. - -- [DocsEmbedQueryRequest](#docsembedqueryrequest) - - [DocsEmbedQueryRequest](#docsembedqueryrequest-1) - -## DocsEmbedQueryRequest - -[Show source in docs_embed_query_request.py:11](../../../../../../../julep/api/types/docs_embed_query_request.py#L11) - -#### Signature - -```python -class DocsEmbedQueryRequest(pydantic_v1.BaseModel): ... -``` - -### DocsEmbedQueryRequest().dict - -[Show source in docs_embed_query_request.py:25](../../../../../../../julep/api/types/docs_embed_query_request.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsEmbedQueryRequest().json - -[Show source in docs_embed_query_request.py:17](../../../../../../../julep/api/types/docs_embed_query_request.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_embed_query_request_text.md b/docs/python-sdk-docs/julep/api/types/docs_embed_query_request_text.md deleted file mode 100644 index ac55882ee..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_embed_query_request_text.md +++ /dev/null @@ -1,6 +0,0 @@ -# Docs Embed Query Request Text - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Docs Embed Query Request Text - -> Auto-generated documentation for [julep.api.types.docs_embed_query_request_text](../../../../../../../julep/api/types/docs_embed_query_request_text.py) module. -- [Docs Embed Query Request Text](#docs-embed-query-request-text) diff --git a/docs/python-sdk-docs/julep/api/types/docs_embed_query_response.md b/docs/python-sdk-docs/julep/api/types/docs_embed_query_response.md deleted file mode 100644 index 18ca2fdb9..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_embed_query_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsEmbedQueryResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsEmbedQueryResponse - -> Auto-generated documentation for [julep.api.types.docs_embed_query_response](../../../../../../../julep/api/types/docs_embed_query_response.py) module. - -- [DocsEmbedQueryResponse](#docsembedqueryresponse) - - [DocsEmbedQueryResponse](#docsembedqueryresponse-1) - -## DocsEmbedQueryResponse - -[Show source in docs_embed_query_response.py:10](../../../../../../../julep/api/types/docs_embed_query_response.py#L10) - -#### Signature - -```python -class DocsEmbedQueryResponse(pydantic_v1.BaseModel): ... -``` - -### DocsEmbedQueryResponse().dict - -[Show source in docs_embed_query_response.py:24](../../../../../../../julep/api/types/docs_embed_query_response.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsEmbedQueryResponse().json - -[Show source in docs_embed_query_response.py:16](../../../../../../../julep/api/types/docs_embed_query_response.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_hybrid_doc_search_request.md b/docs/python-sdk-docs/julep/api/types/docs_hybrid_doc_search_request.md deleted file mode 100644 index 8c3350d45..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_hybrid_doc_search_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsHybridDocSearchRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsHybridDocSearchRequest - -> Auto-generated documentation for [julep.api.types.docs_hybrid_doc_search_request](../../../../../../../julep/api/types/docs_hybrid_doc_search_request.py) module. - -- [DocsHybridDocSearchRequest](#docshybriddocsearchrequest) - - [DocsHybridDocSearchRequest](#docshybriddocsearchrequest-1) - -## DocsHybridDocSearchRequest - -[Show source in docs_hybrid_doc_search_request.py:11](../../../../../../../julep/api/types/docs_hybrid_doc_search_request.py#L11) - -#### Signature - -```python -class DocsHybridDocSearchRequest(DocsBaseDocSearchRequest): ... -``` - -### DocsHybridDocSearchRequest().dict - -[Show source in docs_hybrid_doc_search_request.py:40](../../../../../../../julep/api/types/docs_hybrid_doc_search_request.py#L40) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsHybridDocSearchRequest().json - -[Show source in docs_hybrid_doc_search_request.py:32](../../../../../../../julep/api/types/docs_hybrid_doc_search_request.py#L32) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_snippet.md b/docs/python-sdk-docs/julep/api/types/docs_snippet.md deleted file mode 100644 index 772f9cbce..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_snippet.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsSnippet - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsSnippet - -> Auto-generated documentation for [julep.api.types.docs_snippet](../../../../../../../julep/api/types/docs_snippet.py) module. - -- [DocsSnippet](#docssnippet) - - [DocsSnippet](#docssnippet-1) - -## DocsSnippet - -[Show source in docs_snippet.py:10](../../../../../../../julep/api/types/docs_snippet.py#L10) - -#### Signature - -```python -class DocsSnippet(pydantic_v1.BaseModel): ... -``` - -### DocsSnippet().dict - -[Show source in docs_snippet.py:22](../../../../../../../julep/api/types/docs_snippet.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsSnippet().json - -[Show source in docs_snippet.py:14](../../../../../../../julep/api/types/docs_snippet.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_text_only_doc_search_request.md b/docs/python-sdk-docs/julep/api/types/docs_text_only_doc_search_request.md deleted file mode 100644 index 8cce7a03e..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_text_only_doc_search_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsTextOnlyDocSearchRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsTextOnlyDocSearchRequest - -> Auto-generated documentation for [julep.api.types.docs_text_only_doc_search_request](../../../../../../../julep/api/types/docs_text_only_doc_search_request.py) module. - -- [DocsTextOnlyDocSearchRequest](#docstextonlydocsearchrequest) - - [DocsTextOnlyDocSearchRequest](#docstextonlydocsearchrequest-1) - -## DocsTextOnlyDocSearchRequest - -[Show source in docs_text_only_doc_search_request.py:11](../../../../../../../julep/api/types/docs_text_only_doc_search_request.py#L11) - -#### Signature - -```python -class DocsTextOnlyDocSearchRequest(DocsBaseDocSearchRequest): ... -``` - -### DocsTextOnlyDocSearchRequest().dict - -[Show source in docs_text_only_doc_search_request.py:25](../../../../../../../julep/api/types/docs_text_only_doc_search_request.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsTextOnlyDocSearchRequest().json - -[Show source in docs_text_only_doc_search_request.py:17](../../../../../../../julep/api/types/docs_text_only_doc_search_request.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/docs_vector_doc_search_request.md b/docs/python-sdk-docs/julep/api/types/docs_vector_doc_search_request.md deleted file mode 100644 index 3b2574792..000000000 --- a/docs/python-sdk-docs/julep/api/types/docs_vector_doc_search_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# DocsVectorDocSearchRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / DocsVectorDocSearchRequest - -> Auto-generated documentation for [julep.api.types.docs_vector_doc_search_request](../../../../../../../julep/api/types/docs_vector_doc_search_request.py) module. - -- [DocsVectorDocSearchRequest](#docsvectordocsearchrequest) - - [DocsVectorDocSearchRequest](#docsvectordocsearchrequest-1) - -## DocsVectorDocSearchRequest - -[Show source in docs_vector_doc_search_request.py:11](../../../../../../../julep/api/types/docs_vector_doc_search_request.py#L11) - -#### Signature - -```python -class DocsVectorDocSearchRequest(DocsBaseDocSearchRequest): ... -``` - -### DocsVectorDocSearchRequest().dict - -[Show source in docs_vector_doc_search_request.py:30](../../../../../../../julep/api/types/docs_vector_doc_search_request.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### DocsVectorDocSearchRequest().json - -[Show source in docs_vector_doc_search_request.py:22](../../../../../../../julep/api/types/docs_vector_doc_search_request.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_base_entry.md b/docs/python-sdk-docs/julep/api/types/entries_base_entry.md deleted file mode 100644 index 4b14c805b..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_base_entry.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesBaseEntry - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesBaseEntry - -> Auto-generated documentation for [julep.api.types.entries_base_entry](../../../../../../../julep/api/types/entries_base_entry.py) module. - -- [EntriesBaseEntry](#entriesbaseentry) - - [EntriesBaseEntry](#entriesbaseentry-1) - -## EntriesBaseEntry - -[Show source in entries_base_entry.py:13](../../../../../../../julep/api/types/entries_base_entry.py#L13) - -#### Signature - -```python -class EntriesBaseEntry(pydantic_v1.BaseModel): ... -``` - -### EntriesBaseEntry().dict - -[Show source in entries_base_entry.py:33](../../../../../../../julep/api/types/entries_base_entry.py#L33) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesBaseEntry().json - -[Show source in entries_base_entry.py:25](../../../../../../../julep/api/types/entries_base_entry.py#L25) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_base_entry_content.md b/docs/python-sdk-docs/julep/api/types/entries_base_entry_content.md deleted file mode 100644 index a3a9cf120..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_base_entry_content.md +++ /dev/null @@ -1,6 +0,0 @@ -# Entries Base Entry Content - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Base Entry Content - -> Auto-generated documentation for [julep.api.types.entries_base_entry_content](../../../../../../../julep/api/types/entries_base_entry_content.py) module. -- [Entries Base Entry Content](#entries-base-entry-content) diff --git a/docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item.md b/docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item.md deleted file mode 100644 index f2479af4b..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item.md +++ /dev/null @@ -1,6 +0,0 @@ -# Entries Base Entry Content Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Base Entry Content Item - -> Auto-generated documentation for [julep.api.types.entries_base_entry_content_item](../../../../../../../julep/api/types/entries_base_entry_content_item.py) module. -- [Entries Base Entry Content Item](#entries-base-entry-content-item) diff --git a/docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item_item.md b/docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item_item.md deleted file mode 100644 index 4e0d20f25..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_base_entry_content_item_item.md +++ /dev/null @@ -1,71 +0,0 @@ -# Entries Base Entry Content Item Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Base Entry Content Item Item - -> Auto-generated documentation for [julep.api.types.entries_base_entry_content_item_item](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py) module. - -- [Entries Base Entry Content Item Item](#entries-base-entry-content-item-item) - - [EntriesBaseEntryContentItemItem_ImageUrl](#entriesbaseentrycontentitemitem_imageurl) - - [EntriesBaseEntryContentItemItem_Text](#entriesbaseentrycontentitemitem_text) - -## EntriesBaseEntryContentItemItem_ImageUrl - -[Show source in entries_base_entry_content_item_item.py:49](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py#L49) - -#### Signature - -```python -class EntriesBaseEntryContentItemItem_ImageUrl(pydantic_v1.BaseModel): ... -``` - -### EntriesBaseEntryContentItemItem_ImageUrl().dict - -[Show source in entries_base_entry_content_item_item.py:61](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py#L61) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesBaseEntryContentItemItem_ImageUrl().json - -[Show source in entries_base_entry_content_item_item.py:53](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py#L53) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## EntriesBaseEntryContentItemItem_Text - -[Show source in entries_base_entry_content_item_item.py:13](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py#L13) - -#### Signature - -```python -class EntriesBaseEntryContentItemItem_Text(pydantic_v1.BaseModel): ... -``` - -### EntriesBaseEntryContentItemItem_Text().dict - -[Show source in entries_base_entry_content_item_item.py:25](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesBaseEntryContentItemItem_Text().json - -[Show source in entries_base_entry_content_item_item.py:17](../../../../../../../julep/api/types/entries_base_entry_content_item_item.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_base_entry_source.md b/docs/python-sdk-docs/julep/api/types/entries_base_entry_source.md deleted file mode 100644 index 49ec1c8c6..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_base_entry_source.md +++ /dev/null @@ -1,6 +0,0 @@ -# Entries Base Entry Source - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Base Entry Source - -> Auto-generated documentation for [julep.api.types.entries_base_entry_source](../../../../../../../julep/api/types/entries_base_entry_source.py) module. -- [Entries Base Entry Source](#entries-base-entry-source) diff --git a/docs/python-sdk-docs/julep/api/types/entries_chat_ml_image_content_part.md b/docs/python-sdk-docs/julep/api/types/entries_chat_ml_image_content_part.md deleted file mode 100644 index a635515a2..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_chat_ml_image_content_part.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesChatMlImageContentPart - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesChatMlImageContentPart - -> Auto-generated documentation for [julep.api.types.entries_chat_ml_image_content_part](../../../../../../../julep/api/types/entries_chat_ml_image_content_part.py) module. - -- [EntriesChatMlImageContentPart](#entrieschatmlimagecontentpart) - - [EntriesChatMlImageContentPart](#entrieschatmlimagecontentpart-1) - -## EntriesChatMlImageContentPart - -[Show source in entries_chat_ml_image_content_part.py:11](../../../../../../../julep/api/types/entries_chat_ml_image_content_part.py#L11) - -#### Signature - -```python -class EntriesChatMlImageContentPart(pydantic_v1.BaseModel): ... -``` - -### EntriesChatMlImageContentPart().dict - -[Show source in entries_chat_ml_image_content_part.py:25](../../../../../../../julep/api/types/entries_chat_ml_image_content_part.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesChatMlImageContentPart().json - -[Show source in entries_chat_ml_image_content_part.py:17](../../../../../../../julep/api/types/entries_chat_ml_image_content_part.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_chat_ml_role.md b/docs/python-sdk-docs/julep/api/types/entries_chat_ml_role.md deleted file mode 100644 index 7f92f26f0..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_chat_ml_role.md +++ /dev/null @@ -1,6 +0,0 @@ -# Entries Chat Ml Role - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Chat Ml Role - -> Auto-generated documentation for [julep.api.types.entries_chat_ml_role](../../../../../../../julep/api/types/entries_chat_ml_role.py) module. -- [Entries Chat Ml Role](#entries-chat-ml-role) diff --git a/docs/python-sdk-docs/julep/api/types/entries_chat_ml_text_content_part.md b/docs/python-sdk-docs/julep/api/types/entries_chat_ml_text_content_part.md deleted file mode 100644 index a09d2f597..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_chat_ml_text_content_part.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesChatMlTextContentPart - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesChatMlTextContentPart - -> Auto-generated documentation for [julep.api.types.entries_chat_ml_text_content_part](../../../../../../../julep/api/types/entries_chat_ml_text_content_part.py) module. - -- [EntriesChatMlTextContentPart](#entrieschatmltextcontentpart) - - [EntriesChatMlTextContentPart](#entrieschatmltextcontentpart-1) - -## EntriesChatMlTextContentPart - -[Show source in entries_chat_ml_text_content_part.py:10](../../../../../../../julep/api/types/entries_chat_ml_text_content_part.py#L10) - -#### Signature - -```python -class EntriesChatMlTextContentPart(pydantic_v1.BaseModel): ... -``` - -### EntriesChatMlTextContentPart().dict - -[Show source in entries_chat_ml_text_content_part.py:21](../../../../../../../julep/api/types/entries_chat_ml_text_content_part.py#L21) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesChatMlTextContentPart().json - -[Show source in entries_chat_ml_text_content_part.py:13](../../../../../../../julep/api/types/entries_chat_ml_text_content_part.py#L13) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_entry.md b/docs/python-sdk-docs/julep/api/types/entries_entry.md deleted file mode 100644 index 6aa64b67d..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_entry.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesEntry - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesEntry - -> Auto-generated documentation for [julep.api.types.entries_entry](../../../../../../../julep/api/types/entries_entry.py) module. - -- [EntriesEntry](#entriesentry) - - [EntriesEntry](#entriesentry-1) - -## EntriesEntry - -[Show source in entries_entry.py:12](../../../../../../../julep/api/types/entries_entry.py#L12) - -#### Signature - -```python -class EntriesEntry(EntriesBaseEntry): ... -``` - -### EntriesEntry().dict - -[Show source in entries_entry.py:28](../../../../../../../julep/api/types/entries_entry.py#L28) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesEntry().json - -[Show source in entries_entry.py:20](../../../../../../../julep/api/types/entries_entry.py#L20) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_history.md b/docs/python-sdk-docs/julep/api/types/entries_history.md deleted file mode 100644 index 615f6b666..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_history.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesHistory - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesHistory - -> Auto-generated documentation for [julep.api.types.entries_history](../../../../../../../julep/api/types/entries_history.py) module. - -- [EntriesHistory](#entrieshistory) - - [EntriesHistory](#entrieshistory-1) - -## EntriesHistory - -[Show source in entries_history.py:13](../../../../../../../julep/api/types/entries_history.py#L13) - -#### Signature - -```python -class EntriesHistory(pydantic_v1.BaseModel): ... -``` - -### EntriesHistory().dict - -[Show source in entries_history.py:30](../../../../../../../julep/api/types/entries_history.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesHistory().json - -[Show source in entries_history.py:22](../../../../../../../julep/api/types/entries_history.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_image_detail.md b/docs/python-sdk-docs/julep/api/types/entries_image_detail.md deleted file mode 100644 index 5e98b5628..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_image_detail.md +++ /dev/null @@ -1,6 +0,0 @@ -# Entries Image Detail - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Image Detail - -> Auto-generated documentation for [julep.api.types.entries_image_detail](../../../../../../../julep/api/types/entries_image_detail.py) module. -- [Entries Image Detail](#entries-image-detail) diff --git a/docs/python-sdk-docs/julep/api/types/entries_image_url.md b/docs/python-sdk-docs/julep/api/types/entries_image_url.md deleted file mode 100644 index 4b6870f88..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_image_url.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesImageUrl - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesImageUrl - -> Auto-generated documentation for [julep.api.types.entries_image_url](../../../../../../../julep/api/types/entries_image_url.py) module. - -- [EntriesImageUrl](#entriesimageurl) - - [EntriesImageUrl](#entriesimageurl-1) - -## EntriesImageUrl - -[Show source in entries_image_url.py:11](../../../../../../../julep/api/types/entries_image_url.py#L11) - -#### Signature - -```python -class EntriesImageUrl(pydantic_v1.BaseModel): ... -``` - -### EntriesImageUrl().dict - -[Show source in entries_image_url.py:30](../../../../../../../julep/api/types/entries_image_url.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesImageUrl().json - -[Show source in entries_image_url.py:22](../../../../../../../julep/api/types/entries_image_url.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message.md b/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message.md deleted file mode 100644 index 7beba9d20..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesInputChatMlMessage - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesInputChatMlMessage - -> Auto-generated documentation for [julep.api.types.entries_input_chat_ml_message](../../../../../../../julep/api/types/entries_input_chat_ml_message.py) module. - -- [EntriesInputChatMlMessage](#entriesinputchatmlmessage) - - [EntriesInputChatMlMessage](#entriesinputchatmlmessage-1) - -## EntriesInputChatMlMessage - -[Show source in entries_input_chat_ml_message.py:12](../../../../../../../julep/api/types/entries_input_chat_ml_message.py#L12) - -#### Signature - -```python -class EntriesInputChatMlMessage(pydantic_v1.BaseModel): ... -``` - -### EntriesInputChatMlMessage().dict - -[Show source in entries_input_chat_ml_message.py:41](../../../../../../../julep/api/types/entries_input_chat_ml_message.py#L41) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesInputChatMlMessage().json - -[Show source in entries_input_chat_ml_message.py:33](../../../../../../../julep/api/types/entries_input_chat_ml_message.py#L33) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content.md b/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content.md deleted file mode 100644 index e4a4d9b27..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content.md +++ /dev/null @@ -1,6 +0,0 @@ -# Entries Input Chat Ml Message Content - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Input Chat Ml Message Content - -> Auto-generated documentation for [julep.api.types.entries_input_chat_ml_message_content](../../../../../../../julep/api/types/entries_input_chat_ml_message_content.py) module. -- [Entries Input Chat Ml Message Content](#entries-input-chat-ml-message-content) diff --git a/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content_item.md b/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content_item.md deleted file mode 100644 index 2f25e9173..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_input_chat_ml_message_content_item.md +++ /dev/null @@ -1,71 +0,0 @@ -# Entries Input Chat Ml Message Content Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Entries Input Chat Ml Message Content Item - -> Auto-generated documentation for [julep.api.types.entries_input_chat_ml_message_content_item](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py) module. - -- [Entries Input Chat Ml Message Content Item](#entries-input-chat-ml-message-content-item) - - [EntriesInputChatMlMessageContentItem_ImageUrl](#entriesinputchatmlmessagecontentitem_imageurl) - - [EntriesInputChatMlMessageContentItem_Text](#entriesinputchatmlmessagecontentitem_text) - -## EntriesInputChatMlMessageContentItem_ImageUrl - -[Show source in entries_input_chat_ml_message_content_item.py:49](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py#L49) - -#### Signature - -```python -class EntriesInputChatMlMessageContentItem_ImageUrl(pydantic_v1.BaseModel): ... -``` - -### EntriesInputChatMlMessageContentItem_ImageUrl().dict - -[Show source in entries_input_chat_ml_message_content_item.py:61](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py#L61) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesInputChatMlMessageContentItem_ImageUrl().json - -[Show source in entries_input_chat_ml_message_content_item.py:53](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py#L53) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## EntriesInputChatMlMessageContentItem_Text - -[Show source in entries_input_chat_ml_message_content_item.py:13](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py#L13) - -#### Signature - -```python -class EntriesInputChatMlMessageContentItem_Text(pydantic_v1.BaseModel): ... -``` - -### EntriesInputChatMlMessageContentItem_Text().dict - -[Show source in entries_input_chat_ml_message_content_item.py:25](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesInputChatMlMessageContentItem_Text().json - -[Show source in entries_input_chat_ml_message_content_item.py:17](../../../../../../../julep/api/types/entries_input_chat_ml_message_content_item.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/entries_relation.md b/docs/python-sdk-docs/julep/api/types/entries_relation.md deleted file mode 100644 index 9694b3b08..000000000 --- a/docs/python-sdk-docs/julep/api/types/entries_relation.md +++ /dev/null @@ -1,38 +0,0 @@ -# EntriesRelation - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / EntriesRelation - -> Auto-generated documentation for [julep.api.types.entries_relation](../../../../../../../julep/api/types/entries_relation.py) module. - -- [EntriesRelation](#entriesrelation) - - [EntriesRelation](#entriesrelation-1) - -## EntriesRelation - -[Show source in entries_relation.py:11](../../../../../../../julep/api/types/entries_relation.py#L11) - -#### Signature - -```python -class EntriesRelation(pydantic_v1.BaseModel): ... -``` - -### EntriesRelation().dict - -[Show source in entries_relation.py:24](../../../../../../../julep/api/types/entries_relation.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### EntriesRelation().json - -[Show source in entries_relation.py:16](../../../../../../../julep/api/types/entries_relation.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_direction.md deleted file mode 100644 index 24fd3b5ca..000000000 --- a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Execution Transitions Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Execution Transitions Route List Request Direction - -> Auto-generated documentation for [julep.api.types.execution_transitions_route_list_request_direction](../../../../../../../julep/api/types/execution_transitions_route_list_request_direction.py) module. -- [Execution Transitions Route List Request Direction](#execution-transitions-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_sort_by.md deleted file mode 100644 index 5c393c4bd..000000000 --- a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Execution Transitions Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Execution Transitions Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.execution_transitions_route_list_request_sort_by](../../../../../../../julep/api/types/execution_transitions_route_list_request_sort_by.py) module. -- [Execution Transitions Route List Request Sort By](#execution-transitions-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response.md b/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response.md deleted file mode 100644 index d515b6efc..000000000 --- a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionTransitionsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionTransitionsRouteListResponse - -> Auto-generated documentation for [julep.api.types.execution_transitions_route_list_response](../../../../../../../julep/api/types/execution_transitions_route_list_response.py) module. - -- [ExecutionTransitionsRouteListResponse](#executiontransitionsroutelistresponse) - - [ExecutionTransitionsRouteListResponse](#executiontransitionsroutelistresponse-1) - -## ExecutionTransitionsRouteListResponse - -[Show source in execution_transitions_route_list_response.py:13](../../../../../../../julep/api/types/execution_transitions_route_list_response.py#L13) - -#### Signature - -```python -class ExecutionTransitionsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### ExecutionTransitionsRouteListResponse().dict - -[Show source in execution_transitions_route_list_response.py:24](../../../../../../../julep/api/types/execution_transitions_route_list_response.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionTransitionsRouteListResponse().json - -[Show source in execution_transitions_route_list_response.py:16](../../../../../../../julep/api/types/execution_transitions_route_list_response.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response_results_item.md b/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response_results_item.md deleted file mode 100644 index ca9cbc082..000000000 --- a/docs/python-sdk-docs/julep/api/types/execution_transitions_route_list_response_results_item.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionTransitionsRouteListResponseResultsItem - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionTransitionsRouteListResponseResultsItem - -> Auto-generated documentation for [julep.api.types.execution_transitions_route_list_response_results_item](../../../../../../../julep/api/types/execution_transitions_route_list_response_results_item.py) module. - -- [ExecutionTransitionsRouteListResponseResultsItem](#executiontransitionsroutelistresponseresultsitem) - - [ExecutionTransitionsRouteListResponseResultsItem](#executiontransitionsroutelistresponseresultsitem-1) - -## ExecutionTransitionsRouteListResponseResultsItem - -[Show source in execution_transitions_route_list_response_results_item.py:11](../../../../../../../julep/api/types/execution_transitions_route_list_response_results_item.py#L11) - -#### Signature - -```python -class ExecutionTransitionsRouteListResponseResultsItem(pydantic_v1.BaseModel): ... -``` - -### ExecutionTransitionsRouteListResponseResultsItem().dict - -[Show source in execution_transitions_route_list_response_results_item.py:22](../../../../../../../julep/api/types/execution_transitions_route_list_response_results_item.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionTransitionsRouteListResponseResultsItem().json - -[Show source in execution_transitions_route_list_response_results_item.py:14](../../../../../../../julep/api/types/execution_transitions_route_list_response_results_item.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/executions_execution.md b/docs/python-sdk-docs/julep/api/types/executions_execution.md deleted file mode 100644 index e79809fe6..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_execution.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionsExecution - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionsExecution - -> Auto-generated documentation for [julep.api.types.executions_execution](../../../../../../../julep/api/types/executions_execution.py) module. - -- [ExecutionsExecution](#executionsexecution) - - [ExecutionsExecution](#executionsexecution-1) - -## ExecutionsExecution - -[Show source in executions_execution.py:12](../../../../../../../julep/api/types/executions_execution.py#L12) - -#### Signature - -```python -class ExecutionsExecution(pydantic_v1.BaseModel): ... -``` - -### ExecutionsExecution().dict - -[Show source in executions_execution.py:49](../../../../../../../julep/api/types/executions_execution.py#L49) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsExecution().json - -[Show source in executions_execution.py:41](../../../../../../../julep/api/types/executions_execution.py#L41) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/executions_execution_status.md b/docs/python-sdk-docs/julep/api/types/executions_execution_status.md deleted file mode 100644 index 419ddcb50..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_execution_status.md +++ /dev/null @@ -1,6 +0,0 @@ -# Executions Execution Status - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Executions Execution Status - -> Auto-generated documentation for [julep.api.types.executions_execution_status](../../../../../../../julep/api/types/executions_execution_status.py) module. -- [Executions Execution Status](#executions-execution-status) diff --git a/docs/python-sdk-docs/julep/api/types/executions_resume_execution_request.md b/docs/python-sdk-docs/julep/api/types/executions_resume_execution_request.md deleted file mode 100644 index b5d6cf960..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_resume_execution_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionsResumeExecutionRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionsResumeExecutionRequest - -> Auto-generated documentation for [julep.api.types.executions_resume_execution_request](../../../../../../../julep/api/types/executions_resume_execution_request.py) module. - -- [ExecutionsResumeExecutionRequest](#executionsresumeexecutionrequest) - - [ExecutionsResumeExecutionRequest](#executionsresumeexecutionrequest-1) - -## ExecutionsResumeExecutionRequest - -[Show source in executions_resume_execution_request.py:10](../../../../../../../julep/api/types/executions_resume_execution_request.py#L10) - -#### Signature - -```python -class ExecutionsResumeExecutionRequest(pydantic_v1.BaseModel): ... -``` - -### ExecutionsResumeExecutionRequest().dict - -[Show source in executions_resume_execution_request.py:26](../../../../../../../julep/api/types/executions_resume_execution_request.py#L26) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsResumeExecutionRequest().json - -[Show source in executions_resume_execution_request.py:18](../../../../../../../julep/api/types/executions_resume_execution_request.py#L18) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/executions_stop_execution_request.md b/docs/python-sdk-docs/julep/api/types/executions_stop_execution_request.md deleted file mode 100644 index 6142b3737..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_stop_execution_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionsStopExecutionRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionsStopExecutionRequest - -> Auto-generated documentation for [julep.api.types.executions_stop_execution_request](../../../../../../../julep/api/types/executions_stop_execution_request.py) module. - -- [ExecutionsStopExecutionRequest](#executionsstopexecutionrequest) - - [ExecutionsStopExecutionRequest](#executionsstopexecutionrequest-1) - -## ExecutionsStopExecutionRequest - -[Show source in executions_stop_execution_request.py:10](../../../../../../../julep/api/types/executions_stop_execution_request.py#L10) - -#### Signature - -```python -class ExecutionsStopExecutionRequest(pydantic_v1.BaseModel): ... -``` - -### ExecutionsStopExecutionRequest().dict - -[Show source in executions_stop_execution_request.py:24](../../../../../../../julep/api/types/executions_stop_execution_request.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsStopExecutionRequest().json - -[Show source in executions_stop_execution_request.py:16](../../../../../../../julep/api/types/executions_stop_execution_request.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/executions_transition.md b/docs/python-sdk-docs/julep/api/types/executions_transition.md deleted file mode 100644 index 51de83c30..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_transition.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionsTransition - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionsTransition - -> Auto-generated documentation for [julep.api.types.executions_transition](../../../../../../../julep/api/types/executions_transition.py) module. - -- [ExecutionsTransition](#executionstransition) - - [ExecutionsTransition](#executionstransition-1) - -## ExecutionsTransition - -[Show source in executions_transition.py:13](../../../../../../../julep/api/types/executions_transition.py#L13) - -#### Signature - -```python -class ExecutionsTransition(pydantic_v1.BaseModel): ... -``` - -### ExecutionsTransition().dict - -[Show source in executions_transition.py:39](../../../../../../../julep/api/types/executions_transition.py#L39) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsTransition().json - -[Show source in executions_transition.py:31](../../../../../../../julep/api/types/executions_transition.py#L31) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/executions_transition_target.md b/docs/python-sdk-docs/julep/api/types/executions_transition_target.md deleted file mode 100644 index 28a2b6282..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_transition_target.md +++ /dev/null @@ -1,38 +0,0 @@ -# ExecutionsTransitionTarget - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ExecutionsTransitionTarget - -> Auto-generated documentation for [julep.api.types.executions_transition_target](../../../../../../../julep/api/types/executions_transition_target.py) module. - -- [ExecutionsTransitionTarget](#executionstransitiontarget) - - [ExecutionsTransitionTarget](#executionstransitiontarget-1) - -## ExecutionsTransitionTarget - -[Show source in executions_transition_target.py:11](../../../../../../../julep/api/types/executions_transition_target.py#L11) - -#### Signature - -```python -class ExecutionsTransitionTarget(pydantic_v1.BaseModel): ... -``` - -### ExecutionsTransitionTarget().dict - -[Show source in executions_transition_target.py:23](../../../../../../../julep/api/types/executions_transition_target.py#L23) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsTransitionTarget().json - -[Show source in executions_transition_target.py:15](../../../../../../../julep/api/types/executions_transition_target.py#L15) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/executions_transition_type.md b/docs/python-sdk-docs/julep/api/types/executions_transition_type.md deleted file mode 100644 index 0d1435e49..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_transition_type.md +++ /dev/null @@ -1,6 +0,0 @@ -# Executions Transition Type - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Executions Transition Type - -> Auto-generated documentation for [julep.api.types.executions_transition_type](../../../../../../../julep/api/types/executions_transition_type.py) module. -- [Executions Transition Type](#executions-transition-type) diff --git a/docs/python-sdk-docs/julep/api/types/executions_update_execution_request.md b/docs/python-sdk-docs/julep/api/types/executions_update_execution_request.md deleted file mode 100644 index da3204548..000000000 --- a/docs/python-sdk-docs/julep/api/types/executions_update_execution_request.md +++ /dev/null @@ -1,71 +0,0 @@ -# Executions Update Execution Request - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Executions Update Execution Request - -> Auto-generated documentation for [julep.api.types.executions_update_execution_request](../../../../../../../julep/api/types/executions_update_execution_request.py) module. - -- [Executions Update Execution Request](#executions-update-execution-request) - - [ExecutionsUpdateExecutionRequest_Cancelled](#executionsupdateexecutionrequest_cancelled) - - [ExecutionsUpdateExecutionRequest_Running](#executionsupdateexecutionrequest_running) - -## ExecutionsUpdateExecutionRequest_Cancelled - -[Show source in executions_update_execution_request.py:12](../../../../../../../julep/api/types/executions_update_execution_request.py#L12) - -#### Signature - -```python -class ExecutionsUpdateExecutionRequest_Cancelled(pydantic_v1.BaseModel): ... -``` - -### ExecutionsUpdateExecutionRequest_Cancelled().dict - -[Show source in executions_update_execution_request.py:24](../../../../../../../julep/api/types/executions_update_execution_request.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsUpdateExecutionRequest_Cancelled().json - -[Show source in executions_update_execution_request.py:16](../../../../../../../julep/api/types/executions_update_execution_request.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## ExecutionsUpdateExecutionRequest_Running - -[Show source in executions_update_execution_request.py:48](../../../../../../../julep/api/types/executions_update_execution_request.py#L48) - -#### Signature - -```python -class ExecutionsUpdateExecutionRequest_Running(pydantic_v1.BaseModel): ... -``` - -### ExecutionsUpdateExecutionRequest_Running().dict - -[Show source in executions_update_execution_request.py:60](../../../../../../../julep/api/types/executions_update_execution_request.py#L60) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ExecutionsUpdateExecutionRequest_Running().json - -[Show source in executions_update_execution_request.py:52](../../../../../../../julep/api/types/executions_update_execution_request.py#L52) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/index.md b/docs/python-sdk-docs/julep/api/types/index.md deleted file mode 100644 index 1e1c8a509..000000000 --- a/docs/python-sdk-docs/julep/api/types/index.md +++ /dev/null @@ -1,186 +0,0 @@ -# Types - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / Types - -> Auto-generated documentation for [julep.api.types](../../../../../../../julep/api/types/__init__.py) module. - -- [Types](#types) - - [Modules](#modules) - -## Modules - -- [Agent Docs Route List Request Direction](./agent_docs_route_list_request_direction.md) -- [Agent Docs Route List Request Sort By](./agent_docs_route_list_request_sort_by.md) -- [AgentDocsRouteListResponse](./agent_docs_route_list_response.md) -- [Agent Tools Route List Request Direction](./agent_tools_route_list_request_direction.md) -- [Agent Tools Route List Request Sort By](./agent_tools_route_list_request_sort_by.md) -- [AgentToolsRouteListResponse](./agent_tools_route_list_response.md) -- [AgentsAgent](./agents_agent.md) -- [Agents Agent Instructions](./agents_agent_instructions.md) -- [AgentsCreateAgentRequest](./agents_create_agent_request.md) -- [Agents Create Agent Request Instructions](./agents_create_agent_request_instructions.md) -- [AgentsCreateOrUpdateAgentRequest](./agents_create_or_update_agent_request.md) -- [Agents Docs Search Route Search Request Body](./agents_docs_search_route_search_request_body.md) -- [Agents Patch Agent Request Instructions](./agents_patch_agent_request_instructions.md) -- [Agents Route List Request Direction](./agents_route_list_request_direction.md) -- [Agents Route List Request Sort By](./agents_route_list_request_sort_by.md) -- [AgentsRouteListResponse](./agents_route_list_response.md) -- [AgentsUpdateAgentRequest](./agents_update_agent_request.md) -- [Agents Update Agent Request Instructions](./agents_update_agent_request_instructions.md) -- [ChatBaseChatOutput](./chat_base_chat_output.md) -- [ChatBaseChatResponse](./chat_base_chat_response.md) -- [ChatBaseTokenLogProb](./chat_base_token_log_prob.md) -- [ChatChatInputData](./chat_chat_input_data.md) -- [Chat Chat Input Data Tool Choice](./chat_chat_input_data_tool_choice.md) -- [ChatChatOutputChunk](./chat_chat_output_chunk.md) -- [ChatChatSettings](./chat_chat_settings.md) -- [ChatChunkChatResponse](./chat_chunk_chat_response.md) -- [ChatCompetionUsage](./chat_competion_usage.md) -- [ChatCompletionResponseFormat](./chat_completion_response_format.md) -- [Chat Completion Response Format Type](./chat_completion_response_format_type.md) -- [ChatDefaultChatSettings](./chat_default_chat_settings.md) -- [Chat Finish Reason](./chat_finish_reason.md) -- [ChatLogProbResponse](./chat_log_prob_response.md) -- [ChatMessageChatResponse](./chat_message_chat_response.md) -- [Chat Message Chat Response Choices Item](./chat_message_chat_response_choices_item.md) -- [ChatMultipleChatOutput](./chat_multiple_chat_output.md) -- [ChatOpenAiSettings](./chat_open_ai_settings.md) -- [Chat Route Generate Response](./chat_route_generate_response.md) -- [ChatSingleChatOutput](./chat_single_chat_output.md) -- [ChatTokenLogProb](./chat_token_log_prob.md) -- [Common Identifier Safe Unicode](./common_identifier_safe_unicode.md) -- [Common Limit](./common_limit.md) -- [Common Logit Bias](./common_logit_bias.md) -- [Common Offset](./common_offset.md) -- [Common Py Expression](./common_py_expression.md) -- [CommonResourceCreatedResponse](./common_resource_created_response.md) -- [CommonResourceDeletedResponse](./common_resource_deleted_response.md) -- [CommonResourceUpdatedResponse](./common_resource_updated_response.md) -- [Common Tool Ref](./common_tool_ref.md) -- [Common Uuid](./common_uuid.md) -- [Common Valid Python Identifier](./common_valid_python_identifier.md) -- [DocsBaseDocSearchRequest](./docs_base_doc_search_request.md) -- [DocsCreateDocRequest](./docs_create_doc_request.md) -- [Docs Create Doc Request Content](./docs_create_doc_request_content.md) -- [DocsDoc](./docs_doc.md) -- [Docs Doc Content](./docs_doc_content.md) -- [DocsDocOwner](./docs_doc_owner.md) -- [Docs Doc Owner Role](./docs_doc_owner_role.md) -- [DocsDocReference](./docs_doc_reference.md) -- [DocsDocSearchResponse](./docs_doc_search_response.md) -- [DocsEmbedQueryRequest](./docs_embed_query_request.md) -- [Docs Embed Query Request Text](./docs_embed_query_request_text.md) -- [DocsEmbedQueryResponse](./docs_embed_query_response.md) -- [DocsHybridDocSearchRequest](./docs_hybrid_doc_search_request.md) -- [DocsSnippet](./docs_snippet.md) -- [DocsTextOnlyDocSearchRequest](./docs_text_only_doc_search_request.md) -- [DocsVectorDocSearchRequest](./docs_vector_doc_search_request.md) -- [EntriesBaseEntry](./entries_base_entry.md) -- [Entries Base Entry Content](./entries_base_entry_content.md) -- [Entries Base Entry Content Item](./entries_base_entry_content_item.md) -- [Entries Base Entry Content Item Item](./entries_base_entry_content_item_item.md) -- [Entries Base Entry Source](./entries_base_entry_source.md) -- [EntriesChatMlImageContentPart](./entries_chat_ml_image_content_part.md) -- [Entries Chat Ml Role](./entries_chat_ml_role.md) -- [EntriesChatMlTextContentPart](./entries_chat_ml_text_content_part.md) -- [EntriesEntry](./entries_entry.md) -- [EntriesHistory](./entries_history.md) -- [Entries Image Detail](./entries_image_detail.md) -- [EntriesImageUrl](./entries_image_url.md) -- [EntriesInputChatMlMessage](./entries_input_chat_ml_message.md) -- [Entries Input Chat Ml Message Content](./entries_input_chat_ml_message_content.md) -- [Entries Input Chat Ml Message Content Item](./entries_input_chat_ml_message_content_item.md) -- [EntriesRelation](./entries_relation.md) -- [Execution Transitions Route List Request Direction](./execution_transitions_route_list_request_direction.md) -- [Execution Transitions Route List Request Sort By](./execution_transitions_route_list_request_sort_by.md) -- [ExecutionTransitionsRouteListResponse](./execution_transitions_route_list_response.md) -- [ExecutionTransitionsRouteListResponseResultsItem](./execution_transitions_route_list_response_results_item.md) -- [ExecutionsExecution](./executions_execution.md) -- [Executions Execution Status](./executions_execution_status.md) -- [ExecutionsResumeExecutionRequest](./executions_resume_execution_request.md) -- [ExecutionsStopExecutionRequest](./executions_stop_execution_request.md) -- [ExecutionsTransition](./executions_transition.md) -- [ExecutionsTransitionTarget](./executions_transition_target.md) -- [Executions Transition Type](./executions_transition_type.md) -- [Executions Update Execution Request](./executions_update_execution_request.md) -- [Jobs Job State](./jobs_job_state.md) -- [JobsJobStatus](./jobs_job_status.md) -- [Sessions Context Overflow Type](./sessions_context_overflow_type.md) -- [SessionsCreateOrUpdateSessionRequest](./sessions_create_or_update_session_request.md) -- [SessionsCreateSessionRequest](./sessions_create_session_request.md) -- [SessionsMultiAgentMultiUserSession](./sessions_multi_agent_multi_user_session.md) -- [SessionsMultiAgentNoUserSession](./sessions_multi_agent_no_user_session.md) -- [SessionsMultiAgentSingleUserSession](./sessions_multi_agent_single_user_session.md) -- [Sessions Route List Request Direction](./sessions_route_list_request_direction.md) -- [Sessions Route List Request Sort By](./sessions_route_list_request_sort_by.md) -- [SessionsRouteListResponse](./sessions_route_list_response.md) -- [Sessions Session](./sessions_session.md) -- [SessionsSingleAgentMultiUserSession](./sessions_single_agent_multi_user_session.md) -- [SessionsSingleAgentNoUserSession](./sessions_single_agent_no_user_session.md) -- [SessionsSingleAgentSingleUserSession](./sessions_single_agent_single_user_session.md) -- [Task Executions Route List Request Direction](./task_executions_route_list_request_direction.md) -- [Task Executions Route List Request Sort By](./task_executions_route_list_request_sort_by.md) -- [TaskExecutionsRouteListResponse](./task_executions_route_list_response.md) -- [Tasks Base Workflow Step](./tasks_base_workflow_step.md) -- [TasksCaseThen](./tasks_case_then.md) -- [Tasks Case Then Then](./tasks_case_then_then.md) -- [TasksCreateTaskRequest](./tasks_create_task_request.md) -- [Tasks Create Task Request Main Item](./tasks_create_task_request_main_item.md) -- [TasksEmbedStep](./tasks_embed_step.md) -- [TasksErrorWorkflowStep](./tasks_error_workflow_step.md) -- [TasksEvaluateStep](./tasks_evaluate_step.md) -- [TasksForeachDo](./tasks_foreach_do.md) -- [Tasks Foreach Do Do](./tasks_foreach_do_do.md) -- [TasksForeachStep](./tasks_foreach_step.md) -- [TasksGetStep](./tasks_get_step.md) -- [TasksIfElseWorkflowStep](./tasks_if_else_workflow_step.md) -- [Tasks If Else Workflow Step Else](./tasks_if_else_workflow_step_else.md) -- [Tasks If Else Workflow Step Then](./tasks_if_else_workflow_step_then.md) -- [TasksLogStep](./tasks_log_step.md) -- [TasksMapOver](./tasks_map_over.md) -- [TasksMapReduceStep](./tasks_map_reduce_step.md) -- [TasksParallelStep](./tasks_parallel_step.md) -- [Tasks Parallel Step Parallel Item](./tasks_parallel_step_parallel_item.md) -- [Tasks Patch Task Request Main Item](./tasks_patch_task_request_main_item.md) -- [TasksPromptStep](./tasks_prompt_step.md) -- [Tasks Prompt Step Prompt](./tasks_prompt_step_prompt.md) -- [TasksReturnStep](./tasks_return_step.md) -- [Tasks Route List Request Direction](./tasks_route_list_request_direction.md) -- [Tasks Route List Request Sort By](./tasks_route_list_request_sort_by.md) -- [TasksRouteListResponse](./tasks_route_list_response.md) -- [TasksSearchStep](./tasks_search_step.md) -- [Tasks Search Step Search](./tasks_search_step_search.md) -- [TasksSetKey](./tasks_set_key.md) -- [TasksSetStep](./tasks_set_step.md) -- [Tasks Set Step Set](./tasks_set_step_set.md) -- [TasksSleepFor](./tasks_sleep_for.md) -- [TasksSleepStep](./tasks_sleep_step.md) -- [TasksSwitchStep](./tasks_switch_step.md) -- [TasksTask](./tasks_task.md) -- [Tasks Task Main Item](./tasks_task_main_item.md) -- [TasksTaskTool](./tasks_task_tool.md) -- [TasksToolCallStep](./tasks_tool_call_step.md) -- [Tasks Update Task Request Main Item](./tasks_update_task_request_main_item.md) -- [TasksWaitForInputStep](./tasks_wait_for_input_step.md) -- [TasksYieldStep](./tasks_yield_step.md) -- [ToolsChosenFunctionCall](./tools_chosen_function_call.md) -- [Tools Chosen Tool Call](./tools_chosen_tool_call.md) -- [ToolsCreateToolRequest](./tools_create_tool_request.md) -- [ToolsFunctionCallOption](./tools_function_call_option.md) -- [ToolsFunctionDef](./tools_function_def.md) -- [ToolsFunctionTool](./tools_function_tool.md) -- [ToolsNamedFunctionChoice](./tools_named_function_choice.md) -- [Tools Named Tool Choice](./tools_named_tool_choice.md) -- [Tools Tool](./tools_tool.md) -- [ToolsToolResponse](./tools_tool_response.md) -- [Tools Tool Type](./tools_tool_type.md) -- [User Docs Route List Request Direction](./user_docs_route_list_request_direction.md) -- [User Docs Route List Request Sort By](./user_docs_route_list_request_sort_by.md) -- [UserDocsRouteListResponse](./user_docs_route_list_response.md) -- [User Docs Search Route Search Request Body](./user_docs_search_route_search_request_body.md) -- [UsersCreateOrUpdateUserRequest](./users_create_or_update_user_request.md) -- [UsersCreateUserRequest](./users_create_user_request.md) -- [Users Route List Request Direction](./users_route_list_request_direction.md) -- [Users Route List Request Sort By](./users_route_list_request_sort_by.md) -- [UsersRouteListResponse](./users_route_list_response.md) -- [UsersUser](./users_user.md) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/jobs_job_state.md b/docs/python-sdk-docs/julep/api/types/jobs_job_state.md deleted file mode 100644 index b5e138867..000000000 --- a/docs/python-sdk-docs/julep/api/types/jobs_job_state.md +++ /dev/null @@ -1,6 +0,0 @@ -# Jobs Job State - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Jobs Job State - -> Auto-generated documentation for [julep.api.types.jobs_job_state](../../../../../../../julep/api/types/jobs_job_state.py) module. -- [Jobs Job State](#jobs-job-state) diff --git a/docs/python-sdk-docs/julep/api/types/jobs_job_status.md b/docs/python-sdk-docs/julep/api/types/jobs_job_status.md deleted file mode 100644 index 2055a3811..000000000 --- a/docs/python-sdk-docs/julep/api/types/jobs_job_status.md +++ /dev/null @@ -1,38 +0,0 @@ -# JobsJobStatus - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / JobsJobStatus - -> Auto-generated documentation for [julep.api.types.jobs_job_status](../../../../../../../julep/api/types/jobs_job_status.py) module. - -- [JobsJobStatus](#jobsjobstatus) - - [JobsJobStatus](#jobsjobstatus-1) - -## JobsJobStatus - -[Show source in jobs_job_status.py:13](../../../../../../../julep/api/types/jobs_job_status.py#L13) - -#### Signature - -```python -class JobsJobStatus(pydantic_v1.BaseModel): ... -``` - -### JobsJobStatus().dict - -[Show source in jobs_job_status.py:58](../../../../../../../julep/api/types/jobs_job_status.py#L58) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### JobsJobStatus().json - -[Show source in jobs_job_status.py:50](../../../../../../../julep/api/types/jobs_job_status.py#L50) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_context_overflow_type.md b/docs/python-sdk-docs/julep/api/types/sessions_context_overflow_type.md deleted file mode 100644 index 4009e89ec..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_context_overflow_type.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sessions Context Overflow Type - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Sessions Context Overflow Type - -> Auto-generated documentation for [julep.api.types.sessions_context_overflow_type](../../../../../../../julep/api/types/sessions_context_overflow_type.py) module. -- [Sessions Context Overflow Type](#sessions-context-overflow-type) diff --git a/docs/python-sdk-docs/julep/api/types/sessions_create_or_update_session_request.md b/docs/python-sdk-docs/julep/api/types/sessions_create_or_update_session_request.md deleted file mode 100644 index d94fcfd40..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_create_or_update_session_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsCreateOrUpdateSessionRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsCreateOrUpdateSessionRequest - -> Auto-generated documentation for [julep.api.types.sessions_create_or_update_session_request](../../../../../../../julep/api/types/sessions_create_or_update_session_request.py) module. - -- [SessionsCreateOrUpdateSessionRequest](#sessionscreateorupdatesessionrequest) - - [SessionsCreateOrUpdateSessionRequest](#sessionscreateorupdatesessionrequest-1) - -## SessionsCreateOrUpdateSessionRequest - -[Show source in sessions_create_or_update_session_request.py:12](../../../../../../../julep/api/types/sessions_create_or_update_session_request.py#L12) - -#### Signature - -```python -class SessionsCreateOrUpdateSessionRequest(pydantic_v1.BaseModel): ... -``` - -### SessionsCreateOrUpdateSessionRequest().dict - -[Show source in sessions_create_or_update_session_request.py:57](../../../../../../../julep/api/types/sessions_create_or_update_session_request.py#L57) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsCreateOrUpdateSessionRequest().json - -[Show source in sessions_create_or_update_session_request.py:49](../../../../../../../julep/api/types/sessions_create_or_update_session_request.py#L49) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_create_session_request.md b/docs/python-sdk-docs/julep/api/types/sessions_create_session_request.md deleted file mode 100644 index d9b07631d..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_create_session_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# SessionsCreateSessionRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsCreateSessionRequest - -> Auto-generated documentation for [julep.api.types.sessions_create_session_request](../../../../../../../julep/api/types/sessions_create_session_request.py) module. - -- [SessionsCreateSessionRequest](#sessionscreatesessionrequest) - - [SessionsCreateSessionRequest](#sessionscreatesessionrequest-1) - -## SessionsCreateSessionRequest - -[Show source in sessions_create_session_request.py:12](../../../../../../../julep/api/types/sessions_create_session_request.py#L12) - -Payload for creating a session - -#### Signature - -```python -class SessionsCreateSessionRequest(pydantic_v1.BaseModel): ... -``` - -### SessionsCreateSessionRequest().dict - -[Show source in sessions_create_session_request.py:61](../../../../../../../julep/api/types/sessions_create_session_request.py#L61) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsCreateSessionRequest().json - -[Show source in sessions_create_session_request.py:53](../../../../../../../julep/api/types/sessions_create_session_request.py#L53) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_multi_user_session.md b/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_multi_user_session.md deleted file mode 100644 index f7c407cbd..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_multi_user_session.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsMultiAgentMultiUserSession - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsMultiAgentMultiUserSession - -> Auto-generated documentation for [julep.api.types.sessions_multi_agent_multi_user_session](../../../../../../../julep/api/types/sessions_multi_agent_multi_user_session.py) module. - -- [SessionsMultiAgentMultiUserSession](#sessionsmultiagentmultiusersession) - - [SessionsMultiAgentMultiUserSession](#sessionsmultiagentmultiusersession-1) - -## SessionsMultiAgentMultiUserSession - -[Show source in sessions_multi_agent_multi_user_session.py:11](../../../../../../../julep/api/types/sessions_multi_agent_multi_user_session.py#L11) - -#### Signature - -```python -class SessionsMultiAgentMultiUserSession(pydantic_v1.BaseModel): ... -``` - -### SessionsMultiAgentMultiUserSession().dict - -[Show source in sessions_multi_agent_multi_user_session.py:23](../../../../../../../julep/api/types/sessions_multi_agent_multi_user_session.py#L23) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsMultiAgentMultiUserSession().json - -[Show source in sessions_multi_agent_multi_user_session.py:15](../../../../../../../julep/api/types/sessions_multi_agent_multi_user_session.py#L15) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_no_user_session.md b/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_no_user_session.md deleted file mode 100644 index a6ad4554f..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_no_user_session.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsMultiAgentNoUserSession - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsMultiAgentNoUserSession - -> Auto-generated documentation for [julep.api.types.sessions_multi_agent_no_user_session](../../../../../../../julep/api/types/sessions_multi_agent_no_user_session.py) module. - -- [SessionsMultiAgentNoUserSession](#sessionsmultiagentnousersession) - - [SessionsMultiAgentNoUserSession](#sessionsmultiagentnousersession-1) - -## SessionsMultiAgentNoUserSession - -[Show source in sessions_multi_agent_no_user_session.py:11](../../../../../../../julep/api/types/sessions_multi_agent_no_user_session.py#L11) - -#### Signature - -```python -class SessionsMultiAgentNoUserSession(pydantic_v1.BaseModel): ... -``` - -### SessionsMultiAgentNoUserSession().dict - -[Show source in sessions_multi_agent_no_user_session.py:22](../../../../../../../julep/api/types/sessions_multi_agent_no_user_session.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsMultiAgentNoUserSession().json - -[Show source in sessions_multi_agent_no_user_session.py:14](../../../../../../../julep/api/types/sessions_multi_agent_no_user_session.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_single_user_session.md b/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_single_user_session.md deleted file mode 100644 index 77f842cfd..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_multi_agent_single_user_session.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsMultiAgentSingleUserSession - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsMultiAgentSingleUserSession - -> Auto-generated documentation for [julep.api.types.sessions_multi_agent_single_user_session](../../../../../../../julep/api/types/sessions_multi_agent_single_user_session.py) module. - -- [SessionsMultiAgentSingleUserSession](#sessionsmultiagentsingleusersession) - - [SessionsMultiAgentSingleUserSession](#sessionsmultiagentsingleusersession-1) - -## SessionsMultiAgentSingleUserSession - -[Show source in sessions_multi_agent_single_user_session.py:11](../../../../../../../julep/api/types/sessions_multi_agent_single_user_session.py#L11) - -#### Signature - -```python -class SessionsMultiAgentSingleUserSession(pydantic_v1.BaseModel): ... -``` - -### SessionsMultiAgentSingleUserSession().dict - -[Show source in sessions_multi_agent_single_user_session.py:23](../../../../../../../julep/api/types/sessions_multi_agent_single_user_session.py#L23) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsMultiAgentSingleUserSession().json - -[Show source in sessions_multi_agent_single_user_session.py:15](../../../../../../../julep/api/types/sessions_multi_agent_single_user_session.py#L15) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/sessions_route_list_request_direction.md deleted file mode 100644 index d23a5296e..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sessions Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Sessions Route List Request Direction - -> Auto-generated documentation for [julep.api.types.sessions_route_list_request_direction](../../../../../../../julep/api/types/sessions_route_list_request_direction.py) module. -- [Sessions Route List Request Direction](#sessions-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/sessions_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/sessions_route_list_request_sort_by.md deleted file mode 100644 index 0b38dd9b4..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sessions Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Sessions Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.sessions_route_list_request_sort_by](../../../../../../../julep/api/types/sessions_route_list_request_sort_by.py) module. -- [Sessions Route List Request Sort By](#sessions-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/sessions_route_list_response.md b/docs/python-sdk-docs/julep/api/types/sessions_route_list_response.md deleted file mode 100644 index 5d5e37ed3..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsRouteListResponse - -> Auto-generated documentation for [julep.api.types.sessions_route_list_response](../../../../../../../julep/api/types/sessions_route_list_response.py) module. - -- [SessionsRouteListResponse](#sessionsroutelistresponse) - - [SessionsRouteListResponse](#sessionsroutelistresponse-1) - -## SessionsRouteListResponse - -[Show source in sessions_route_list_response.py:11](../../../../../../../julep/api/types/sessions_route_list_response.py#L11) - -#### Signature - -```python -class SessionsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### SessionsRouteListResponse().dict - -[Show source in sessions_route_list_response.py:22](../../../../../../../julep/api/types/sessions_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsRouteListResponse().json - -[Show source in sessions_route_list_response.py:14](../../../../../../../julep/api/types/sessions_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_session.md b/docs/python-sdk-docs/julep/api/types/sessions_session.md deleted file mode 100644 index 6bba8275e..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_session.md +++ /dev/null @@ -1,260 +0,0 @@ -# Sessions Session - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Sessions Session - -> Auto-generated documentation for [julep.api.types.sessions_session](../../../../../../../julep/api/types/sessions_session.py) module. - -- [Sessions Session](#sessions-session) - - [Base](#base) - - [SessionsSession_MultiAgentMultiUser](#sessionssession_multiagentmultiuser) - - [SessionsSession_MultiAgentNoUser](#sessionssession_multiagentnouser) - - [SessionsSession_MultiAgentSingleUser](#sessionssession_multiagentsingleuser) - - [SessionsSession_SingleAgentMultiUser](#sessionssession_singleagentmultiuser) - - [SessionsSession_SingleAgentNoUser](#sessionssession_singleagentnouser) - - [SessionsSession_SingleAgentSingleUser](#sessionssession_singleagentsingleuser) - -## Base - -[Show source in sessions_session.py:14](../../../../../../../julep/api/types/sessions_session.py#L14) - -#### Signature - -```python -class Base(pydantic_v1.BaseModel): ... -``` - -### Base().dict - -[Show source in sessions_session.py:62](../../../../../../../julep/api/types/sessions_session.py#L62) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### Base().json - -[Show source in sessions_session.py:54](../../../../../../../julep/api/types/sessions_session.py#L54) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## SessionsSession_MultiAgentMultiUser - -[Show source in sessions_session.py:279](../../../../../../../julep/api/types/sessions_session.py#L279) - -#### Signature - -```python -class SessionsSession_MultiAgentMultiUser(Base): ... -``` - -#### See also - -- [Base](#base) - -### SessionsSession_MultiAgentMultiUser().dict - -[Show source in sessions_session.py:292](../../../../../../../julep/api/types/sessions_session.py#L292) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSession_MultiAgentMultiUser().json - -[Show source in sessions_session.py:284](../../../../../../../julep/api/types/sessions_session.py#L284) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## SessionsSession_MultiAgentNoUser - -[Show source in sessions_session.py:202](../../../../../../../julep/api/types/sessions_session.py#L202) - -#### Signature - -```python -class SessionsSession_MultiAgentNoUser(Base): ... -``` - -#### See also - -- [Base](#base) - -### SessionsSession_MultiAgentNoUser().dict - -[Show source in sessions_session.py:214](../../../../../../../julep/api/types/sessions_session.py#L214) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSession_MultiAgentNoUser().json - -[Show source in sessions_session.py:206](../../../../../../../julep/api/types/sessions_session.py#L206) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## SessionsSession_MultiAgentSingleUser - -[Show source in sessions_session.py:240](../../../../../../../julep/api/types/sessions_session.py#L240) - -#### Signature - -```python -class SessionsSession_MultiAgentSingleUser(Base): ... -``` - -#### See also - -- [Base](#base) - -### SessionsSession_MultiAgentSingleUser().dict - -[Show source in sessions_session.py:253](../../../../../../../julep/api/types/sessions_session.py#L253) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSession_MultiAgentSingleUser().json - -[Show source in sessions_session.py:245](../../../../../../../julep/api/types/sessions_session.py#L245) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## SessionsSession_SingleAgentMultiUser - -[Show source in sessions_session.py:163](../../../../../../../julep/api/types/sessions_session.py#L163) - -#### Signature - -```python -class SessionsSession_SingleAgentMultiUser(Base): ... -``` - -#### See also - -- [Base](#base) - -### SessionsSession_SingleAgentMultiUser().dict - -[Show source in sessions_session.py:176](../../../../../../../julep/api/types/sessions_session.py#L176) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSession_SingleAgentMultiUser().json - -[Show source in sessions_session.py:168](../../../../../../../julep/api/types/sessions_session.py#L168) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## SessionsSession_SingleAgentNoUser - -[Show source in sessions_session.py:86](../../../../../../../julep/api/types/sessions_session.py#L86) - -#### Signature - -```python -class SessionsSession_SingleAgentNoUser(Base): ... -``` - -#### See also - -- [Base](#base) - -### SessionsSession_SingleAgentNoUser().dict - -[Show source in sessions_session.py:98](../../../../../../../julep/api/types/sessions_session.py#L98) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSession_SingleAgentNoUser().json - -[Show source in sessions_session.py:90](../../../../../../../julep/api/types/sessions_session.py#L90) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## SessionsSession_SingleAgentSingleUser - -[Show source in sessions_session.py:124](../../../../../../../julep/api/types/sessions_session.py#L124) - -#### Signature - -```python -class SessionsSession_SingleAgentSingleUser(Base): ... -``` - -#### See also - -- [Base](#base) - -### SessionsSession_SingleAgentSingleUser().dict - -[Show source in sessions_session.py:137](../../../../../../../julep/api/types/sessions_session.py#L137) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSession_SingleAgentSingleUser().json - -[Show source in sessions_session.py:129](../../../../../../../julep/api/types/sessions_session.py#L129) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_single_agent_multi_user_session.md b/docs/python-sdk-docs/julep/api/types/sessions_single_agent_multi_user_session.md deleted file mode 100644 index caccf2166..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_single_agent_multi_user_session.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsSingleAgentMultiUserSession - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsSingleAgentMultiUserSession - -> Auto-generated documentation for [julep.api.types.sessions_single_agent_multi_user_session](../../../../../../../julep/api/types/sessions_single_agent_multi_user_session.py) module. - -- [SessionsSingleAgentMultiUserSession](#sessionssingleagentmultiusersession) - - [SessionsSingleAgentMultiUserSession](#sessionssingleagentmultiusersession-1) - -## SessionsSingleAgentMultiUserSession - -[Show source in sessions_single_agent_multi_user_session.py:11](../../../../../../../julep/api/types/sessions_single_agent_multi_user_session.py#L11) - -#### Signature - -```python -class SessionsSingleAgentMultiUserSession(pydantic_v1.BaseModel): ... -``` - -### SessionsSingleAgentMultiUserSession().dict - -[Show source in sessions_single_agent_multi_user_session.py:23](../../../../../../../julep/api/types/sessions_single_agent_multi_user_session.py#L23) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSingleAgentMultiUserSession().json - -[Show source in sessions_single_agent_multi_user_session.py:15](../../../../../../../julep/api/types/sessions_single_agent_multi_user_session.py#L15) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_single_agent_no_user_session.md b/docs/python-sdk-docs/julep/api/types/sessions_single_agent_no_user_session.md deleted file mode 100644 index 0f45b6d06..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_single_agent_no_user_session.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsSingleAgentNoUserSession - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsSingleAgentNoUserSession - -> Auto-generated documentation for [julep.api.types.sessions_single_agent_no_user_session](../../../../../../../julep/api/types/sessions_single_agent_no_user_session.py) module. - -- [SessionsSingleAgentNoUserSession](#sessionssingleagentnousersession) - - [SessionsSingleAgentNoUserSession](#sessionssingleagentnousersession-1) - -## SessionsSingleAgentNoUserSession - -[Show source in sessions_single_agent_no_user_session.py:11](../../../../../../../julep/api/types/sessions_single_agent_no_user_session.py#L11) - -#### Signature - -```python -class SessionsSingleAgentNoUserSession(pydantic_v1.BaseModel): ... -``` - -### SessionsSingleAgentNoUserSession().dict - -[Show source in sessions_single_agent_no_user_session.py:22](../../../../../../../julep/api/types/sessions_single_agent_no_user_session.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSingleAgentNoUserSession().json - -[Show source in sessions_single_agent_no_user_session.py:14](../../../../../../../julep/api/types/sessions_single_agent_no_user_session.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/sessions_single_agent_single_user_session.md b/docs/python-sdk-docs/julep/api/types/sessions_single_agent_single_user_session.md deleted file mode 100644 index be8bab1e7..000000000 --- a/docs/python-sdk-docs/julep/api/types/sessions_single_agent_single_user_session.md +++ /dev/null @@ -1,38 +0,0 @@ -# SessionsSingleAgentSingleUserSession - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / SessionsSingleAgentSingleUserSession - -> Auto-generated documentation for [julep.api.types.sessions_single_agent_single_user_session](../../../../../../../julep/api/types/sessions_single_agent_single_user_session.py) module. - -- [SessionsSingleAgentSingleUserSession](#sessionssingleagentsingleusersession) - - [SessionsSingleAgentSingleUserSession](#sessionssingleagentsingleusersession-1) - -## SessionsSingleAgentSingleUserSession - -[Show source in sessions_single_agent_single_user_session.py:11](../../../../../../../julep/api/types/sessions_single_agent_single_user_session.py#L11) - -#### Signature - -```python -class SessionsSingleAgentSingleUserSession(pydantic_v1.BaseModel): ... -``` - -### SessionsSingleAgentSingleUserSession().dict - -[Show source in sessions_single_agent_single_user_session.py:23](../../../../../../../julep/api/types/sessions_single_agent_single_user_session.py#L23) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### SessionsSingleAgentSingleUserSession().json - -[Show source in sessions_single_agent_single_user_session.py:15](../../../../../../../julep/api/types/sessions_single_agent_single_user_session.py#L15) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_direction.md deleted file mode 100644 index eca88dcfc..000000000 --- a/docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Task Executions Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Task Executions Route List Request Direction - -> Auto-generated documentation for [julep.api.types.task_executions_route_list_request_direction](../../../../../../../julep/api/types/task_executions_route_list_request_direction.py) module. -- [Task Executions Route List Request Direction](#task-executions-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_sort_by.md deleted file mode 100644 index 19c4abc9a..000000000 --- a/docs/python-sdk-docs/julep/api/types/task_executions_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Task Executions Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Task Executions Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.task_executions_route_list_request_sort_by](../../../../../../../julep/api/types/task_executions_route_list_request_sort_by.py) module. -- [Task Executions Route List Request Sort By](#task-executions-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/task_executions_route_list_response.md b/docs/python-sdk-docs/julep/api/types/task_executions_route_list_response.md deleted file mode 100644 index 3ed80a5bd..000000000 --- a/docs/python-sdk-docs/julep/api/types/task_executions_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# TaskExecutionsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TaskExecutionsRouteListResponse - -> Auto-generated documentation for [julep.api.types.task_executions_route_list_response](../../../../../../../julep/api/types/task_executions_route_list_response.py) module. - -- [TaskExecutionsRouteListResponse](#taskexecutionsroutelistresponse) - - [TaskExecutionsRouteListResponse](#taskexecutionsroutelistresponse-1) - -## TaskExecutionsRouteListResponse - -[Show source in task_executions_route_list_response.py:11](../../../../../../../julep/api/types/task_executions_route_list_response.py#L11) - -#### Signature - -```python -class TaskExecutionsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### TaskExecutionsRouteListResponse().dict - -[Show source in task_executions_route_list_response.py:22](../../../../../../../julep/api/types/task_executions_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TaskExecutionsRouteListResponse().json - -[Show source in task_executions_route_list_response.py:14](../../../../../../../julep/api/types/task_executions_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_base_workflow_step.md b/docs/python-sdk-docs/julep/api/types/tasks_base_workflow_step.md deleted file mode 100644 index 21731b101..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_base_workflow_step.md +++ /dev/null @@ -1,566 +0,0 @@ -# Tasks Base Workflow Step - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Base Workflow Step - -> Auto-generated documentation for [julep.api.types.tasks_base_workflow_step](../../../../../../../julep/api/types/tasks_base_workflow_step.py) module. - -- [Tasks Base Workflow Step](#tasks-base-workflow-step) - - [TasksBaseWorkflowStep_Embed](#tasksbaseworkflowstep_embed) - - [TasksBaseWorkflowStep_Error](#tasksbaseworkflowstep_error) - - [TasksBaseWorkflowStep_Foreach](#tasksbaseworkflowstep_foreach) - - [TasksBaseWorkflowStep_Get](#tasksbaseworkflowstep_get) - - [TasksBaseWorkflowStep_IfElse](#tasksbaseworkflowstep_ifelse) - - [TasksBaseWorkflowStep_Log](#tasksbaseworkflowstep_log) - - [TasksBaseWorkflowStep_MapReduce](#tasksbaseworkflowstep_mapreduce) - - [TasksBaseWorkflowStep_Parallel](#tasksbaseworkflowstep_parallel) - - [TasksBaseWorkflowStep_Prompt](#tasksbaseworkflowstep_prompt) - - [TasksBaseWorkflowStep_Return](#tasksbaseworkflowstep_return) - - [TasksBaseWorkflowStep_Search](#tasksbaseworkflowstep_search) - - [TasksBaseWorkflowStep_Set](#tasksbaseworkflowstep_set) - - [TasksBaseWorkflowStep_Sleep](#tasksbaseworkflowstep_sleep) - - [TasksBaseWorkflowStep_Switch](#tasksbaseworkflowstep_switch) - - [TasksBaseWorkflowStep_ToolCall](#tasksbaseworkflowstep_toolcall) - - [TasksBaseWorkflowStep_WaitForInput](#tasksbaseworkflowstep_waitforinput) - - [TasksBaseWorkflowStep_Yield](#tasksbaseworkflowstep_yield) - -## TasksBaseWorkflowStep_Embed - -[Show source in tasks_base_workflow_step.py:373](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L373) - -#### Signature - -```python -class TasksBaseWorkflowStep_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Embed().dict - -[Show source in tasks_base_workflow_step.py:385](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L385) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Embed().json - -[Show source in tasks_base_workflow_step.py:377](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L377) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Error - -[Show source in tasks_base_workflow_step.py:145](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L145) - -#### Signature - -```python -class TasksBaseWorkflowStep_Error(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Error().dict - -[Show source in tasks_base_workflow_step.py:157](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L157) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Error().json - -[Show source in tasks_base_workflow_step.py:149](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L149) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Foreach - -[Show source in tasks_base_workflow_step.py:569](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L569) - -#### Signature - -```python -class TasksBaseWorkflowStep_Foreach(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Foreach().dict - -[Show source in tasks_base_workflow_step.py:583](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L583) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Foreach().json - -[Show source in tasks_base_workflow_step.py:575](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L575) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Get - -[Show source in tasks_base_workflow_step.py:259](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L259) - -#### Signature - -```python -class TasksBaseWorkflowStep_Get(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Get().dict - -[Show source in tasks_base_workflow_step.py:271](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L271) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Get().json - -[Show source in tasks_base_workflow_step.py:263](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L263) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_IfElse - -[Show source in tasks_base_workflow_step.py:489](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L489) - -#### Signature - -```python -class TasksBaseWorkflowStep_IfElse(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_IfElse().dict - -[Show source in tasks_base_workflow_step.py:505](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L505) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_IfElse().json - -[Show source in tasks_base_workflow_step.py:497](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L497) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Log - -[Show source in tasks_base_workflow_step.py:335](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L335) - -#### Signature - -```python -class TasksBaseWorkflowStep_Log(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Log().dict - -[Show source in tasks_base_workflow_step.py:347](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L347) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Log().json - -[Show source in tasks_base_workflow_step.py:339](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L339) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_MapReduce - -[Show source in tasks_base_workflow_step.py:649](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L649) - -#### Signature - -```python -class TasksBaseWorkflowStep_MapReduce(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_MapReduce().dict - -[Show source in tasks_base_workflow_step.py:664](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L664) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_MapReduce().json - -[Show source in tasks_base_workflow_step.py:656](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L656) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Parallel - -[Show source in tasks_base_workflow_step.py:609](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L609) - -#### Signature - -```python -class TasksBaseWorkflowStep_Parallel(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Parallel().dict - -[Show source in tasks_base_workflow_step.py:623](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L623) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Parallel().json - -[Show source in tasks_base_workflow_step.py:615](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L615) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Prompt - -[Show source in tasks_base_workflow_step.py:106](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L106) - -#### Signature - -```python -class TasksBaseWorkflowStep_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Prompt().dict - -[Show source in tasks_base_workflow_step.py:119](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L119) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Prompt().json - -[Show source in tasks_base_workflow_step.py:111](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L111) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Return - -[Show source in tasks_base_workflow_step.py:221](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L221) - -#### Signature - -```python -class TasksBaseWorkflowStep_Return(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Return().dict - -[Show source in tasks_base_workflow_step.py:233](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L233) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Return().json - -[Show source in tasks_base_workflow_step.py:225](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L225) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Search - -[Show source in tasks_base_workflow_step.py:411](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L411) - -#### Signature - -```python -class TasksBaseWorkflowStep_Search(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Search().dict - -[Show source in tasks_base_workflow_step.py:423](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L423) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Search().json - -[Show source in tasks_base_workflow_step.py:415](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L415) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Set - -[Show source in tasks_base_workflow_step.py:297](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L297) - -#### Signature - -```python -class TasksBaseWorkflowStep_Set(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Set().dict - -[Show source in tasks_base_workflow_step.py:309](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L309) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Set().json - -[Show source in tasks_base_workflow_step.py:301](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L301) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Sleep - -[Show source in tasks_base_workflow_step.py:183](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L183) - -#### Signature - -```python -class TasksBaseWorkflowStep_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Sleep().dict - -[Show source in tasks_base_workflow_step.py:195](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L195) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Sleep().json - -[Show source in tasks_base_workflow_step.py:187](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L187) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Switch - -[Show source in tasks_base_workflow_step.py:531](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L531) - -#### Signature - -```python -class TasksBaseWorkflowStep_Switch(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Switch().dict - -[Show source in tasks_base_workflow_step.py:543](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L543) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Switch().json - -[Show source in tasks_base_workflow_step.py:535](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L535) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_ToolCall - -[Show source in tasks_base_workflow_step.py:26](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L26) - -#### Signature - -```python -class TasksBaseWorkflowStep_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_ToolCall().dict - -[Show source in tasks_base_workflow_step.py:41](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L41) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_ToolCall().json - -[Show source in tasks_base_workflow_step.py:33](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L33) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_WaitForInput - -[Show source in tasks_base_workflow_step.py:449](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L449) - -#### Signature - -```python -class TasksBaseWorkflowStep_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_WaitForInput().dict - -[Show source in tasks_base_workflow_step.py:463](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_WaitForInput().json - -[Show source in tasks_base_workflow_step.py:455](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksBaseWorkflowStep_Yield - -[Show source in tasks_base_workflow_step.py:67](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L67) - -#### Signature - -```python -class TasksBaseWorkflowStep_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksBaseWorkflowStep_Yield().dict - -[Show source in tasks_base_workflow_step.py:80](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L80) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksBaseWorkflowStep_Yield().json - -[Show source in tasks_base_workflow_step.py:72](../../../../../../../julep/api/types/tasks_base_workflow_step.py#L72) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_case_then.md b/docs/python-sdk-docs/julep/api/types/tasks_case_then.md deleted file mode 100644 index 388ee34d0..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_case_then.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksCaseThen - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksCaseThen - -> Auto-generated documentation for [julep.api.types.tasks_case_then](../../../../../../../julep/api/types/tasks_case_then.py) module. - -- [TasksCaseThen](#taskscasethen) - - [TasksCaseThen](#taskscasethen-1) - -## TasksCaseThen - -[Show source in tasks_case_then.py:12](../../../../../../../julep/api/types/tasks_case_then.py#L12) - -#### Signature - -```python -class TasksCaseThen(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThen().dict - -[Show source in tasks_case_then.py:31](../../../../../../../julep/api/types/tasks_case_then.py#L31) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThen().json - -[Show source in tasks_case_then.py:23](../../../../../../../julep/api/types/tasks_case_then.py#L23) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_case_then_then.md b/docs/python-sdk-docs/julep/api/types/tasks_case_then_then.md deleted file mode 100644 index dc1a9eb70..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_case_then_then.md +++ /dev/null @@ -1,460 +0,0 @@ -# Tasks Case Then Then - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Case Then Then - -> Auto-generated documentation for [julep.api.types.tasks_case_then_then](../../../../../../../julep/api/types/tasks_case_then_then.py) module. - -- [Tasks Case Then Then](#tasks-case-then-then) - - [TasksCaseThenThen_Embed](#taskscasethenthen_embed) - - [TasksCaseThenThen_Error](#taskscasethenthen_error) - - [TasksCaseThenThen_Evaluate](#taskscasethenthen_evaluate) - - [TasksCaseThenThen_Get](#taskscasethenthen_get) - - [TasksCaseThenThen_Log](#taskscasethenthen_log) - - [TasksCaseThenThen_Prompt](#taskscasethenthen_prompt) - - [TasksCaseThenThen_Return](#taskscasethenthen_return) - - [TasksCaseThenThen_Search](#taskscasethenthen_search) - - [TasksCaseThenThen_Set](#taskscasethenthen_set) - - [TasksCaseThenThen_Sleep](#taskscasethenthen_sleep) - - [TasksCaseThenThen_ToolCall](#taskscasethenthen_toolcall) - - [TasksCaseThenThen_WaitForInput](#taskscasethenthen_waitforinput) - - [TasksCaseThenThen_Yield](#taskscasethenthen_yield) - -## TasksCaseThenThen_Embed - -[Show source in tasks_case_then_then.py:447](../../../../../../../julep/api/types/tasks_case_then_then.py#L447) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Embed().dict - -[Show source in tasks_case_then_then.py:463](../../../../../../../julep/api/types/tasks_case_then_then.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Embed().json - -[Show source in tasks_case_then_then.py:455](../../../../../../../julep/api/types/tasks_case_then_then.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Error - -[Show source in tasks_case_then_then.py:195](../../../../../../../julep/api/types/tasks_case_then_then.py#L195) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Error(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Error().dict - -[Show source in tasks_case_then_then.py:211](../../../../../../../julep/api/types/tasks_case_then_then.py#L211) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Error().json - -[Show source in tasks_case_then_then.py:203](../../../../../../../julep/api/types/tasks_case_then_then.py#L203) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Evaluate - -[Show source in tasks_case_then_then.py:20](../../../../../../../julep/api/types/tasks_case_then_then.py#L20) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Evaluate().dict - -[Show source in tasks_case_then_then.py:38](../../../../../../../julep/api/types/tasks_case_then_then.py#L38) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Evaluate().json - -[Show source in tasks_case_then_then.py:30](../../../../../../../julep/api/types/tasks_case_then_then.py#L30) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Get - -[Show source in tasks_case_then_then.py:321](../../../../../../../julep/api/types/tasks_case_then_then.py#L321) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Get(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Get().dict - -[Show source in tasks_case_then_then.py:337](../../../../../../../julep/api/types/tasks_case_then_then.py#L337) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Get().json - -[Show source in tasks_case_then_then.py:329](../../../../../../../julep/api/types/tasks_case_then_then.py#L329) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Log - -[Show source in tasks_case_then_then.py:405](../../../../../../../julep/api/types/tasks_case_then_then.py#L405) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Log(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Log().dict - -[Show source in tasks_case_then_then.py:421](../../../../../../../julep/api/types/tasks_case_then_then.py#L421) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Log().json - -[Show source in tasks_case_then_then.py:413](../../../../../../../julep/api/types/tasks_case_then_then.py#L413) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Prompt - -[Show source in tasks_case_then_then.py:152](../../../../../../../julep/api/types/tasks_case_then_then.py#L152) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Prompt().dict - -[Show source in tasks_case_then_then.py:169](../../../../../../../julep/api/types/tasks_case_then_then.py#L169) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Prompt().json - -[Show source in tasks_case_then_then.py:161](../../../../../../../julep/api/types/tasks_case_then_then.py#L161) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Return - -[Show source in tasks_case_then_then.py:279](../../../../../../../julep/api/types/tasks_case_then_then.py#L279) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Return(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Return().dict - -[Show source in tasks_case_then_then.py:295](../../../../../../../julep/api/types/tasks_case_then_then.py#L295) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Return().json - -[Show source in tasks_case_then_then.py:287](../../../../../../../julep/api/types/tasks_case_then_then.py#L287) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Search - -[Show source in tasks_case_then_then.py:489](../../../../../../../julep/api/types/tasks_case_then_then.py#L489) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Search(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Search().dict - -[Show source in tasks_case_then_then.py:505](../../../../../../../julep/api/types/tasks_case_then_then.py#L505) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Search().json - -[Show source in tasks_case_then_then.py:497](../../../../../../../julep/api/types/tasks_case_then_then.py#L497) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Set - -[Show source in tasks_case_then_then.py:363](../../../../../../../julep/api/types/tasks_case_then_then.py#L363) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Set(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Set().dict - -[Show source in tasks_case_then_then.py:379](../../../../../../../julep/api/types/tasks_case_then_then.py#L379) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Set().json - -[Show source in tasks_case_then_then.py:371](../../../../../../../julep/api/types/tasks_case_then_then.py#L371) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Sleep - -[Show source in tasks_case_then_then.py:237](../../../../../../../julep/api/types/tasks_case_then_then.py#L237) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Sleep().dict - -[Show source in tasks_case_then_then.py:253](../../../../../../../julep/api/types/tasks_case_then_then.py#L253) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Sleep().json - -[Show source in tasks_case_then_then.py:245](../../../../../../../julep/api/types/tasks_case_then_then.py#L245) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_ToolCall - -[Show source in tasks_case_then_then.py:64](../../../../../../../julep/api/types/tasks_case_then_then.py#L64) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_ToolCall().dict - -[Show source in tasks_case_then_then.py:83](../../../../../../../julep/api/types/tasks_case_then_then.py#L83) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_ToolCall().json - -[Show source in tasks_case_then_then.py:75](../../../../../../../julep/api/types/tasks_case_then_then.py#L75) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_WaitForInput - -[Show source in tasks_case_then_then.py:531](../../../../../../../julep/api/types/tasks_case_then_then.py#L531) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_WaitForInput().dict - -[Show source in tasks_case_then_then.py:549](../../../../../../../julep/api/types/tasks_case_then_then.py#L549) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_WaitForInput().json - -[Show source in tasks_case_then_then.py:541](../../../../../../../julep/api/types/tasks_case_then_then.py#L541) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCaseThenThen_Yield - -[Show source in tasks_case_then_then.py:109](../../../../../../../julep/api/types/tasks_case_then_then.py#L109) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksCaseThenThen_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksCaseThenThen_Yield().dict - -[Show source in tasks_case_then_then.py:126](../../../../../../../julep/api/types/tasks_case_then_then.py#L126) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCaseThenThen_Yield().json - -[Show source in tasks_case_then_then.py:118](../../../../../../../julep/api/types/tasks_case_then_then.py#L118) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_create_task_request.md b/docs/python-sdk-docs/julep/api/types/tasks_create_task_request.md deleted file mode 100644 index d49ae4afa..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_create_task_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# TasksCreateTaskRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksCreateTaskRequest - -> Auto-generated documentation for [julep.api.types.tasks_create_task_request](../../../../../../../julep/api/types/tasks_create_task_request.py) module. - -- [TasksCreateTaskRequest](#taskscreatetaskrequest) - - [TasksCreateTaskRequest](#taskscreatetaskrequest-1) - -## TasksCreateTaskRequest - -[Show source in tasks_create_task_request.py:12](../../../../../../../julep/api/types/tasks_create_task_request.py#L12) - -Payload for creating a task - -#### Signature - -```python -class TasksCreateTaskRequest(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequest().dict - -[Show source in tasks_create_task_request.py:51](../../../../../../../julep/api/types/tasks_create_task_request.py#L51) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequest().json - -[Show source in tasks_create_task_request.py:43](../../../../../../../julep/api/types/tasks_create_task_request.py#L43) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_create_task_request_main_item.md b/docs/python-sdk-docs/julep/api/types/tasks_create_task_request_main_item.md deleted file mode 100644 index a0105a35b..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_create_task_request_main_item.md +++ /dev/null @@ -1,599 +0,0 @@ -# Tasks Create Task Request Main Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Create Task Request Main Item - -> Auto-generated documentation for [julep.api.types.tasks_create_task_request_main_item](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py) module. - -- [Tasks Create Task Request Main Item](#tasks-create-task-request-main-item) - - [TasksCreateTaskRequestMainItem_Embed](#taskscreatetaskrequestmainitem_embed) - - [TasksCreateTaskRequestMainItem_Error](#taskscreatetaskrequestmainitem_error) - - [TasksCreateTaskRequestMainItem_Evaluate](#taskscreatetaskrequestmainitem_evaluate) - - [TasksCreateTaskRequestMainItem_Foreach](#taskscreatetaskrequestmainitem_foreach) - - [TasksCreateTaskRequestMainItem_Get](#taskscreatetaskrequestmainitem_get) - - [TasksCreateTaskRequestMainItem_IfElse](#taskscreatetaskrequestmainitem_ifelse) - - [TasksCreateTaskRequestMainItem_Log](#taskscreatetaskrequestmainitem_log) - - [TasksCreateTaskRequestMainItem_MapReduce](#taskscreatetaskrequestmainitem_mapreduce) - - [TasksCreateTaskRequestMainItem_Parallel](#taskscreatetaskrequestmainitem_parallel) - - [TasksCreateTaskRequestMainItem_Prompt](#taskscreatetaskrequestmainitem_prompt) - - [TasksCreateTaskRequestMainItem_Return](#taskscreatetaskrequestmainitem_return) - - [TasksCreateTaskRequestMainItem_Search](#taskscreatetaskrequestmainitem_search) - - [TasksCreateTaskRequestMainItem_Set](#taskscreatetaskrequestmainitem_set) - - [TasksCreateTaskRequestMainItem_Sleep](#taskscreatetaskrequestmainitem_sleep) - - [TasksCreateTaskRequestMainItem_Switch](#taskscreatetaskrequestmainitem_switch) - - [TasksCreateTaskRequestMainItem_ToolCall](#taskscreatetaskrequestmainitem_toolcall) - - [TasksCreateTaskRequestMainItem_WaitForInput](#taskscreatetaskrequestmainitem_waitforinput) - - [TasksCreateTaskRequestMainItem_Yield](#taskscreatetaskrequestmainitem_yield) - -## TasksCreateTaskRequestMainItem_Embed - -[Show source in tasks_create_task_request_main_item.py:413](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L413) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Embed().dict - -[Show source in tasks_create_task_request_main_item.py:425](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L425) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Embed().json - -[Show source in tasks_create_task_request_main_item.py:417](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L417) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Error - -[Show source in tasks_create_task_request_main_item.py:185](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L185) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Error(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Error().dict - -[Show source in tasks_create_task_request_main_item.py:197](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L197) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Error().json - -[Show source in tasks_create_task_request_main_item.py:189](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L189) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Evaluate - -[Show source in tasks_create_task_request_main_item.py:26](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L26) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Evaluate().dict - -[Show source in tasks_create_task_request_main_item.py:40](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L40) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Evaluate().json - -[Show source in tasks_create_task_request_main_item.py:32](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L32) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Foreach - -[Show source in tasks_create_task_request_main_item.py:609](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L609) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Foreach(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Foreach().dict - -[Show source in tasks_create_task_request_main_item.py:623](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L623) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Foreach().json - -[Show source in tasks_create_task_request_main_item.py:615](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L615) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Get - -[Show source in tasks_create_task_request_main_item.py:299](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L299) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Get(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Get().dict - -[Show source in tasks_create_task_request_main_item.py:311](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L311) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Get().json - -[Show source in tasks_create_task_request_main_item.py:303](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L303) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_IfElse - -[Show source in tasks_create_task_request_main_item.py:529](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L529) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_IfElse(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_IfElse().dict - -[Show source in tasks_create_task_request_main_item.py:545](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L545) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_IfElse().json - -[Show source in tasks_create_task_request_main_item.py:537](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L537) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Log - -[Show source in tasks_create_task_request_main_item.py:375](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L375) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Log(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Log().dict - -[Show source in tasks_create_task_request_main_item.py:387](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L387) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Log().json - -[Show source in tasks_create_task_request_main_item.py:379](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L379) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_MapReduce - -[Show source in tasks_create_task_request_main_item.py:689](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L689) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_MapReduce(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_MapReduce().dict - -[Show source in tasks_create_task_request_main_item.py:704](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L704) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_MapReduce().json - -[Show source in tasks_create_task_request_main_item.py:696](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L696) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Parallel - -[Show source in tasks_create_task_request_main_item.py:649](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L649) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Parallel(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Parallel().dict - -[Show source in tasks_create_task_request_main_item.py:663](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L663) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Parallel().json - -[Show source in tasks_create_task_request_main_item.py:655](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L655) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Prompt - -[Show source in tasks_create_task_request_main_item.py:146](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L146) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Prompt().dict - -[Show source in tasks_create_task_request_main_item.py:159](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L159) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Prompt().json - -[Show source in tasks_create_task_request_main_item.py:151](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L151) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Return - -[Show source in tasks_create_task_request_main_item.py:261](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L261) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Return(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Return().dict - -[Show source in tasks_create_task_request_main_item.py:273](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L273) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Return().json - -[Show source in tasks_create_task_request_main_item.py:265](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L265) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Search - -[Show source in tasks_create_task_request_main_item.py:451](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L451) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Search(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Search().dict - -[Show source in tasks_create_task_request_main_item.py:463](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Search().json - -[Show source in tasks_create_task_request_main_item.py:455](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Set - -[Show source in tasks_create_task_request_main_item.py:337](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L337) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Set(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Set().dict - -[Show source in tasks_create_task_request_main_item.py:349](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L349) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Set().json - -[Show source in tasks_create_task_request_main_item.py:341](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L341) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Sleep - -[Show source in tasks_create_task_request_main_item.py:223](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L223) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Sleep().dict - -[Show source in tasks_create_task_request_main_item.py:235](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L235) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Sleep().json - -[Show source in tasks_create_task_request_main_item.py:227](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L227) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Switch - -[Show source in tasks_create_task_request_main_item.py:571](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L571) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Switch(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Switch().dict - -[Show source in tasks_create_task_request_main_item.py:583](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L583) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Switch().json - -[Show source in tasks_create_task_request_main_item.py:575](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L575) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_ToolCall - -[Show source in tasks_create_task_request_main_item.py:66](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L66) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_ToolCall().dict - -[Show source in tasks_create_task_request_main_item.py:81](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L81) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_ToolCall().json - -[Show source in tasks_create_task_request_main_item.py:73](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L73) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_WaitForInput - -[Show source in tasks_create_task_request_main_item.py:489](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L489) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_WaitForInput().dict - -[Show source in tasks_create_task_request_main_item.py:503](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L503) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_WaitForInput().json - -[Show source in tasks_create_task_request_main_item.py:495](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L495) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksCreateTaskRequestMainItem_Yield - -[Show source in tasks_create_task_request_main_item.py:107](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L107) - -#### Signature - -```python -class TasksCreateTaskRequestMainItem_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksCreateTaskRequestMainItem_Yield().dict - -[Show source in tasks_create_task_request_main_item.py:120](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L120) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksCreateTaskRequestMainItem_Yield().json - -[Show source in tasks_create_task_request_main_item.py:112](../../../../../../../julep/api/types/tasks_create_task_request_main_item.py#L112) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_embed_step.md b/docs/python-sdk-docs/julep/api/types/tasks_embed_step.md deleted file mode 100644 index af18dfe3b..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_embed_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksEmbedStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksEmbedStep - -> Auto-generated documentation for [julep.api.types.tasks_embed_step](../../../../../../../julep/api/types/tasks_embed_step.py) module. - -- [TasksEmbedStep](#tasksembedstep) - - [TasksEmbedStep](#tasksembedstep-1) - -## TasksEmbedStep - -[Show source in tasks_embed_step.py:11](../../../../../../../julep/api/types/tasks_embed_step.py#L11) - -#### Signature - -```python -class TasksEmbedStep(pydantic_v1.BaseModel): ... -``` - -### TasksEmbedStep().dict - -[Show source in tasks_embed_step.py:25](../../../../../../../julep/api/types/tasks_embed_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksEmbedStep().json - -[Show source in tasks_embed_step.py:17](../../../../../../../julep/api/types/tasks_embed_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_error_workflow_step.md b/docs/python-sdk-docs/julep/api/types/tasks_error_workflow_step.md deleted file mode 100644 index 457cc00b6..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_error_workflow_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksErrorWorkflowStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksErrorWorkflowStep - -> Auto-generated documentation for [julep.api.types.tasks_error_workflow_step](../../../../../../../julep/api/types/tasks_error_workflow_step.py) module. - -- [TasksErrorWorkflowStep](#taskserrorworkflowstep) - - [TasksErrorWorkflowStep](#taskserrorworkflowstep-1) - -## TasksErrorWorkflowStep - -[Show source in tasks_error_workflow_step.py:10](../../../../../../../julep/api/types/tasks_error_workflow_step.py#L10) - -#### Signature - -```python -class TasksErrorWorkflowStep(pydantic_v1.BaseModel): ... -``` - -### TasksErrorWorkflowStep().dict - -[Show source in tasks_error_workflow_step.py:24](../../../../../../../julep/api/types/tasks_error_workflow_step.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksErrorWorkflowStep().json - -[Show source in tasks_error_workflow_step.py:16](../../../../../../../julep/api/types/tasks_error_workflow_step.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_evaluate_step.md b/docs/python-sdk-docs/julep/api/types/tasks_evaluate_step.md deleted file mode 100644 index cc9d0b45e..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_evaluate_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksEvaluateStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksEvaluateStep - -> Auto-generated documentation for [julep.api.types.tasks_evaluate_step](../../../../../../../julep/api/types/tasks_evaluate_step.py) module. - -- [TasksEvaluateStep](#tasksevaluatestep) - - [TasksEvaluateStep](#tasksevaluatestep-1) - -## TasksEvaluateStep - -[Show source in tasks_evaluate_step.py:11](../../../../../../../julep/api/types/tasks_evaluate_step.py#L11) - -#### Signature - -```python -class TasksEvaluateStep(pydantic_v1.BaseModel): ... -``` - -### TasksEvaluateStep().dict - -[Show source in tasks_evaluate_step.py:25](../../../../../../../julep/api/types/tasks_evaluate_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksEvaluateStep().json - -[Show source in tasks_evaluate_step.py:17](../../../../../../../julep/api/types/tasks_evaluate_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_foreach_do.md b/docs/python-sdk-docs/julep/api/types/tasks_foreach_do.md deleted file mode 100644 index 29730240e..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_foreach_do.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksForeachDo - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksForeachDo - -> Auto-generated documentation for [julep.api.types.tasks_foreach_do](../../../../../../../julep/api/types/tasks_foreach_do.py) module. - -- [TasksForeachDo](#tasksforeachdo) - - [TasksForeachDo](#tasksforeachdo-1) - -## TasksForeachDo - -[Show source in tasks_foreach_do.py:12](../../../../../../../julep/api/types/tasks_foreach_do.py#L12) - -#### Signature - -```python -class TasksForeachDo(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDo().dict - -[Show source in tasks_foreach_do.py:31](../../../../../../../julep/api/types/tasks_foreach_do.py#L31) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDo().json - -[Show source in tasks_foreach_do.py:23](../../../../../../../julep/api/types/tasks_foreach_do.py#L23) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_foreach_do_do.md b/docs/python-sdk-docs/julep/api/types/tasks_foreach_do_do.md deleted file mode 100644 index 729006800..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_foreach_do_do.md +++ /dev/null @@ -1,460 +0,0 @@ -# Tasks Foreach Do Do - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Foreach Do Do - -> Auto-generated documentation for [julep.api.types.tasks_foreach_do_do](../../../../../../../julep/api/types/tasks_foreach_do_do.py) module. - -- [Tasks Foreach Do Do](#tasks-foreach-do-do) - - [TasksForeachDoDo_Embed](#tasksforeachdodo_embed) - - [TasksForeachDoDo_Error](#tasksforeachdodo_error) - - [TasksForeachDoDo_Evaluate](#tasksforeachdodo_evaluate) - - [TasksForeachDoDo_Get](#tasksforeachdodo_get) - - [TasksForeachDoDo_Log](#tasksforeachdodo_log) - - [TasksForeachDoDo_Prompt](#tasksforeachdodo_prompt) - - [TasksForeachDoDo_Return](#tasksforeachdodo_return) - - [TasksForeachDoDo_Search](#tasksforeachdodo_search) - - [TasksForeachDoDo_Set](#tasksforeachdodo_set) - - [TasksForeachDoDo_Sleep](#tasksforeachdodo_sleep) - - [TasksForeachDoDo_ToolCall](#tasksforeachdodo_toolcall) - - [TasksForeachDoDo_WaitForInput](#tasksforeachdodo_waitforinput) - - [TasksForeachDoDo_Yield](#tasksforeachdodo_yield) - -## TasksForeachDoDo_Embed - -[Show source in tasks_foreach_do_do.py:447](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L447) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Embed().dict - -[Show source in tasks_foreach_do_do.py:463](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Embed().json - -[Show source in tasks_foreach_do_do.py:455](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Error - -[Show source in tasks_foreach_do_do.py:195](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L195) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Error(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Error().dict - -[Show source in tasks_foreach_do_do.py:211](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L211) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Error().json - -[Show source in tasks_foreach_do_do.py:203](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L203) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Evaluate - -[Show source in tasks_foreach_do_do.py:20](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L20) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Evaluate().dict - -[Show source in tasks_foreach_do_do.py:38](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L38) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Evaluate().json - -[Show source in tasks_foreach_do_do.py:30](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L30) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Get - -[Show source in tasks_foreach_do_do.py:321](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L321) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Get(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Get().dict - -[Show source in tasks_foreach_do_do.py:337](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L337) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Get().json - -[Show source in tasks_foreach_do_do.py:329](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L329) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Log - -[Show source in tasks_foreach_do_do.py:405](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L405) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Log(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Log().dict - -[Show source in tasks_foreach_do_do.py:421](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L421) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Log().json - -[Show source in tasks_foreach_do_do.py:413](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L413) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Prompt - -[Show source in tasks_foreach_do_do.py:152](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L152) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Prompt().dict - -[Show source in tasks_foreach_do_do.py:169](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L169) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Prompt().json - -[Show source in tasks_foreach_do_do.py:161](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L161) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Return - -[Show source in tasks_foreach_do_do.py:279](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L279) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Return(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Return().dict - -[Show source in tasks_foreach_do_do.py:295](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L295) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Return().json - -[Show source in tasks_foreach_do_do.py:287](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L287) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Search - -[Show source in tasks_foreach_do_do.py:489](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L489) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Search(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Search().dict - -[Show source in tasks_foreach_do_do.py:505](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L505) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Search().json - -[Show source in tasks_foreach_do_do.py:497](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L497) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Set - -[Show source in tasks_foreach_do_do.py:363](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L363) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Set(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Set().dict - -[Show source in tasks_foreach_do_do.py:379](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L379) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Set().json - -[Show source in tasks_foreach_do_do.py:371](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L371) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Sleep - -[Show source in tasks_foreach_do_do.py:237](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L237) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Sleep().dict - -[Show source in tasks_foreach_do_do.py:253](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L253) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Sleep().json - -[Show source in tasks_foreach_do_do.py:245](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L245) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_ToolCall - -[Show source in tasks_foreach_do_do.py:64](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L64) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_ToolCall().dict - -[Show source in tasks_foreach_do_do.py:83](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L83) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_ToolCall().json - -[Show source in tasks_foreach_do_do.py:75](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L75) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_WaitForInput - -[Show source in tasks_foreach_do_do.py:531](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L531) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_WaitForInput().dict - -[Show source in tasks_foreach_do_do.py:549](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L549) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_WaitForInput().json - -[Show source in tasks_foreach_do_do.py:541](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L541) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksForeachDoDo_Yield - -[Show source in tasks_foreach_do_do.py:109](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L109) - -The steps to run for each iteration - -#### Signature - -```python -class TasksForeachDoDo_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksForeachDoDo_Yield().dict - -[Show source in tasks_foreach_do_do.py:126](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L126) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachDoDo_Yield().json - -[Show source in tasks_foreach_do_do.py:118](../../../../../../../julep/api/types/tasks_foreach_do_do.py#L118) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_foreach_step.md b/docs/python-sdk-docs/julep/api/types/tasks_foreach_step.md deleted file mode 100644 index 563f1c526..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_foreach_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksForeachStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksForeachStep - -> Auto-generated documentation for [julep.api.types.tasks_foreach_step](../../../../../../../julep/api/types/tasks_foreach_step.py) module. - -- [TasksForeachStep](#tasksforeachstep) - - [TasksForeachStep](#tasksforeachstep-1) - -## TasksForeachStep - -[Show source in tasks_foreach_step.py:11](../../../../../../../julep/api/types/tasks_foreach_step.py#L11) - -#### Signature - -```python -class TasksForeachStep(pydantic_v1.BaseModel): ... -``` - -### TasksForeachStep().dict - -[Show source in tasks_foreach_step.py:25](../../../../../../../julep/api/types/tasks_foreach_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksForeachStep().json - -[Show source in tasks_foreach_step.py:17](../../../../../../../julep/api/types/tasks_foreach_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_get_step.md b/docs/python-sdk-docs/julep/api/types/tasks_get_step.md deleted file mode 100644 index 0bda9cb54..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_get_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksGetStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksGetStep - -> Auto-generated documentation for [julep.api.types.tasks_get_step](../../../../../../../julep/api/types/tasks_get_step.py) module. - -- [TasksGetStep](#tasksgetstep) - - [TasksGetStep](#tasksgetstep-1) - -## TasksGetStep - -[Show source in tasks_get_step.py:10](../../../../../../../julep/api/types/tasks_get_step.py#L10) - -#### Signature - -```python -class TasksGetStep(pydantic_v1.BaseModel): ... -``` - -### TasksGetStep().dict - -[Show source in tasks_get_step.py:24](../../../../../../../julep/api/types/tasks_get_step.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksGetStep().json - -[Show source in tasks_get_step.py:16](../../../../../../../julep/api/types/tasks_get_step.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step.md b/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step.md deleted file mode 100644 index 27aa1d222..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksIfElseWorkflowStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksIfElseWorkflowStep - -> Auto-generated documentation for [julep.api.types.tasks_if_else_workflow_step](../../../../../../../julep/api/types/tasks_if_else_workflow_step.py) module. - -- [TasksIfElseWorkflowStep](#tasksifelseworkflowstep) - - [TasksIfElseWorkflowStep](#tasksifelseworkflowstep-1) - -## TasksIfElseWorkflowStep - -[Show source in tasks_if_else_workflow_step.py:13](../../../../../../../julep/api/types/tasks_if_else_workflow_step.py#L13) - -#### Signature - -```python -class TasksIfElseWorkflowStep(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStep().dict - -[Show source in tasks_if_else_workflow_step.py:37](../../../../../../../julep/api/types/tasks_if_else_workflow_step.py#L37) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStep().json - -[Show source in tasks_if_else_workflow_step.py:29](../../../../../../../julep/api/types/tasks_if_else_workflow_step.py#L29) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_else.md b/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_else.md deleted file mode 100644 index e3928449c..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_else.md +++ /dev/null @@ -1,460 +0,0 @@ -# Tasks If Else Workflow Step Else - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks If Else Workflow Step Else - -> Auto-generated documentation for [julep.api.types.tasks_if_else_workflow_step_else](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py) module. - -- [Tasks If Else Workflow Step Else](#tasks-if-else-workflow-step-else) - - [TasksIfElseWorkflowStepElse_Embed](#tasksifelseworkflowstepelse_embed) - - [TasksIfElseWorkflowStepElse_Error](#tasksifelseworkflowstepelse_error) - - [TasksIfElseWorkflowStepElse_Evaluate](#tasksifelseworkflowstepelse_evaluate) - - [TasksIfElseWorkflowStepElse_Get](#tasksifelseworkflowstepelse_get) - - [TasksIfElseWorkflowStepElse_Log](#tasksifelseworkflowstepelse_log) - - [TasksIfElseWorkflowStepElse_Prompt](#tasksifelseworkflowstepelse_prompt) - - [TasksIfElseWorkflowStepElse_Return](#tasksifelseworkflowstepelse_return) - - [TasksIfElseWorkflowStepElse_Search](#tasksifelseworkflowstepelse_search) - - [TasksIfElseWorkflowStepElse_Set](#tasksifelseworkflowstepelse_set) - - [TasksIfElseWorkflowStepElse_Sleep](#tasksifelseworkflowstepelse_sleep) - - [TasksIfElseWorkflowStepElse_ToolCall](#tasksifelseworkflowstepelse_toolcall) - - [TasksIfElseWorkflowStepElse_WaitForInput](#tasksifelseworkflowstepelse_waitforinput) - - [TasksIfElseWorkflowStepElse_Yield](#tasksifelseworkflowstepelse_yield) - -## TasksIfElseWorkflowStepElse_Embed - -[Show source in tasks_if_else_workflow_step_else.py:447](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L447) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Embed().dict - -[Show source in tasks_if_else_workflow_step_else.py:463](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Embed().json - -[Show source in tasks_if_else_workflow_step_else.py:455](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Error - -[Show source in tasks_if_else_workflow_step_else.py:195](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L195) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Error(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Error().dict - -[Show source in tasks_if_else_workflow_step_else.py:211](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L211) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Error().json - -[Show source in tasks_if_else_workflow_step_else.py:203](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L203) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Evaluate - -[Show source in tasks_if_else_workflow_step_else.py:20](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L20) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Evaluate().dict - -[Show source in tasks_if_else_workflow_step_else.py:38](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L38) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Evaluate().json - -[Show source in tasks_if_else_workflow_step_else.py:30](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L30) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Get - -[Show source in tasks_if_else_workflow_step_else.py:321](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L321) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Get(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Get().dict - -[Show source in tasks_if_else_workflow_step_else.py:337](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L337) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Get().json - -[Show source in tasks_if_else_workflow_step_else.py:329](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L329) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Log - -[Show source in tasks_if_else_workflow_step_else.py:405](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L405) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Log(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Log().dict - -[Show source in tasks_if_else_workflow_step_else.py:421](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L421) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Log().json - -[Show source in tasks_if_else_workflow_step_else.py:413](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L413) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Prompt - -[Show source in tasks_if_else_workflow_step_else.py:152](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L152) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Prompt().dict - -[Show source in tasks_if_else_workflow_step_else.py:169](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L169) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Prompt().json - -[Show source in tasks_if_else_workflow_step_else.py:161](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L161) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Return - -[Show source in tasks_if_else_workflow_step_else.py:279](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L279) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Return(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Return().dict - -[Show source in tasks_if_else_workflow_step_else.py:295](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L295) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Return().json - -[Show source in tasks_if_else_workflow_step_else.py:287](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L287) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Search - -[Show source in tasks_if_else_workflow_step_else.py:489](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L489) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Search(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Search().dict - -[Show source in tasks_if_else_workflow_step_else.py:505](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L505) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Search().json - -[Show source in tasks_if_else_workflow_step_else.py:497](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L497) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Set - -[Show source in tasks_if_else_workflow_step_else.py:363](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L363) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Set(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Set().dict - -[Show source in tasks_if_else_workflow_step_else.py:379](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L379) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Set().json - -[Show source in tasks_if_else_workflow_step_else.py:371](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L371) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Sleep - -[Show source in tasks_if_else_workflow_step_else.py:237](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L237) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Sleep().dict - -[Show source in tasks_if_else_workflow_step_else.py:253](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L253) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Sleep().json - -[Show source in tasks_if_else_workflow_step_else.py:245](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L245) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_ToolCall - -[Show source in tasks_if_else_workflow_step_else.py:64](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L64) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_ToolCall().dict - -[Show source in tasks_if_else_workflow_step_else.py:83](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L83) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_ToolCall().json - -[Show source in tasks_if_else_workflow_step_else.py:75](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L75) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_WaitForInput - -[Show source in tasks_if_else_workflow_step_else.py:531](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L531) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_WaitForInput().dict - -[Show source in tasks_if_else_workflow_step_else.py:549](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L549) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_WaitForInput().json - -[Show source in tasks_if_else_workflow_step_else.py:541](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L541) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepElse_Yield - -[Show source in tasks_if_else_workflow_step_else.py:109](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L109) - -The steps to run if the condition is false - -#### Signature - -```python -class TasksIfElseWorkflowStepElse_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepElse_Yield().dict - -[Show source in tasks_if_else_workflow_step_else.py:126](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L126) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepElse_Yield().json - -[Show source in tasks_if_else_workflow_step_else.py:118](../../../../../../../julep/api/types/tasks_if_else_workflow_step_else.py#L118) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_then.md b/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_then.md deleted file mode 100644 index 75ef5edf1..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_if_else_workflow_step_then.md +++ /dev/null @@ -1,460 +0,0 @@ -# Tasks If Else Workflow Step Then - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks If Else Workflow Step Then - -> Auto-generated documentation for [julep.api.types.tasks_if_else_workflow_step_then](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py) module. - -- [Tasks If Else Workflow Step Then](#tasks-if-else-workflow-step-then) - - [TasksIfElseWorkflowStepThen_Embed](#tasksifelseworkflowstepthen_embed) - - [TasksIfElseWorkflowStepThen_Error](#tasksifelseworkflowstepthen_error) - - [TasksIfElseWorkflowStepThen_Evaluate](#tasksifelseworkflowstepthen_evaluate) - - [TasksIfElseWorkflowStepThen_Get](#tasksifelseworkflowstepthen_get) - - [TasksIfElseWorkflowStepThen_Log](#tasksifelseworkflowstepthen_log) - - [TasksIfElseWorkflowStepThen_Prompt](#tasksifelseworkflowstepthen_prompt) - - [TasksIfElseWorkflowStepThen_Return](#tasksifelseworkflowstepthen_return) - - [TasksIfElseWorkflowStepThen_Search](#tasksifelseworkflowstepthen_search) - - [TasksIfElseWorkflowStepThen_Set](#tasksifelseworkflowstepthen_set) - - [TasksIfElseWorkflowStepThen_Sleep](#tasksifelseworkflowstepthen_sleep) - - [TasksIfElseWorkflowStepThen_ToolCall](#tasksifelseworkflowstepthen_toolcall) - - [TasksIfElseWorkflowStepThen_WaitForInput](#tasksifelseworkflowstepthen_waitforinput) - - [TasksIfElseWorkflowStepThen_Yield](#tasksifelseworkflowstepthen_yield) - -## TasksIfElseWorkflowStepThen_Embed - -[Show source in tasks_if_else_workflow_step_then.py:447](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L447) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Embed().dict - -[Show source in tasks_if_else_workflow_step_then.py:463](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Embed().json - -[Show source in tasks_if_else_workflow_step_then.py:455](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Error - -[Show source in tasks_if_else_workflow_step_then.py:195](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L195) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Error(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Error().dict - -[Show source in tasks_if_else_workflow_step_then.py:211](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L211) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Error().json - -[Show source in tasks_if_else_workflow_step_then.py:203](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L203) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Evaluate - -[Show source in tasks_if_else_workflow_step_then.py:20](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L20) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Evaluate().dict - -[Show source in tasks_if_else_workflow_step_then.py:38](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L38) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Evaluate().json - -[Show source in tasks_if_else_workflow_step_then.py:30](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L30) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Get - -[Show source in tasks_if_else_workflow_step_then.py:321](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L321) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Get(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Get().dict - -[Show source in tasks_if_else_workflow_step_then.py:337](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L337) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Get().json - -[Show source in tasks_if_else_workflow_step_then.py:329](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L329) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Log - -[Show source in tasks_if_else_workflow_step_then.py:405](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L405) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Log(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Log().dict - -[Show source in tasks_if_else_workflow_step_then.py:421](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L421) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Log().json - -[Show source in tasks_if_else_workflow_step_then.py:413](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L413) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Prompt - -[Show source in tasks_if_else_workflow_step_then.py:152](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L152) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Prompt().dict - -[Show source in tasks_if_else_workflow_step_then.py:169](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L169) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Prompt().json - -[Show source in tasks_if_else_workflow_step_then.py:161](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L161) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Return - -[Show source in tasks_if_else_workflow_step_then.py:279](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L279) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Return(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Return().dict - -[Show source in tasks_if_else_workflow_step_then.py:295](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L295) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Return().json - -[Show source in tasks_if_else_workflow_step_then.py:287](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L287) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Search - -[Show source in tasks_if_else_workflow_step_then.py:489](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L489) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Search(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Search().dict - -[Show source in tasks_if_else_workflow_step_then.py:505](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L505) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Search().json - -[Show source in tasks_if_else_workflow_step_then.py:497](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L497) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Set - -[Show source in tasks_if_else_workflow_step_then.py:363](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L363) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Set(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Set().dict - -[Show source in tasks_if_else_workflow_step_then.py:379](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L379) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Set().json - -[Show source in tasks_if_else_workflow_step_then.py:371](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L371) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Sleep - -[Show source in tasks_if_else_workflow_step_then.py:237](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L237) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Sleep().dict - -[Show source in tasks_if_else_workflow_step_then.py:253](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L253) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Sleep().json - -[Show source in tasks_if_else_workflow_step_then.py:245](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L245) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_ToolCall - -[Show source in tasks_if_else_workflow_step_then.py:64](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L64) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_ToolCall().dict - -[Show source in tasks_if_else_workflow_step_then.py:83](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L83) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_ToolCall().json - -[Show source in tasks_if_else_workflow_step_then.py:75](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L75) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_WaitForInput - -[Show source in tasks_if_else_workflow_step_then.py:531](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L531) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_WaitForInput().dict - -[Show source in tasks_if_else_workflow_step_then.py:549](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L549) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_WaitForInput().json - -[Show source in tasks_if_else_workflow_step_then.py:541](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L541) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksIfElseWorkflowStepThen_Yield - -[Show source in tasks_if_else_workflow_step_then.py:109](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L109) - -The steps to run if the condition is true - -#### Signature - -```python -class TasksIfElseWorkflowStepThen_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksIfElseWorkflowStepThen_Yield().dict - -[Show source in tasks_if_else_workflow_step_then.py:126](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L126) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksIfElseWorkflowStepThen_Yield().json - -[Show source in tasks_if_else_workflow_step_then.py:118](../../../../../../../julep/api/types/tasks_if_else_workflow_step_then.py#L118) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_log_step.md b/docs/python-sdk-docs/julep/api/types/tasks_log_step.md deleted file mode 100644 index 2ab4a3c39..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_log_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksLogStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksLogStep - -> Auto-generated documentation for [julep.api.types.tasks_log_step](../../../../../../../julep/api/types/tasks_log_step.py) module. - -- [TasksLogStep](#taskslogstep) - - [TasksLogStep](#taskslogstep-1) - -## TasksLogStep - -[Show source in tasks_log_step.py:11](../../../../../../../julep/api/types/tasks_log_step.py#L11) - -#### Signature - -```python -class TasksLogStep(pydantic_v1.BaseModel): ... -``` - -### TasksLogStep().dict - -[Show source in tasks_log_step.py:25](../../../../../../../julep/api/types/tasks_log_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksLogStep().json - -[Show source in tasks_log_step.py:17](../../../../../../../julep/api/types/tasks_log_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_map_over.md b/docs/python-sdk-docs/julep/api/types/tasks_map_over.md deleted file mode 100644 index af877ed87..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_map_over.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksMapOver - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksMapOver - -> Auto-generated documentation for [julep.api.types.tasks_map_over](../../../../../../../julep/api/types/tasks_map_over.py) module. - -- [TasksMapOver](#tasksmapover) - - [TasksMapOver](#tasksmapover-1) - -## TasksMapOver - -[Show source in tasks_map_over.py:11](../../../../../../../julep/api/types/tasks_map_over.py#L11) - -#### Signature - -```python -class TasksMapOver(pydantic_v1.BaseModel): ... -``` - -### TasksMapOver().dict - -[Show source in tasks_map_over.py:30](../../../../../../../julep/api/types/tasks_map_over.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksMapOver().json - -[Show source in tasks_map_over.py:22](../../../../../../../julep/api/types/tasks_map_over.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_map_reduce_step.md b/docs/python-sdk-docs/julep/api/types/tasks_map_reduce_step.md deleted file mode 100644 index 15fe7be42..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_map_reduce_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksMapReduceStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksMapReduceStep - -> Auto-generated documentation for [julep.api.types.tasks_map_reduce_step](../../../../../../../julep/api/types/tasks_map_reduce_step.py) module. - -- [TasksMapReduceStep](#tasksmapreducestep) - - [TasksMapReduceStep](#tasksmapreducestep-1) - -## TasksMapReduceStep - -[Show source in tasks_map_reduce_step.py:12](../../../../../../../julep/api/types/tasks_map_reduce_step.py#L12) - -#### Signature - -```python -class TasksMapReduceStep(pydantic_v1.BaseModel): ... -``` - -### TasksMapReduceStep().dict - -[Show source in tasks_map_reduce_step.py:31](../../../../../../../julep/api/types/tasks_map_reduce_step.py#L31) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksMapReduceStep().json - -[Show source in tasks_map_reduce_step.py:23](../../../../../../../julep/api/types/tasks_map_reduce_step.py#L23) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_parallel_step.md b/docs/python-sdk-docs/julep/api/types/tasks_parallel_step.md deleted file mode 100644 index 3c2c08d7d..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_parallel_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksParallelStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksParallelStep - -> Auto-generated documentation for [julep.api.types.tasks_parallel_step](../../../../../../../julep/api/types/tasks_parallel_step.py) module. - -- [TasksParallelStep](#tasksparallelstep) - - [TasksParallelStep](#tasksparallelstep-1) - -## TasksParallelStep - -[Show source in tasks_parallel_step.py:11](../../../../../../../julep/api/types/tasks_parallel_step.py#L11) - -#### Signature - -```python -class TasksParallelStep(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStep().dict - -[Show source in tasks_parallel_step.py:25](../../../../../../../julep/api/types/tasks_parallel_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStep().json - -[Show source in tasks_parallel_step.py:17](../../../../../../../julep/api/types/tasks_parallel_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_parallel_step_parallel_item.md b/docs/python-sdk-docs/julep/api/types/tasks_parallel_step_parallel_item.md deleted file mode 100644 index 6ac00488b..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_parallel_step_parallel_item.md +++ /dev/null @@ -1,434 +0,0 @@ -# Tasks Parallel Step Parallel Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Parallel Step Parallel Item - -> Auto-generated documentation for [julep.api.types.tasks_parallel_step_parallel_item](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py) module. - -- [Tasks Parallel Step Parallel Item](#tasks-parallel-step-parallel-item) - - [TasksParallelStepParallelItem_Embed](#tasksparallelstepparallelitem_embed) - - [TasksParallelStepParallelItem_Error](#tasksparallelstepparallelitem_error) - - [TasksParallelStepParallelItem_Evaluate](#tasksparallelstepparallelitem_evaluate) - - [TasksParallelStepParallelItem_Get](#tasksparallelstepparallelitem_get) - - [TasksParallelStepParallelItem_Log](#tasksparallelstepparallelitem_log) - - [TasksParallelStepParallelItem_Prompt](#tasksparallelstepparallelitem_prompt) - - [TasksParallelStepParallelItem_Return](#tasksparallelstepparallelitem_return) - - [TasksParallelStepParallelItem_Search](#tasksparallelstepparallelitem_search) - - [TasksParallelStepParallelItem_Set](#tasksparallelstepparallelitem_set) - - [TasksParallelStepParallelItem_Sleep](#tasksparallelstepparallelitem_sleep) - - [TasksParallelStepParallelItem_ToolCall](#tasksparallelstepparallelitem_toolcall) - - [TasksParallelStepParallelItem_WaitForInput](#tasksparallelstepparallelitem_waitforinput) - - [TasksParallelStepParallelItem_Yield](#tasksparallelstepparallelitem_yield) - -## TasksParallelStepParallelItem_Embed - -[Show source in tasks_parallel_step_parallel_item.py:407](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L407) - -#### Signature - -```python -class TasksParallelStepParallelItem_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Embed().dict - -[Show source in tasks_parallel_step_parallel_item.py:419](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L419) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Embed().json - -[Show source in tasks_parallel_step_parallel_item.py:411](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L411) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Error - -[Show source in tasks_parallel_step_parallel_item.py:179](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L179) - -#### Signature - -```python -class TasksParallelStepParallelItem_Error(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Error().dict - -[Show source in tasks_parallel_step_parallel_item.py:191](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L191) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Error().json - -[Show source in tasks_parallel_step_parallel_item.py:183](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L183) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Evaluate - -[Show source in tasks_parallel_step_parallel_item.py:20](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L20) - -#### Signature - -```python -class TasksParallelStepParallelItem_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Evaluate().dict - -[Show source in tasks_parallel_step_parallel_item.py:34](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L34) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Evaluate().json - -[Show source in tasks_parallel_step_parallel_item.py:26](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L26) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Get - -[Show source in tasks_parallel_step_parallel_item.py:293](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L293) - -#### Signature - -```python -class TasksParallelStepParallelItem_Get(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Get().dict - -[Show source in tasks_parallel_step_parallel_item.py:305](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L305) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Get().json - -[Show source in tasks_parallel_step_parallel_item.py:297](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L297) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Log - -[Show source in tasks_parallel_step_parallel_item.py:369](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L369) - -#### Signature - -```python -class TasksParallelStepParallelItem_Log(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Log().dict - -[Show source in tasks_parallel_step_parallel_item.py:381](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L381) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Log().json - -[Show source in tasks_parallel_step_parallel_item.py:373](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L373) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Prompt - -[Show source in tasks_parallel_step_parallel_item.py:140](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L140) - -#### Signature - -```python -class TasksParallelStepParallelItem_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Prompt().dict - -[Show source in tasks_parallel_step_parallel_item.py:153](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L153) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Prompt().json - -[Show source in tasks_parallel_step_parallel_item.py:145](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L145) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Return - -[Show source in tasks_parallel_step_parallel_item.py:255](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L255) - -#### Signature - -```python -class TasksParallelStepParallelItem_Return(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Return().dict - -[Show source in tasks_parallel_step_parallel_item.py:267](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L267) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Return().json - -[Show source in tasks_parallel_step_parallel_item.py:259](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L259) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Search - -[Show source in tasks_parallel_step_parallel_item.py:445](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L445) - -#### Signature - -```python -class TasksParallelStepParallelItem_Search(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Search().dict - -[Show source in tasks_parallel_step_parallel_item.py:457](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L457) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Search().json - -[Show source in tasks_parallel_step_parallel_item.py:449](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L449) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Set - -[Show source in tasks_parallel_step_parallel_item.py:331](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L331) - -#### Signature - -```python -class TasksParallelStepParallelItem_Set(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Set().dict - -[Show source in tasks_parallel_step_parallel_item.py:343](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L343) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Set().json - -[Show source in tasks_parallel_step_parallel_item.py:335](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L335) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Sleep - -[Show source in tasks_parallel_step_parallel_item.py:217](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L217) - -#### Signature - -```python -class TasksParallelStepParallelItem_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Sleep().dict - -[Show source in tasks_parallel_step_parallel_item.py:229](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L229) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Sleep().json - -[Show source in tasks_parallel_step_parallel_item.py:221](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L221) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_ToolCall - -[Show source in tasks_parallel_step_parallel_item.py:60](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L60) - -#### Signature - -```python -class TasksParallelStepParallelItem_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_ToolCall().dict - -[Show source in tasks_parallel_step_parallel_item.py:75](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L75) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_ToolCall().json - -[Show source in tasks_parallel_step_parallel_item.py:67](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L67) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_WaitForInput - -[Show source in tasks_parallel_step_parallel_item.py:483](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L483) - -#### Signature - -```python -class TasksParallelStepParallelItem_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_WaitForInput().dict - -[Show source in tasks_parallel_step_parallel_item.py:497](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L497) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_WaitForInput().json - -[Show source in tasks_parallel_step_parallel_item.py:489](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L489) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksParallelStepParallelItem_Yield - -[Show source in tasks_parallel_step_parallel_item.py:101](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L101) - -#### Signature - -```python -class TasksParallelStepParallelItem_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksParallelStepParallelItem_Yield().dict - -[Show source in tasks_parallel_step_parallel_item.py:114](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L114) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksParallelStepParallelItem_Yield().json - -[Show source in tasks_parallel_step_parallel_item.py:106](../../../../../../../julep/api/types/tasks_parallel_step_parallel_item.py#L106) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_patch_task_request_main_item.md b/docs/python-sdk-docs/julep/api/types/tasks_patch_task_request_main_item.md deleted file mode 100644 index de1078439..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_patch_task_request_main_item.md +++ /dev/null @@ -1,599 +0,0 @@ -# Tasks Patch Task Request Main Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Patch Task Request Main Item - -> Auto-generated documentation for [julep.api.types.tasks_patch_task_request_main_item](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py) module. - -- [Tasks Patch Task Request Main Item](#tasks-patch-task-request-main-item) - - [TasksPatchTaskRequestMainItem_Embed](#taskspatchtaskrequestmainitem_embed) - - [TasksPatchTaskRequestMainItem_Error](#taskspatchtaskrequestmainitem_error) - - [TasksPatchTaskRequestMainItem_Evaluate](#taskspatchtaskrequestmainitem_evaluate) - - [TasksPatchTaskRequestMainItem_Foreach](#taskspatchtaskrequestmainitem_foreach) - - [TasksPatchTaskRequestMainItem_Get](#taskspatchtaskrequestmainitem_get) - - [TasksPatchTaskRequestMainItem_IfElse](#taskspatchtaskrequestmainitem_ifelse) - - [TasksPatchTaskRequestMainItem_Log](#taskspatchtaskrequestmainitem_log) - - [TasksPatchTaskRequestMainItem_MapReduce](#taskspatchtaskrequestmainitem_mapreduce) - - [TasksPatchTaskRequestMainItem_Parallel](#taskspatchtaskrequestmainitem_parallel) - - [TasksPatchTaskRequestMainItem_Prompt](#taskspatchtaskrequestmainitem_prompt) - - [TasksPatchTaskRequestMainItem_Return](#taskspatchtaskrequestmainitem_return) - - [TasksPatchTaskRequestMainItem_Search](#taskspatchtaskrequestmainitem_search) - - [TasksPatchTaskRequestMainItem_Set](#taskspatchtaskrequestmainitem_set) - - [TasksPatchTaskRequestMainItem_Sleep](#taskspatchtaskrequestmainitem_sleep) - - [TasksPatchTaskRequestMainItem_Switch](#taskspatchtaskrequestmainitem_switch) - - [TasksPatchTaskRequestMainItem_ToolCall](#taskspatchtaskrequestmainitem_toolcall) - - [TasksPatchTaskRequestMainItem_WaitForInput](#taskspatchtaskrequestmainitem_waitforinput) - - [TasksPatchTaskRequestMainItem_Yield](#taskspatchtaskrequestmainitem_yield) - -## TasksPatchTaskRequestMainItem_Embed - -[Show source in tasks_patch_task_request_main_item.py:413](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L413) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Embed().dict - -[Show source in tasks_patch_task_request_main_item.py:425](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L425) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Embed().json - -[Show source in tasks_patch_task_request_main_item.py:417](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L417) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Error - -[Show source in tasks_patch_task_request_main_item.py:185](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L185) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Error(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Error().dict - -[Show source in tasks_patch_task_request_main_item.py:197](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L197) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Error().json - -[Show source in tasks_patch_task_request_main_item.py:189](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L189) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Evaluate - -[Show source in tasks_patch_task_request_main_item.py:26](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L26) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Evaluate().dict - -[Show source in tasks_patch_task_request_main_item.py:40](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L40) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Evaluate().json - -[Show source in tasks_patch_task_request_main_item.py:32](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L32) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Foreach - -[Show source in tasks_patch_task_request_main_item.py:609](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L609) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Foreach(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Foreach().dict - -[Show source in tasks_patch_task_request_main_item.py:623](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L623) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Foreach().json - -[Show source in tasks_patch_task_request_main_item.py:615](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L615) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Get - -[Show source in tasks_patch_task_request_main_item.py:299](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L299) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Get(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Get().dict - -[Show source in tasks_patch_task_request_main_item.py:311](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L311) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Get().json - -[Show source in tasks_patch_task_request_main_item.py:303](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L303) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_IfElse - -[Show source in tasks_patch_task_request_main_item.py:529](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L529) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_IfElse(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_IfElse().dict - -[Show source in tasks_patch_task_request_main_item.py:545](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L545) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_IfElse().json - -[Show source in tasks_patch_task_request_main_item.py:537](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L537) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Log - -[Show source in tasks_patch_task_request_main_item.py:375](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L375) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Log(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Log().dict - -[Show source in tasks_patch_task_request_main_item.py:387](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L387) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Log().json - -[Show source in tasks_patch_task_request_main_item.py:379](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L379) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_MapReduce - -[Show source in tasks_patch_task_request_main_item.py:689](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L689) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_MapReduce(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_MapReduce().dict - -[Show source in tasks_patch_task_request_main_item.py:704](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L704) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_MapReduce().json - -[Show source in tasks_patch_task_request_main_item.py:696](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L696) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Parallel - -[Show source in tasks_patch_task_request_main_item.py:649](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L649) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Parallel(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Parallel().dict - -[Show source in tasks_patch_task_request_main_item.py:663](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L663) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Parallel().json - -[Show source in tasks_patch_task_request_main_item.py:655](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L655) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Prompt - -[Show source in tasks_patch_task_request_main_item.py:146](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L146) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Prompt().dict - -[Show source in tasks_patch_task_request_main_item.py:159](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L159) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Prompt().json - -[Show source in tasks_patch_task_request_main_item.py:151](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L151) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Return - -[Show source in tasks_patch_task_request_main_item.py:261](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L261) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Return(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Return().dict - -[Show source in tasks_patch_task_request_main_item.py:273](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L273) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Return().json - -[Show source in tasks_patch_task_request_main_item.py:265](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L265) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Search - -[Show source in tasks_patch_task_request_main_item.py:451](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L451) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Search(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Search().dict - -[Show source in tasks_patch_task_request_main_item.py:463](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Search().json - -[Show source in tasks_patch_task_request_main_item.py:455](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Set - -[Show source in tasks_patch_task_request_main_item.py:337](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L337) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Set(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Set().dict - -[Show source in tasks_patch_task_request_main_item.py:349](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L349) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Set().json - -[Show source in tasks_patch_task_request_main_item.py:341](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L341) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Sleep - -[Show source in tasks_patch_task_request_main_item.py:223](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L223) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Sleep().dict - -[Show source in tasks_patch_task_request_main_item.py:235](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L235) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Sleep().json - -[Show source in tasks_patch_task_request_main_item.py:227](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L227) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Switch - -[Show source in tasks_patch_task_request_main_item.py:571](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L571) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Switch(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Switch().dict - -[Show source in tasks_patch_task_request_main_item.py:583](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L583) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Switch().json - -[Show source in tasks_patch_task_request_main_item.py:575](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L575) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_ToolCall - -[Show source in tasks_patch_task_request_main_item.py:66](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L66) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_ToolCall().dict - -[Show source in tasks_patch_task_request_main_item.py:81](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L81) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_ToolCall().json - -[Show source in tasks_patch_task_request_main_item.py:73](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L73) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_WaitForInput - -[Show source in tasks_patch_task_request_main_item.py:489](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L489) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_WaitForInput().dict - -[Show source in tasks_patch_task_request_main_item.py:503](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L503) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_WaitForInput().json - -[Show source in tasks_patch_task_request_main_item.py:495](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L495) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksPatchTaskRequestMainItem_Yield - -[Show source in tasks_patch_task_request_main_item.py:107](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L107) - -#### Signature - -```python -class TasksPatchTaskRequestMainItem_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksPatchTaskRequestMainItem_Yield().dict - -[Show source in tasks_patch_task_request_main_item.py:120](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L120) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPatchTaskRequestMainItem_Yield().json - -[Show source in tasks_patch_task_request_main_item.py:112](../../../../../../../julep/api/types/tasks_patch_task_request_main_item.py#L112) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_prompt_step.md b/docs/python-sdk-docs/julep/api/types/tasks_prompt_step.md deleted file mode 100644 index aead87f7b..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_prompt_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksPromptStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksPromptStep - -> Auto-generated documentation for [julep.api.types.tasks_prompt_step](../../../../../../../julep/api/types/tasks_prompt_step.py) module. - -- [TasksPromptStep](#taskspromptstep) - - [TasksPromptStep](#taskspromptstep-1) - -## TasksPromptStep - -[Show source in tasks_prompt_step.py:12](../../../../../../../julep/api/types/tasks_prompt_step.py#L12) - -#### Signature - -```python -class TasksPromptStep(pydantic_v1.BaseModel): ... -``` - -### TasksPromptStep().dict - -[Show source in tasks_prompt_step.py:31](../../../../../../../julep/api/types/tasks_prompt_step.py#L31) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksPromptStep().json - -[Show source in tasks_prompt_step.py:23](../../../../../../../julep/api/types/tasks_prompt_step.py#L23) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_prompt_step_prompt.md b/docs/python-sdk-docs/julep/api/types/tasks_prompt_step_prompt.md deleted file mode 100644 index dcaf88924..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_prompt_step_prompt.md +++ /dev/null @@ -1,6 +0,0 @@ -# Tasks Prompt Step Prompt - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Prompt Step Prompt - -> Auto-generated documentation for [julep.api.types.tasks_prompt_step_prompt](../../../../../../../julep/api/types/tasks_prompt_step_prompt.py) module. -- [Tasks Prompt Step Prompt](#tasks-prompt-step-prompt) diff --git a/docs/python-sdk-docs/julep/api/types/tasks_return_step.md b/docs/python-sdk-docs/julep/api/types/tasks_return_step.md deleted file mode 100644 index 6ffe79f9a..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_return_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksReturnStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksReturnStep - -> Auto-generated documentation for [julep.api.types.tasks_return_step](../../../../../../../julep/api/types/tasks_return_step.py) module. - -- [TasksReturnStep](#tasksreturnstep) - - [TasksReturnStep](#tasksreturnstep-1) - -## TasksReturnStep - -[Show source in tasks_return_step.py:11](../../../../../../../julep/api/types/tasks_return_step.py#L11) - -#### Signature - -```python -class TasksReturnStep(pydantic_v1.BaseModel): ... -``` - -### TasksReturnStep().dict - -[Show source in tasks_return_step.py:25](../../../../../../../julep/api/types/tasks_return_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksReturnStep().json - -[Show source in tasks_return_step.py:17](../../../../../../../julep/api/types/tasks_return_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/tasks_route_list_request_direction.md deleted file mode 100644 index a770714c2..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Tasks Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Route List Request Direction - -> Auto-generated documentation for [julep.api.types.tasks_route_list_request_direction](../../../../../../../julep/api/types/tasks_route_list_request_direction.py) module. -- [Tasks Route List Request Direction](#tasks-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/tasks_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/tasks_route_list_request_sort_by.md deleted file mode 100644 index 6724a2a5e..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Tasks Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.tasks_route_list_request_sort_by](../../../../../../../julep/api/types/tasks_route_list_request_sort_by.py) module. -- [Tasks Route List Request Sort By](#tasks-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/tasks_route_list_response.md b/docs/python-sdk-docs/julep/api/types/tasks_route_list_response.md deleted file mode 100644 index 567d53784..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksRouteListResponse - -> Auto-generated documentation for [julep.api.types.tasks_route_list_response](../../../../../../../julep/api/types/tasks_route_list_response.py) module. - -- [TasksRouteListResponse](#tasksroutelistresponse) - - [TasksRouteListResponse](#tasksroutelistresponse-1) - -## TasksRouteListResponse - -[Show source in tasks_route_list_response.py:11](../../../../../../../julep/api/types/tasks_route_list_response.py#L11) - -#### Signature - -```python -class TasksRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### TasksRouteListResponse().dict - -[Show source in tasks_route_list_response.py:22](../../../../../../../julep/api/types/tasks_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksRouteListResponse().json - -[Show source in tasks_route_list_response.py:14](../../../../../../../julep/api/types/tasks_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_search_step.md b/docs/python-sdk-docs/julep/api/types/tasks_search_step.md deleted file mode 100644 index 261961a32..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_search_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksSearchStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksSearchStep - -> Auto-generated documentation for [julep.api.types.tasks_search_step](../../../../../../../julep/api/types/tasks_search_step.py) module. - -- [TasksSearchStep](#taskssearchstep) - - [TasksSearchStep](#taskssearchstep-1) - -## TasksSearchStep - -[Show source in tasks_search_step.py:11](../../../../../../../julep/api/types/tasks_search_step.py#L11) - -#### Signature - -```python -class TasksSearchStep(pydantic_v1.BaseModel): ... -``` - -### TasksSearchStep().dict - -[Show source in tasks_search_step.py:25](../../../../../../../julep/api/types/tasks_search_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksSearchStep().json - -[Show source in tasks_search_step.py:17](../../../../../../../julep/api/types/tasks_search_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_search_step_search.md b/docs/python-sdk-docs/julep/api/types/tasks_search_step_search.md deleted file mode 100644 index 3a493bb23..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_search_step_search.md +++ /dev/null @@ -1,6 +0,0 @@ -# Tasks Search Step Search - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Search Step Search - -> Auto-generated documentation for [julep.api.types.tasks_search_step_search](../../../../../../../julep/api/types/tasks_search_step_search.py) module. -- [Tasks Search Step Search](#tasks-search-step-search) diff --git a/docs/python-sdk-docs/julep/api/types/tasks_set_key.md b/docs/python-sdk-docs/julep/api/types/tasks_set_key.md deleted file mode 100644 index 38598bcf3..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_set_key.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksSetKey - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksSetKey - -> Auto-generated documentation for [julep.api.types.tasks_set_key](../../../../../../../julep/api/types/tasks_set_key.py) module. - -- [TasksSetKey](#taskssetkey) - - [TasksSetKey](#taskssetkey-1) - -## TasksSetKey - -[Show source in tasks_set_key.py:11](../../../../../../../julep/api/types/tasks_set_key.py#L11) - -#### Signature - -```python -class TasksSetKey(pydantic_v1.BaseModel): ... -``` - -### TasksSetKey().dict - -[Show source in tasks_set_key.py:30](../../../../../../../julep/api/types/tasks_set_key.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksSetKey().json - -[Show source in tasks_set_key.py:22](../../../../../../../julep/api/types/tasks_set_key.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_set_step.md b/docs/python-sdk-docs/julep/api/types/tasks_set_step.md deleted file mode 100644 index e8de84022..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_set_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksSetStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksSetStep - -> Auto-generated documentation for [julep.api.types.tasks_set_step](../../../../../../../julep/api/types/tasks_set_step.py) module. - -- [TasksSetStep](#taskssetstep) - - [TasksSetStep](#taskssetstep-1) - -## TasksSetStep - -[Show source in tasks_set_step.py:11](../../../../../../../julep/api/types/tasks_set_step.py#L11) - -#### Signature - -```python -class TasksSetStep(pydantic_v1.BaseModel): ... -``` - -### TasksSetStep().dict - -[Show source in tasks_set_step.py:25](../../../../../../../julep/api/types/tasks_set_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksSetStep().json - -[Show source in tasks_set_step.py:17](../../../../../../../julep/api/types/tasks_set_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_set_step_set.md b/docs/python-sdk-docs/julep/api/types/tasks_set_step_set.md deleted file mode 100644 index 142512310..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_set_step_set.md +++ /dev/null @@ -1,6 +0,0 @@ -# Tasks Set Step Set - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Set Step Set - -> Auto-generated documentation for [julep.api.types.tasks_set_step_set](../../../../../../../julep/api/types/tasks_set_step_set.py) module. -- [Tasks Set Step Set](#tasks-set-step-set) diff --git a/docs/python-sdk-docs/julep/api/types/tasks_sleep_for.md b/docs/python-sdk-docs/julep/api/types/tasks_sleep_for.md deleted file mode 100644 index 884627663..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_sleep_for.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksSleepFor - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksSleepFor - -> Auto-generated documentation for [julep.api.types.tasks_sleep_for](../../../../../../../julep/api/types/tasks_sleep_for.py) module. - -- [TasksSleepFor](#taskssleepfor) - - [TasksSleepFor](#taskssleepfor-1) - -## TasksSleepFor - -[Show source in tasks_sleep_for.py:10](../../../../../../../julep/api/types/tasks_sleep_for.py#L10) - -#### Signature - -```python -class TasksSleepFor(pydantic_v1.BaseModel): ... -``` - -### TasksSleepFor().dict - -[Show source in tasks_sleep_for.py:39](../../../../../../../julep/api/types/tasks_sleep_for.py#L39) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksSleepFor().json - -[Show source in tasks_sleep_for.py:31](../../../../../../../julep/api/types/tasks_sleep_for.py#L31) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_sleep_step.md b/docs/python-sdk-docs/julep/api/types/tasks_sleep_step.md deleted file mode 100644 index b286704b0..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_sleep_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksSleepStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksSleepStep - -> Auto-generated documentation for [julep.api.types.tasks_sleep_step](../../../../../../../julep/api/types/tasks_sleep_step.py) module. - -- [TasksSleepStep](#taskssleepstep) - - [TasksSleepStep](#taskssleepstep-1) - -## TasksSleepStep - -[Show source in tasks_sleep_step.py:11](../../../../../../../julep/api/types/tasks_sleep_step.py#L11) - -#### Signature - -```python -class TasksSleepStep(pydantic_v1.BaseModel): ... -``` - -### TasksSleepStep().dict - -[Show source in tasks_sleep_step.py:25](../../../../../../../julep/api/types/tasks_sleep_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksSleepStep().json - -[Show source in tasks_sleep_step.py:17](../../../../../../../julep/api/types/tasks_sleep_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_switch_step.md b/docs/python-sdk-docs/julep/api/types/tasks_switch_step.md deleted file mode 100644 index ac6daef52..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_switch_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksSwitchStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksSwitchStep - -> Auto-generated documentation for [julep.api.types.tasks_switch_step](../../../../../../../julep/api/types/tasks_switch_step.py) module. - -- [TasksSwitchStep](#tasksswitchstep) - - [TasksSwitchStep](#tasksswitchstep-1) - -## TasksSwitchStep - -[Show source in tasks_switch_step.py:11](../../../../../../../julep/api/types/tasks_switch_step.py#L11) - -#### Signature - -```python -class TasksSwitchStep(pydantic_v1.BaseModel): ... -``` - -### TasksSwitchStep().dict - -[Show source in tasks_switch_step.py:25](../../../../../../../julep/api/types/tasks_switch_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksSwitchStep().json - -[Show source in tasks_switch_step.py:17](../../../../../../../julep/api/types/tasks_switch_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_task.md b/docs/python-sdk-docs/julep/api/types/tasks_task.md deleted file mode 100644 index 64d55c76d..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_task.md +++ /dev/null @@ -1,40 +0,0 @@ -# TasksTask - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksTask - -> Auto-generated documentation for [julep.api.types.tasks_task](../../../../../../../julep/api/types/tasks_task.py) module. - -- [TasksTask](#taskstask) - - [TasksTask](#taskstask-1) - -## TasksTask - -[Show source in tasks_task.py:13](../../../../../../../julep/api/types/tasks_task.py#L13) - -Object describing a Task - -#### Signature - -```python -class TasksTask(pydantic_v1.BaseModel): ... -``` - -### TasksTask().dict - -[Show source in tasks_task.py:63](../../../../../../../julep/api/types/tasks_task.py#L63) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTask().json - -[Show source in tasks_task.py:55](../../../../../../../julep/api/types/tasks_task.py#L55) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_task_main_item.md b/docs/python-sdk-docs/julep/api/types/tasks_task_main_item.md deleted file mode 100644 index ae12a2f50..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_task_main_item.md +++ /dev/null @@ -1,599 +0,0 @@ -# Tasks Task Main Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Task Main Item - -> Auto-generated documentation for [julep.api.types.tasks_task_main_item](../../../../../../../julep/api/types/tasks_task_main_item.py) module. - -- [Tasks Task Main Item](#tasks-task-main-item) - - [TasksTaskMainItem_Embed](#taskstaskmainitem_embed) - - [TasksTaskMainItem_Error](#taskstaskmainitem_error) - - [TasksTaskMainItem_Evaluate](#taskstaskmainitem_evaluate) - - [TasksTaskMainItem_Foreach](#taskstaskmainitem_foreach) - - [TasksTaskMainItem_Get](#taskstaskmainitem_get) - - [TasksTaskMainItem_IfElse](#taskstaskmainitem_ifelse) - - [TasksTaskMainItem_Log](#taskstaskmainitem_log) - - [TasksTaskMainItem_MapReduce](#taskstaskmainitem_mapreduce) - - [TasksTaskMainItem_Parallel](#taskstaskmainitem_parallel) - - [TasksTaskMainItem_Prompt](#taskstaskmainitem_prompt) - - [TasksTaskMainItem_Return](#taskstaskmainitem_return) - - [TasksTaskMainItem_Search](#taskstaskmainitem_search) - - [TasksTaskMainItem_Set](#taskstaskmainitem_set) - - [TasksTaskMainItem_Sleep](#taskstaskmainitem_sleep) - - [TasksTaskMainItem_Switch](#taskstaskmainitem_switch) - - [TasksTaskMainItem_ToolCall](#taskstaskmainitem_toolcall) - - [TasksTaskMainItem_WaitForInput](#taskstaskmainitem_waitforinput) - - [TasksTaskMainItem_Yield](#taskstaskmainitem_yield) - -## TasksTaskMainItem_Embed - -[Show source in tasks_task_main_item.py:413](../../../../../../../julep/api/types/tasks_task_main_item.py#L413) - -#### Signature - -```python -class TasksTaskMainItem_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Embed().dict - -[Show source in tasks_task_main_item.py:425](../../../../../../../julep/api/types/tasks_task_main_item.py#L425) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Embed().json - -[Show source in tasks_task_main_item.py:417](../../../../../../../julep/api/types/tasks_task_main_item.py#L417) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Error - -[Show source in tasks_task_main_item.py:185](../../../../../../../julep/api/types/tasks_task_main_item.py#L185) - -#### Signature - -```python -class TasksTaskMainItem_Error(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Error().dict - -[Show source in tasks_task_main_item.py:197](../../../../../../../julep/api/types/tasks_task_main_item.py#L197) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Error().json - -[Show source in tasks_task_main_item.py:189](../../../../../../../julep/api/types/tasks_task_main_item.py#L189) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Evaluate - -[Show source in tasks_task_main_item.py:26](../../../../../../../julep/api/types/tasks_task_main_item.py#L26) - -#### Signature - -```python -class TasksTaskMainItem_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Evaluate().dict - -[Show source in tasks_task_main_item.py:40](../../../../../../../julep/api/types/tasks_task_main_item.py#L40) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Evaluate().json - -[Show source in tasks_task_main_item.py:32](../../../../../../../julep/api/types/tasks_task_main_item.py#L32) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Foreach - -[Show source in tasks_task_main_item.py:609](../../../../../../../julep/api/types/tasks_task_main_item.py#L609) - -#### Signature - -```python -class TasksTaskMainItem_Foreach(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Foreach().dict - -[Show source in tasks_task_main_item.py:623](../../../../../../../julep/api/types/tasks_task_main_item.py#L623) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Foreach().json - -[Show source in tasks_task_main_item.py:615](../../../../../../../julep/api/types/tasks_task_main_item.py#L615) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Get - -[Show source in tasks_task_main_item.py:299](../../../../../../../julep/api/types/tasks_task_main_item.py#L299) - -#### Signature - -```python -class TasksTaskMainItem_Get(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Get().dict - -[Show source in tasks_task_main_item.py:311](../../../../../../../julep/api/types/tasks_task_main_item.py#L311) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Get().json - -[Show source in tasks_task_main_item.py:303](../../../../../../../julep/api/types/tasks_task_main_item.py#L303) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_IfElse - -[Show source in tasks_task_main_item.py:529](../../../../../../../julep/api/types/tasks_task_main_item.py#L529) - -#### Signature - -```python -class TasksTaskMainItem_IfElse(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_IfElse().dict - -[Show source in tasks_task_main_item.py:545](../../../../../../../julep/api/types/tasks_task_main_item.py#L545) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_IfElse().json - -[Show source in tasks_task_main_item.py:537](../../../../../../../julep/api/types/tasks_task_main_item.py#L537) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Log - -[Show source in tasks_task_main_item.py:375](../../../../../../../julep/api/types/tasks_task_main_item.py#L375) - -#### Signature - -```python -class TasksTaskMainItem_Log(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Log().dict - -[Show source in tasks_task_main_item.py:387](../../../../../../../julep/api/types/tasks_task_main_item.py#L387) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Log().json - -[Show source in tasks_task_main_item.py:379](../../../../../../../julep/api/types/tasks_task_main_item.py#L379) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_MapReduce - -[Show source in tasks_task_main_item.py:689](../../../../../../../julep/api/types/tasks_task_main_item.py#L689) - -#### Signature - -```python -class TasksTaskMainItem_MapReduce(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_MapReduce().dict - -[Show source in tasks_task_main_item.py:704](../../../../../../../julep/api/types/tasks_task_main_item.py#L704) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_MapReduce().json - -[Show source in tasks_task_main_item.py:696](../../../../../../../julep/api/types/tasks_task_main_item.py#L696) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Parallel - -[Show source in tasks_task_main_item.py:649](../../../../../../../julep/api/types/tasks_task_main_item.py#L649) - -#### Signature - -```python -class TasksTaskMainItem_Parallel(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Parallel().dict - -[Show source in tasks_task_main_item.py:663](../../../../../../../julep/api/types/tasks_task_main_item.py#L663) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Parallel().json - -[Show source in tasks_task_main_item.py:655](../../../../../../../julep/api/types/tasks_task_main_item.py#L655) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Prompt - -[Show source in tasks_task_main_item.py:146](../../../../../../../julep/api/types/tasks_task_main_item.py#L146) - -#### Signature - -```python -class TasksTaskMainItem_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Prompt().dict - -[Show source in tasks_task_main_item.py:159](../../../../../../../julep/api/types/tasks_task_main_item.py#L159) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Prompt().json - -[Show source in tasks_task_main_item.py:151](../../../../../../../julep/api/types/tasks_task_main_item.py#L151) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Return - -[Show source in tasks_task_main_item.py:261](../../../../../../../julep/api/types/tasks_task_main_item.py#L261) - -#### Signature - -```python -class TasksTaskMainItem_Return(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Return().dict - -[Show source in tasks_task_main_item.py:273](../../../../../../../julep/api/types/tasks_task_main_item.py#L273) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Return().json - -[Show source in tasks_task_main_item.py:265](../../../../../../../julep/api/types/tasks_task_main_item.py#L265) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Search - -[Show source in tasks_task_main_item.py:451](../../../../../../../julep/api/types/tasks_task_main_item.py#L451) - -#### Signature - -```python -class TasksTaskMainItem_Search(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Search().dict - -[Show source in tasks_task_main_item.py:463](../../../../../../../julep/api/types/tasks_task_main_item.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Search().json - -[Show source in tasks_task_main_item.py:455](../../../../../../../julep/api/types/tasks_task_main_item.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Set - -[Show source in tasks_task_main_item.py:337](../../../../../../../julep/api/types/tasks_task_main_item.py#L337) - -#### Signature - -```python -class TasksTaskMainItem_Set(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Set().dict - -[Show source in tasks_task_main_item.py:349](../../../../../../../julep/api/types/tasks_task_main_item.py#L349) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Set().json - -[Show source in tasks_task_main_item.py:341](../../../../../../../julep/api/types/tasks_task_main_item.py#L341) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Sleep - -[Show source in tasks_task_main_item.py:223](../../../../../../../julep/api/types/tasks_task_main_item.py#L223) - -#### Signature - -```python -class TasksTaskMainItem_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Sleep().dict - -[Show source in tasks_task_main_item.py:235](../../../../../../../julep/api/types/tasks_task_main_item.py#L235) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Sleep().json - -[Show source in tasks_task_main_item.py:227](../../../../../../../julep/api/types/tasks_task_main_item.py#L227) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Switch - -[Show source in tasks_task_main_item.py:571](../../../../../../../julep/api/types/tasks_task_main_item.py#L571) - -#### Signature - -```python -class TasksTaskMainItem_Switch(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Switch().dict - -[Show source in tasks_task_main_item.py:583](../../../../../../../julep/api/types/tasks_task_main_item.py#L583) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Switch().json - -[Show source in tasks_task_main_item.py:575](../../../../../../../julep/api/types/tasks_task_main_item.py#L575) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_ToolCall - -[Show source in tasks_task_main_item.py:66](../../../../../../../julep/api/types/tasks_task_main_item.py#L66) - -#### Signature - -```python -class TasksTaskMainItem_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_ToolCall().dict - -[Show source in tasks_task_main_item.py:81](../../../../../../../julep/api/types/tasks_task_main_item.py#L81) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_ToolCall().json - -[Show source in tasks_task_main_item.py:73](../../../../../../../julep/api/types/tasks_task_main_item.py#L73) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_WaitForInput - -[Show source in tasks_task_main_item.py:489](../../../../../../../julep/api/types/tasks_task_main_item.py#L489) - -#### Signature - -```python -class TasksTaskMainItem_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_WaitForInput().dict - -[Show source in tasks_task_main_item.py:503](../../../../../../../julep/api/types/tasks_task_main_item.py#L503) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_WaitForInput().json - -[Show source in tasks_task_main_item.py:495](../../../../../../../julep/api/types/tasks_task_main_item.py#L495) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksTaskMainItem_Yield - -[Show source in tasks_task_main_item.py:107](../../../../../../../julep/api/types/tasks_task_main_item.py#L107) - -#### Signature - -```python -class TasksTaskMainItem_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksTaskMainItem_Yield().dict - -[Show source in tasks_task_main_item.py:120](../../../../../../../julep/api/types/tasks_task_main_item.py#L120) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskMainItem_Yield().json - -[Show source in tasks_task_main_item.py:112](../../../../../../../julep/api/types/tasks_task_main_item.py#L112) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_task_tool.md b/docs/python-sdk-docs/julep/api/types/tasks_task_tool.md deleted file mode 100644 index 7be0648db..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_task_tool.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksTaskTool - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksTaskTool - -> Auto-generated documentation for [julep.api.types.tasks_task_tool](../../../../../../../julep/api/types/tasks_task_tool.py) module. - -- [TasksTaskTool](#taskstasktool) - - [TasksTaskTool](#taskstasktool-1) - -## TasksTaskTool - -[Show source in tasks_task_tool.py:11](../../../../../../../julep/api/types/tasks_task_tool.py#L11) - -#### Signature - -```python -class TasksTaskTool(ToolsCreateToolRequest): ... -``` - -### TasksTaskTool().dict - -[Show source in tasks_task_tool.py:25](../../../../../../../julep/api/types/tasks_task_tool.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksTaskTool().json - -[Show source in tasks_task_tool.py:17](../../../../../../../julep/api/types/tasks_task_tool.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_tool_call_step.md b/docs/python-sdk-docs/julep/api/types/tasks_tool_call_step.md deleted file mode 100644 index 871140201..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_tool_call_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksToolCallStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksToolCallStep - -> Auto-generated documentation for [julep.api.types.tasks_tool_call_step](../../../../../../../julep/api/types/tasks_tool_call_step.py) module. - -- [TasksToolCallStep](#taskstoolcallstep) - - [TasksToolCallStep](#taskstoolcallstep-1) - -## TasksToolCallStep - -[Show source in tasks_tool_call_step.py:12](../../../../../../../julep/api/types/tasks_tool_call_step.py#L12) - -#### Signature - -```python -class TasksToolCallStep(pydantic_v1.BaseModel): ... -``` - -### TasksToolCallStep().dict - -[Show source in tasks_tool_call_step.py:31](../../../../../../../julep/api/types/tasks_tool_call_step.py#L31) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksToolCallStep().json - -[Show source in tasks_tool_call_step.py:23](../../../../../../../julep/api/types/tasks_tool_call_step.py#L23) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_update_task_request_main_item.md b/docs/python-sdk-docs/julep/api/types/tasks_update_task_request_main_item.md deleted file mode 100644 index e0a8569f9..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_update_task_request_main_item.md +++ /dev/null @@ -1,599 +0,0 @@ -# Tasks Update Task Request Main Item - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tasks Update Task Request Main Item - -> Auto-generated documentation for [julep.api.types.tasks_update_task_request_main_item](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py) module. - -- [Tasks Update Task Request Main Item](#tasks-update-task-request-main-item) - - [TasksUpdateTaskRequestMainItem_Embed](#tasksupdatetaskrequestmainitem_embed) - - [TasksUpdateTaskRequestMainItem_Error](#tasksupdatetaskrequestmainitem_error) - - [TasksUpdateTaskRequestMainItem_Evaluate](#tasksupdatetaskrequestmainitem_evaluate) - - [TasksUpdateTaskRequestMainItem_Foreach](#tasksupdatetaskrequestmainitem_foreach) - - [TasksUpdateTaskRequestMainItem_Get](#tasksupdatetaskrequestmainitem_get) - - [TasksUpdateTaskRequestMainItem_IfElse](#tasksupdatetaskrequestmainitem_ifelse) - - [TasksUpdateTaskRequestMainItem_Log](#tasksupdatetaskrequestmainitem_log) - - [TasksUpdateTaskRequestMainItem_MapReduce](#tasksupdatetaskrequestmainitem_mapreduce) - - [TasksUpdateTaskRequestMainItem_Parallel](#tasksupdatetaskrequestmainitem_parallel) - - [TasksUpdateTaskRequestMainItem_Prompt](#tasksupdatetaskrequestmainitem_prompt) - - [TasksUpdateTaskRequestMainItem_Return](#tasksupdatetaskrequestmainitem_return) - - [TasksUpdateTaskRequestMainItem_Search](#tasksupdatetaskrequestmainitem_search) - - [TasksUpdateTaskRequestMainItem_Set](#tasksupdatetaskrequestmainitem_set) - - [TasksUpdateTaskRequestMainItem_Sleep](#tasksupdatetaskrequestmainitem_sleep) - - [TasksUpdateTaskRequestMainItem_Switch](#tasksupdatetaskrequestmainitem_switch) - - [TasksUpdateTaskRequestMainItem_ToolCall](#tasksupdatetaskrequestmainitem_toolcall) - - [TasksUpdateTaskRequestMainItem_WaitForInput](#tasksupdatetaskrequestmainitem_waitforinput) - - [TasksUpdateTaskRequestMainItem_Yield](#tasksupdatetaskrequestmainitem_yield) - -## TasksUpdateTaskRequestMainItem_Embed - -[Show source in tasks_update_task_request_main_item.py:413](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L413) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Embed(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Embed().dict - -[Show source in tasks_update_task_request_main_item.py:425](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L425) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Embed().json - -[Show source in tasks_update_task_request_main_item.py:417](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L417) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Error - -[Show source in tasks_update_task_request_main_item.py:185](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L185) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Error(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Error().dict - -[Show source in tasks_update_task_request_main_item.py:197](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L197) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Error().json - -[Show source in tasks_update_task_request_main_item.py:189](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L189) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Evaluate - -[Show source in tasks_update_task_request_main_item.py:26](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L26) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Evaluate(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Evaluate().dict - -[Show source in tasks_update_task_request_main_item.py:40](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L40) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Evaluate().json - -[Show source in tasks_update_task_request_main_item.py:32](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L32) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Foreach - -[Show source in tasks_update_task_request_main_item.py:609](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L609) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Foreach(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Foreach().dict - -[Show source in tasks_update_task_request_main_item.py:623](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L623) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Foreach().json - -[Show source in tasks_update_task_request_main_item.py:615](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L615) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Get - -[Show source in tasks_update_task_request_main_item.py:299](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L299) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Get(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Get().dict - -[Show source in tasks_update_task_request_main_item.py:311](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L311) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Get().json - -[Show source in tasks_update_task_request_main_item.py:303](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L303) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_IfElse - -[Show source in tasks_update_task_request_main_item.py:529](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L529) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_IfElse(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_IfElse().dict - -[Show source in tasks_update_task_request_main_item.py:545](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L545) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_IfElse().json - -[Show source in tasks_update_task_request_main_item.py:537](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L537) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Log - -[Show source in tasks_update_task_request_main_item.py:375](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L375) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Log(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Log().dict - -[Show source in tasks_update_task_request_main_item.py:387](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L387) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Log().json - -[Show source in tasks_update_task_request_main_item.py:379](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L379) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_MapReduce - -[Show source in tasks_update_task_request_main_item.py:689](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L689) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_MapReduce(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_MapReduce().dict - -[Show source in tasks_update_task_request_main_item.py:704](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L704) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_MapReduce().json - -[Show source in tasks_update_task_request_main_item.py:696](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L696) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Parallel - -[Show source in tasks_update_task_request_main_item.py:649](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L649) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Parallel(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Parallel().dict - -[Show source in tasks_update_task_request_main_item.py:663](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L663) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Parallel().json - -[Show source in tasks_update_task_request_main_item.py:655](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L655) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Prompt - -[Show source in tasks_update_task_request_main_item.py:146](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L146) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Prompt(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Prompt().dict - -[Show source in tasks_update_task_request_main_item.py:159](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L159) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Prompt().json - -[Show source in tasks_update_task_request_main_item.py:151](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L151) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Return - -[Show source in tasks_update_task_request_main_item.py:261](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L261) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Return(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Return().dict - -[Show source in tasks_update_task_request_main_item.py:273](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L273) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Return().json - -[Show source in tasks_update_task_request_main_item.py:265](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L265) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Search - -[Show source in tasks_update_task_request_main_item.py:451](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L451) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Search(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Search().dict - -[Show source in tasks_update_task_request_main_item.py:463](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L463) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Search().json - -[Show source in tasks_update_task_request_main_item.py:455](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L455) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Set - -[Show source in tasks_update_task_request_main_item.py:337](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L337) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Set(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Set().dict - -[Show source in tasks_update_task_request_main_item.py:349](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L349) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Set().json - -[Show source in tasks_update_task_request_main_item.py:341](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L341) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Sleep - -[Show source in tasks_update_task_request_main_item.py:223](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L223) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Sleep(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Sleep().dict - -[Show source in tasks_update_task_request_main_item.py:235](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L235) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Sleep().json - -[Show source in tasks_update_task_request_main_item.py:227](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L227) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Switch - -[Show source in tasks_update_task_request_main_item.py:571](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L571) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Switch(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Switch().dict - -[Show source in tasks_update_task_request_main_item.py:583](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L583) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Switch().json - -[Show source in tasks_update_task_request_main_item.py:575](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L575) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_ToolCall - -[Show source in tasks_update_task_request_main_item.py:66](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L66) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_ToolCall(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_ToolCall().dict - -[Show source in tasks_update_task_request_main_item.py:81](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L81) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_ToolCall().json - -[Show source in tasks_update_task_request_main_item.py:73](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L73) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_WaitForInput - -[Show source in tasks_update_task_request_main_item.py:489](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L489) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_WaitForInput(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_WaitForInput().dict - -[Show source in tasks_update_task_request_main_item.py:503](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L503) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_WaitForInput().json - -[Show source in tasks_update_task_request_main_item.py:495](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L495) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## TasksUpdateTaskRequestMainItem_Yield - -[Show source in tasks_update_task_request_main_item.py:107](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L107) - -#### Signature - -```python -class TasksUpdateTaskRequestMainItem_Yield(pydantic_v1.BaseModel): ... -``` - -### TasksUpdateTaskRequestMainItem_Yield().dict - -[Show source in tasks_update_task_request_main_item.py:120](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L120) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksUpdateTaskRequestMainItem_Yield().json - -[Show source in tasks_update_task_request_main_item.py:112](../../../../../../../julep/api/types/tasks_update_task_request_main_item.py#L112) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_wait_for_input_step.md b/docs/python-sdk-docs/julep/api/types/tasks_wait_for_input_step.md deleted file mode 100644 index 94949a2f6..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_wait_for_input_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksWaitForInputStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksWaitForInputStep - -> Auto-generated documentation for [julep.api.types.tasks_wait_for_input_step](../../../../../../../julep/api/types/tasks_wait_for_input_step.py) module. - -- [TasksWaitForInputStep](#taskswaitforinputstep) - - [TasksWaitForInputStep](#taskswaitforinputstep-1) - -## TasksWaitForInputStep - -[Show source in tasks_wait_for_input_step.py:11](../../../../../../../julep/api/types/tasks_wait_for_input_step.py#L11) - -#### Signature - -```python -class TasksWaitForInputStep(pydantic_v1.BaseModel): ... -``` - -### TasksWaitForInputStep().dict - -[Show source in tasks_wait_for_input_step.py:25](../../../../../../../julep/api/types/tasks_wait_for_input_step.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksWaitForInputStep().json - -[Show source in tasks_wait_for_input_step.py:17](../../../../../../../julep/api/types/tasks_wait_for_input_step.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tasks_yield_step.md b/docs/python-sdk-docs/julep/api/types/tasks_yield_step.md deleted file mode 100644 index fb4038462..000000000 --- a/docs/python-sdk-docs/julep/api/types/tasks_yield_step.md +++ /dev/null @@ -1,38 +0,0 @@ -# TasksYieldStep - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / TasksYieldStep - -> Auto-generated documentation for [julep.api.types.tasks_yield_step](../../../../../../../julep/api/types/tasks_yield_step.py) module. - -- [TasksYieldStep](#tasksyieldstep) - - [TasksYieldStep](#tasksyieldstep-1) - -## TasksYieldStep - -[Show source in tasks_yield_step.py:11](../../../../../../../julep/api/types/tasks_yield_step.py#L11) - -#### Signature - -```python -class TasksYieldStep(pydantic_v1.BaseModel): ... -``` - -### TasksYieldStep().dict - -[Show source in tasks_yield_step.py:30](../../../../../../../julep/api/types/tasks_yield_step.py#L30) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### TasksYieldStep().json - -[Show source in tasks_yield_step.py:22](../../../../../../../julep/api/types/tasks_yield_step.py#L22) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_chosen_function_call.md b/docs/python-sdk-docs/julep/api/types/tools_chosen_function_call.md deleted file mode 100644 index e07a53092..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_chosen_function_call.md +++ /dev/null @@ -1,38 +0,0 @@ -# ToolsChosenFunctionCall - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsChosenFunctionCall - -> Auto-generated documentation for [julep.api.types.tools_chosen_function_call](../../../../../../../julep/api/types/tools_chosen_function_call.py) module. - -- [ToolsChosenFunctionCall](#toolschosenfunctioncall) - - [ToolsChosenFunctionCall](#toolschosenfunctioncall-1) - -## ToolsChosenFunctionCall - -[Show source in tools_chosen_function_call.py:11](../../../../../../../julep/api/types/tools_chosen_function_call.py#L11) - -#### Signature - -```python -class ToolsChosenFunctionCall(pydantic_v1.BaseModel): ... -``` - -### ToolsChosenFunctionCall().dict - -[Show source in tools_chosen_function_call.py:25](../../../../../../../julep/api/types/tools_chosen_function_call.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsChosenFunctionCall().json - -[Show source in tools_chosen_function_call.py:17](../../../../../../../julep/api/types/tools_chosen_function_call.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_chosen_tool_call.md b/docs/python-sdk-docs/julep/api/types/tools_chosen_tool_call.md deleted file mode 100644 index 676f843f8..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_chosen_tool_call.md +++ /dev/null @@ -1,77 +0,0 @@ -# Tools Chosen Tool Call - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tools Chosen Tool Call - -> Auto-generated documentation for [julep.api.types.tools_chosen_tool_call](../../../../../../../julep/api/types/tools_chosen_tool_call.py) module. - -- [Tools Chosen Tool Call](#tools-chosen-tool-call) - - [Base](#base) - - [ToolsChosenToolCall_Function](#toolschosentoolcall_function) - -## Base - -[Show source in tools_chosen_tool_call.py:14](../../../../../../../julep/api/types/tools_chosen_tool_call.py#L14) - -#### Signature - -```python -class Base(pydantic_v1.BaseModel): ... -``` - -### Base().dict - -[Show source in tools_chosen_tool_call.py:29](../../../../../../../julep/api/types/tools_chosen_tool_call.py#L29) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### Base().json - -[Show source in tools_chosen_tool_call.py:21](../../../../../../../julep/api/types/tools_chosen_tool_call.py#L21) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## ToolsChosenToolCall_Function - -[Show source in tools_chosen_tool_call.py:53](../../../../../../../julep/api/types/tools_chosen_tool_call.py#L53) - -The response tool value generated by the model - -#### Signature - -```python -class ToolsChosenToolCall_Function(Base): ... -``` - -#### See also - -- [Base](#base) - -### ToolsChosenToolCall_Function().dict - -[Show source in tools_chosen_tool_call.py:69](../../../../../../../julep/api/types/tools_chosen_tool_call.py#L69) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsChosenToolCall_Function().json - -[Show source in tools_chosen_tool_call.py:61](../../../../../../../julep/api/types/tools_chosen_tool_call.py#L61) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_create_tool_request.md b/docs/python-sdk-docs/julep/api/types/tools_create_tool_request.md deleted file mode 100644 index 7fb2bcb10..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_create_tool_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# ToolsCreateToolRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsCreateToolRequest - -> Auto-generated documentation for [julep.api.types.tools_create_tool_request](../../../../../../../julep/api/types/tools_create_tool_request.py) module. - -- [ToolsCreateToolRequest](#toolscreatetoolrequest) - - [ToolsCreateToolRequest](#toolscreatetoolrequest-1) - -## ToolsCreateToolRequest - -[Show source in tools_create_tool_request.py:13](../../../../../../../julep/api/types/tools_create_tool_request.py#L13) - -Payload for creating a tool - -#### Signature - -```python -class ToolsCreateToolRequest(pydantic_v1.BaseModel): ... -``` - -### ToolsCreateToolRequest().dict - -[Show source in tools_create_tool_request.py:41](../../../../../../../julep/api/types/tools_create_tool_request.py#L41) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsCreateToolRequest().json - -[Show source in tools_create_tool_request.py:33](../../../../../../../julep/api/types/tools_create_tool_request.py#L33) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_function_call_option.md b/docs/python-sdk-docs/julep/api/types/tools_function_call_option.md deleted file mode 100644 index 277b38b40..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_function_call_option.md +++ /dev/null @@ -1,38 +0,0 @@ -# ToolsFunctionCallOption - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsFunctionCallOption - -> Auto-generated documentation for [julep.api.types.tools_function_call_option](../../../../../../../julep/api/types/tools_function_call_option.py) module. - -- [ToolsFunctionCallOption](#toolsfunctioncalloption) - - [ToolsFunctionCallOption](#toolsfunctioncalloption-1) - -## ToolsFunctionCallOption - -[Show source in tools_function_call_option.py:10](../../../../../../../julep/api/types/tools_function_call_option.py#L10) - -#### Signature - -```python -class ToolsFunctionCallOption(pydantic_v1.BaseModel): ... -``` - -### ToolsFunctionCallOption().dict - -[Show source in tools_function_call_option.py:24](../../../../../../../julep/api/types/tools_function_call_option.py#L24) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsFunctionCallOption().json - -[Show source in tools_function_call_option.py:16](../../../../../../../julep/api/types/tools_function_call_option.py#L16) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_function_def.md b/docs/python-sdk-docs/julep/api/types/tools_function_def.md deleted file mode 100644 index f08e87dae..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_function_def.md +++ /dev/null @@ -1,40 +0,0 @@ -# ToolsFunctionDef - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsFunctionDef - -> Auto-generated documentation for [julep.api.types.tools_function_def](../../../../../../../julep/api/types/tools_function_def.py) module. - -- [ToolsFunctionDef](#toolsfunctiondef) - - [ToolsFunctionDef](#toolsfunctiondef-1) - -## ToolsFunctionDef - -[Show source in tools_function_def.py:11](../../../../../../../julep/api/types/tools_function_def.py#L11) - -Function definition - -#### Signature - -```python -class ToolsFunctionDef(pydantic_v1.BaseModel): ... -``` - -### ToolsFunctionDef().dict - -[Show source in tools_function_def.py:39](../../../../../../../julep/api/types/tools_function_def.py#L39) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsFunctionDef().json - -[Show source in tools_function_def.py:31](../../../../../../../julep/api/types/tools_function_def.py#L31) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_function_tool.md b/docs/python-sdk-docs/julep/api/types/tools_function_tool.md deleted file mode 100644 index 5ef4f60a5..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_function_tool.md +++ /dev/null @@ -1,38 +0,0 @@ -# ToolsFunctionTool - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsFunctionTool - -> Auto-generated documentation for [julep.api.types.tools_function_tool](../../../../../../../julep/api/types/tools_function_tool.py) module. - -- [ToolsFunctionTool](#toolsfunctiontool) - - [ToolsFunctionTool](#toolsfunctiontool-1) - -## ToolsFunctionTool - -[Show source in tools_function_tool.py:11](../../../../../../../julep/api/types/tools_function_tool.py#L11) - -#### Signature - -```python -class ToolsFunctionTool(pydantic_v1.BaseModel): ... -``` - -### ToolsFunctionTool().dict - -[Show source in tools_function_tool.py:26](../../../../../../../julep/api/types/tools_function_tool.py#L26) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsFunctionTool().json - -[Show source in tools_function_tool.py:18](../../../../../../../julep/api/types/tools_function_tool.py#L18) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_named_function_choice.md b/docs/python-sdk-docs/julep/api/types/tools_named_function_choice.md deleted file mode 100644 index 388aed5dc..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_named_function_choice.md +++ /dev/null @@ -1,38 +0,0 @@ -# ToolsNamedFunctionChoice - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsNamedFunctionChoice - -> Auto-generated documentation for [julep.api.types.tools_named_function_choice](../../../../../../../julep/api/types/tools_named_function_choice.py) module. - -- [ToolsNamedFunctionChoice](#toolsnamedfunctionchoice) - - [ToolsNamedFunctionChoice](#toolsnamedfunctionchoice-1) - -## ToolsNamedFunctionChoice - -[Show source in tools_named_function_choice.py:11](../../../../../../../julep/api/types/tools_named_function_choice.py#L11) - -#### Signature - -```python -class ToolsNamedFunctionChoice(pydantic_v1.BaseModel): ... -``` - -### ToolsNamedFunctionChoice().dict - -[Show source in tools_named_function_choice.py:25](../../../../../../../julep/api/types/tools_named_function_choice.py#L25) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsNamedFunctionChoice().json - -[Show source in tools_named_function_choice.py:17](../../../../../../../julep/api/types/tools_named_function_choice.py#L17) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_named_tool_choice.md b/docs/python-sdk-docs/julep/api/types/tools_named_tool_choice.md deleted file mode 100644 index 67ac8f4c2..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_named_tool_choice.md +++ /dev/null @@ -1,75 +0,0 @@ -# Tools Named Tool Choice - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tools Named Tool Choice - -> Auto-generated documentation for [julep.api.types.tools_named_tool_choice](../../../../../../../julep/api/types/tools_named_tool_choice.py) module. - -- [Tools Named Tool Choice](#tools-named-tool-choice) - - [Base](#base) - - [ToolsNamedToolChoice_Function](#toolsnamedtoolchoice_function) - -## Base - -[Show source in tools_named_tool_choice.py:13](../../../../../../../julep/api/types/tools_named_tool_choice.py#L13) - -#### Signature - -```python -class Base(pydantic_v1.BaseModel): ... -``` - -### Base().dict - -[Show source in tools_named_tool_choice.py:27](../../../../../../../julep/api/types/tools_named_tool_choice.py#L27) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### Base().json - -[Show source in tools_named_tool_choice.py:19](../../../../../../../julep/api/types/tools_named_tool_choice.py#L19) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## ToolsNamedToolChoice_Function - -[Show source in tools_named_tool_choice.py:51](../../../../../../../julep/api/types/tools_named_tool_choice.py#L51) - -#### Signature - -```python -class ToolsNamedToolChoice_Function(Base): ... -``` - -#### See also - -- [Base](#base) - -### ToolsNamedToolChoice_Function().dict - -[Show source in tools_named_tool_choice.py:63](../../../../../../../julep/api/types/tools_named_tool_choice.py#L63) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsNamedToolChoice_Function().json - -[Show source in tools_named_tool_choice.py:55](../../../../../../../julep/api/types/tools_named_tool_choice.py#L55) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_tool.md b/docs/python-sdk-docs/julep/api/types/tools_tool.md deleted file mode 100644 index 4d33f1985..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_tool.md +++ /dev/null @@ -1,75 +0,0 @@ -# Tools Tool - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tools Tool - -> Auto-generated documentation for [julep.api.types.tools_tool](../../../../../../../julep/api/types/tools_tool.py) module. - -- [Tools Tool](#tools-tool) - - [Base](#base) - - [ToolsTool_Function](#toolstool_function) - -## Base - -[Show source in tools_tool.py:16](../../../../../../../julep/api/types/tools_tool.py#L16) - -#### Signature - -```python -class Base(pydantic_v1.BaseModel): ... -``` - -### Base().dict - -[Show source in tools_tool.py:46](../../../../../../../julep/api/types/tools_tool.py#L46) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### Base().json - -[Show source in tools_tool.py:38](../../../../../../../julep/api/types/tools_tool.py#L38) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` - - - -## ToolsTool_Function - -[Show source in tools_tool.py:70](../../../../../../../julep/api/types/tools_tool.py#L70) - -#### Signature - -```python -class ToolsTool_Function(Base): ... -``` - -#### See also - -- [Base](#base) - -### ToolsTool_Function().dict - -[Show source in tools_tool.py:83](../../../../../../../julep/api/types/tools_tool.py#L83) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsTool_Function().json - -[Show source in tools_tool.py:75](../../../../../../../julep/api/types/tools_tool.py#L75) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_tool_response.md b/docs/python-sdk-docs/julep/api/types/tools_tool_response.md deleted file mode 100644 index 7655fb126..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_tool_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# ToolsToolResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / ToolsToolResponse - -> Auto-generated documentation for [julep.api.types.tools_tool_response](../../../../../../../julep/api/types/tools_tool_response.py) module. - -- [ToolsToolResponse](#toolstoolresponse) - - [ToolsToolResponse](#toolstoolresponse-1) - -## ToolsToolResponse - -[Show source in tools_tool_response.py:11](../../../../../../../julep/api/types/tools_tool_response.py#L11) - -#### Signature - -```python -class ToolsToolResponse(pydantic_v1.BaseModel): ... -``` - -### ToolsToolResponse().dict - -[Show source in tools_tool_response.py:26](../../../../../../../julep/api/types/tools_tool_response.py#L26) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### ToolsToolResponse().json - -[Show source in tools_tool_response.py:18](../../../../../../../julep/api/types/tools_tool_response.py#L18) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/tools_tool_type.md b/docs/python-sdk-docs/julep/api/types/tools_tool_type.md deleted file mode 100644 index 704512b7d..000000000 --- a/docs/python-sdk-docs/julep/api/types/tools_tool_type.md +++ /dev/null @@ -1,6 +0,0 @@ -# Tools Tool Type - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Tools Tool Type - -> Auto-generated documentation for [julep.api.types.tools_tool_type](../../../../../../../julep/api/types/tools_tool_type.py) module. -- [Tools Tool Type](#tools-tool-type) diff --git a/docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_direction.md deleted file mode 100644 index 942657be7..000000000 --- a/docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# User Docs Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / User Docs Route List Request Direction - -> Auto-generated documentation for [julep.api.types.user_docs_route_list_request_direction](../../../../../../../julep/api/types/user_docs_route_list_request_direction.py) module. -- [User Docs Route List Request Direction](#user-docs-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_sort_by.md deleted file mode 100644 index 49add30a0..000000000 --- a/docs/python-sdk-docs/julep/api/types/user_docs_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# User Docs Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / User Docs Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.user_docs_route_list_request_sort_by](../../../../../../../julep/api/types/user_docs_route_list_request_sort_by.py) module. -- [User Docs Route List Request Sort By](#user-docs-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/user_docs_route_list_response.md b/docs/python-sdk-docs/julep/api/types/user_docs_route_list_response.md deleted file mode 100644 index 272cf8500..000000000 --- a/docs/python-sdk-docs/julep/api/types/user_docs_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# UserDocsRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / UserDocsRouteListResponse - -> Auto-generated documentation for [julep.api.types.user_docs_route_list_response](../../../../../../../julep/api/types/user_docs_route_list_response.py) module. - -- [UserDocsRouteListResponse](#userdocsroutelistresponse) - - [UserDocsRouteListResponse](#userdocsroutelistresponse-1) - -## UserDocsRouteListResponse - -[Show source in user_docs_route_list_response.py:11](../../../../../../../julep/api/types/user_docs_route_list_response.py#L11) - -#### Signature - -```python -class UserDocsRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### UserDocsRouteListResponse().dict - -[Show source in user_docs_route_list_response.py:22](../../../../../../../julep/api/types/user_docs_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### UserDocsRouteListResponse().json - -[Show source in user_docs_route_list_response.py:14](../../../../../../../julep/api/types/user_docs_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/user_docs_search_route_search_request_body.md b/docs/python-sdk-docs/julep/api/types/user_docs_search_route_search_request_body.md deleted file mode 100644 index 69e2cefff..000000000 --- a/docs/python-sdk-docs/julep/api/types/user_docs_search_route_search_request_body.md +++ /dev/null @@ -1,6 +0,0 @@ -# User Docs Search Route Search Request Body - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / User Docs Search Route Search Request Body - -> Auto-generated documentation for [julep.api.types.user_docs_search_route_search_request_body](../../../../../../../julep/api/types/user_docs_search_route_search_request_body.py) module. -- [User Docs Search Route Search Request Body](#user-docs-search-route-search-request-body) diff --git a/docs/python-sdk-docs/julep/api/types/users_create_or_update_user_request.md b/docs/python-sdk-docs/julep/api/types/users_create_or_update_user_request.md deleted file mode 100644 index 5dd9a655a..000000000 --- a/docs/python-sdk-docs/julep/api/types/users_create_or_update_user_request.md +++ /dev/null @@ -1,38 +0,0 @@ -# UsersCreateOrUpdateUserRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / UsersCreateOrUpdateUserRequest - -> Auto-generated documentation for [julep.api.types.users_create_or_update_user_request](../../../../../../../julep/api/types/users_create_or_update_user_request.py) module. - -- [UsersCreateOrUpdateUserRequest](#userscreateorupdateuserrequest) - - [UsersCreateOrUpdateUserRequest](#userscreateorupdateuserrequest-1) - -## UsersCreateOrUpdateUserRequest - -[Show source in users_create_or_update_user_request.py:12](../../../../../../../julep/api/types/users_create_or_update_user_request.py#L12) - -#### Signature - -```python -class UsersCreateOrUpdateUserRequest(UsersCreateUserRequest): ... -``` - -### UsersCreateOrUpdateUserRequest().dict - -[Show source in users_create_or_update_user_request.py:23](../../../../../../../julep/api/types/users_create_or_update_user_request.py#L23) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### UsersCreateOrUpdateUserRequest().json - -[Show source in users_create_or_update_user_request.py:15](../../../../../../../julep/api/types/users_create_or_update_user_request.py#L15) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/users_create_user_request.md b/docs/python-sdk-docs/julep/api/types/users_create_user_request.md deleted file mode 100644 index 3f765ed01..000000000 --- a/docs/python-sdk-docs/julep/api/types/users_create_user_request.md +++ /dev/null @@ -1,40 +0,0 @@ -# UsersCreateUserRequest - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / UsersCreateUserRequest - -> Auto-generated documentation for [julep.api.types.users_create_user_request](../../../../../../../julep/api/types/users_create_user_request.py) module. - -- [UsersCreateUserRequest](#userscreateuserrequest) - - [UsersCreateUserRequest](#userscreateuserrequest-1) - -## UsersCreateUserRequest - -[Show source in users_create_user_request.py:11](../../../../../../../julep/api/types/users_create_user_request.py#L11) - -Payload for creating a user (and associated documents) - -#### Signature - -```python -class UsersCreateUserRequest(pydantic_v1.BaseModel): ... -``` - -### UsersCreateUserRequest().dict - -[Show source in users_create_user_request.py:35](../../../../../../../julep/api/types/users_create_user_request.py#L35) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### UsersCreateUserRequest().json - -[Show source in users_create_user_request.py:27](../../../../../../../julep/api/types/users_create_user_request.py#L27) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/users_route_list_request_direction.md b/docs/python-sdk-docs/julep/api/types/users_route_list_request_direction.md deleted file mode 100644 index 977ec383d..000000000 --- a/docs/python-sdk-docs/julep/api/types/users_route_list_request_direction.md +++ /dev/null @@ -1,6 +0,0 @@ -# Users Route List Request Direction - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Users Route List Request Direction - -> Auto-generated documentation for [julep.api.types.users_route_list_request_direction](../../../../../../../julep/api/types/users_route_list_request_direction.py) module. -- [Users Route List Request Direction](#users-route-list-request-direction) diff --git a/docs/python-sdk-docs/julep/api/types/users_route_list_request_sort_by.md b/docs/python-sdk-docs/julep/api/types/users_route_list_request_sort_by.md deleted file mode 100644 index a155de328..000000000 --- a/docs/python-sdk-docs/julep/api/types/users_route_list_request_sort_by.md +++ /dev/null @@ -1,6 +0,0 @@ -# Users Route List Request Sort By - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / Users Route List Request Sort By - -> Auto-generated documentation for [julep.api.types.users_route_list_request_sort_by](../../../../../../../julep/api/types/users_route_list_request_sort_by.py) module. -- [Users Route List Request Sort By](#users-route-list-request-sort-by) diff --git a/docs/python-sdk-docs/julep/api/types/users_route_list_response.md b/docs/python-sdk-docs/julep/api/types/users_route_list_response.md deleted file mode 100644 index 4baec8697..000000000 --- a/docs/python-sdk-docs/julep/api/types/users_route_list_response.md +++ /dev/null @@ -1,38 +0,0 @@ -# UsersRouteListResponse - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / UsersRouteListResponse - -> Auto-generated documentation for [julep.api.types.users_route_list_response](../../../../../../../julep/api/types/users_route_list_response.py) module. - -- [UsersRouteListResponse](#usersroutelistresponse) - - [UsersRouteListResponse](#usersroutelistresponse-1) - -## UsersRouteListResponse - -[Show source in users_route_list_response.py:11](../../../../../../../julep/api/types/users_route_list_response.py#L11) - -#### Signature - -```python -class UsersRouteListResponse(pydantic_v1.BaseModel): ... -``` - -### UsersRouteListResponse().dict - -[Show source in users_route_list_response.py:22](../../../../../../../julep/api/types/users_route_list_response.py#L22) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### UsersRouteListResponse().json - -[Show source in users_route_list_response.py:14](../../../../../../../julep/api/types/users_route_list_response.py#L14) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/api/types/users_user.md b/docs/python-sdk-docs/julep/api/types/users_user.md deleted file mode 100644 index e83f75d39..000000000 --- a/docs/python-sdk-docs/julep/api/types/users_user.md +++ /dev/null @@ -1,38 +0,0 @@ -# UsersUser - -[Julep Python SDK Index](../../../README.md#julep-python-sdk-index) / [Julep](../../index.md#julep) / [Julep Python Library](../index.md#julep-python-library) / [Types](./index.md#types) / UsersUser - -> Auto-generated documentation for [julep.api.types.users_user](../../../../../../../julep/api/types/users_user.py) module. - -- [UsersUser](#usersuser) - - [UsersUser](#usersuser-1) - -## UsersUser - -[Show source in users_user.py:12](../../../../../../../julep/api/types/users_user.py#L12) - -#### Signature - -```python -class UsersUser(pydantic_v1.BaseModel): ... -``` - -### UsersUser().dict - -[Show source in users_user.py:43](../../../../../../../julep/api/types/users_user.py#L43) - -#### Signature - -```python -def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]: ... -``` - -### UsersUser().json - -[Show source in users_user.py:35](../../../../../../../julep/api/types/users_user.py#L35) - -#### Signature - -```python -def json(self, **kwargs: typing.Any) -> str: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/client.md b/docs/python-sdk-docs/julep/client.md deleted file mode 100644 index 589c499ee..000000000 --- a/docs/python-sdk-docs/julep/client.md +++ /dev/null @@ -1,112 +0,0 @@ -# Client - -[Julep Python SDK Index](../README.md#julep-python-sdk-index) / [Julep](./index.md#julep) / Client - -> Auto-generated documentation for [julep.client](../../../../../julep/client.py) module. - -- [Client](#client) - - [AsyncClient](#asyncclient) - - [Client](#client-1) - -## AsyncClient - -[Show source in client.py:158](../../../../../julep/client.py#L158) - -A class representing an asynchronous client for interacting with various managers. - -This class initializes asynchronous managers for agents, users, sessions, documents, memories, -and tools. It requires an API key and a base URL to establish a connection with the backend -service. If these are not explicitly provided, it looks for them in the environment variables. - -#### Attributes - -- `agents` *AsyncAgentsManager* - Manager for handling agent-related interactions. -- `users` *AsyncUsersManager* - Manager for handling user-related interactions. -- `sessions` *AsyncSessionsManager* - Manager for handling session-related interactions. -- `docs` *AsyncDocsManager* - Manager for handling document-related interactions. -- `memories` *AsyncMemoriesManager* - Manager for handling memory-related interactions. -- `tools` *AsyncToolsManager* - Manager for handling tool-related interactions. -- `chat` *AsyncChat* - A chat manager instance for handling chat interactions (based on OpenAI client). -- `completions` *AsyncCompletions* - A manager instance for handling completions (based on OpenAI client). - -#### Raises - -- `AssertionError` - If `api_key` or `base_url` is not provided and also not set as an - environment variable. - -#### Notes - -The `api_key` and `base_url` can either be passed explicitly or set as environment -variables `JULEP_API_KEY` and `JULEP_API_URL`, respectively. - -#### Arguments - -- `api_key` *Optional[str]* - The API key required to authenticate with the service. - Defaults to the value of the `JULEP_API_KEY` environment variable. -- `base_url` *Optional[str]* - The base URL of the API service. - Defaults to the value of the `JULEP_API_URL` environment variable. -- `*args` - Variable length argument list. -- `**kwargs` - Arbitrary keyword arguments. - -#### Signature - -```python -class AsyncClient: - @beartype - def __init__( - self, - api_key: Optional[str] = JULEP_API_KEY, - base_url: Optional[str] = JULEP_API_URL, - *args, - **kwargs - ): ... -``` - - - -## Client - -[Show source in client.py:40](../../../../../julep/client.py#L40) - -A class that encapsulates managers for different aspects of a system and provides an interface for interacting with an API. - -This class initializes and makes use of various manager classes to handle agents, users, sessions, documents, memories, and tools. It requires an API key and a base URL to initialize the API client that the managers will use. - -Attributes: - agents (AgentsManager): A manager instance for handling agents. - users (UsersManager): A manager instance for handling users. - sessions (SessionsManager): A manager instance for handling sessions. - docs (DocsManager): A manager instance for handling documents. - memories (MemoriesManager): A manager instance for handling memories. - tools (ToolsManager): A manager instance for handling tools. - chat (Chat): A chat manager instance for handling chat interactions (based on OpenAI client). - completions (Completions): A manager instance for handling completions (based on OpenAI client). - -Args: - api_key (Optional[str]): The API key needed to authenticate with the API. Defaults to the JULEP_API_KEY environment variable. - base_url (Optional[str]): The base URL for the API endpoints. Defaults to the JULEP_API_URL environment variable. - *args: Variable length argument list. - **kwargs: Arbitrary keyword arguments. - -Raises: - AssertionError: If either `api_key` or `base_url` is not provided and not set as an environment variable. - -Note: - `beartype` decorator is expected to ensure type checking on the parameters during runtime. The constants `JULEP_API_KEY` and `JULEP_API_URL` should be predefined and represent default values for the API key and base URL, respectively, which can be overridden by providing a value at instantiation. - -#### Signature - -```python -class Client: - @beartype - def __init__( - self, - api_key: Optional[str] = JULEP_API_KEY, - base_url: Optional[str] = JULEP_API_URL, - timeout: int = 300, - additional_headers: Dict[str, str] = {}, - _httpx_client: Optional[httpx.Client] = None, - *args, - **kwargs - ): ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/env.md b/docs/python-sdk-docs/julep/env.md deleted file mode 100644 index b0a6fe385..000000000 --- a/docs/python-sdk-docs/julep/env.md +++ /dev/null @@ -1,14 +0,0 @@ -# Env - -[Julep Python SDK Index](../README.md#julep-python-sdk-index) / [Julep](./index.md#julep) / Env - -> Auto-generated documentation for [julep.env](../../../../../julep/env.py) module. - -#### Attributes - -- `env` - Initialize the environment variable handler.: Env() - -- `JULEP_API_KEY`: `Optional[str]` - Optional environment variable for the Julep API key. Defaults to None if not set.: env.str('JULEP_API_KEY', None) - -- `JULEP_API_URL`: `Optional[str]` - Optional environment variable for the Julep API URL. Defaults to the Julep API's default environment URL if not set.: env.str('JULEP_API_URL', JulepApiEnvironment.DEFAULT.value) -- [Env](#env) diff --git a/docs/python-sdk-docs/julep/index.md b/docs/python-sdk-docs/julep/index.md deleted file mode 100644 index 956edacf9..000000000 --- a/docs/python-sdk-docs/julep/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Julep - -[Julep Python SDK Index](../README.md#julep-python-sdk-index) / Julep - -> Auto-generated documentation for [julep](../../../../../julep/__init__.py) module. - -- [Julep](#julep) - - [Modules](#modules) - -## Modules - -- [Julep Python Library](api/index.md) -- [Client](./client.md) -- [Env](./env.md) -- [Managers](managers/index.md) -- [Utils](utils/index.md) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/agent.md b/docs/python-sdk-docs/julep/managers/agent.md deleted file mode 100644 index aaf04fd29..000000000 --- a/docs/python-sdk-docs/julep/managers/agent.md +++ /dev/null @@ -1,748 +0,0 @@ -# Agent - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Agent - -> Auto-generated documentation for [julep.managers.agent](../../../../../../julep/managers/agent.py) module. - -- [Agent](#agent) - - [AgentCreateArgs](#agentcreateargs) - - [AgentUpdateArgs](#agentupdateargs) - - [AgentsManager](#agentsmanager) - - [AsyncAgentsManager](#asyncagentsmanager) - - [BaseAgentsManager](#baseagentsmanager) - -## AgentCreateArgs - -[Show source in agent.py:41](../../../../../../julep/managers/agent.py#L41) - -#### Signature - -```python -class AgentCreateArgs(TypedDict): ... -``` - - - -## AgentUpdateArgs - -[Show source in agent.py:53](../../../../../../julep/managers/agent.py#L53) - -#### Signature - -```python -class AgentUpdateArgs(TypedDict): ... -``` - - - -## AgentsManager - -[Show source in agent.py:312](../../../../../../julep/managers/agent.py#L312) - -A class for managing agents, inheriting from [BaseAgentsManager](#baseagentsmanager). - -This class provides functionalities to interact with and manage agents, including creating, retrieving, listing, updating, and deleting agents. It utilizes type annotations to ensure type correctness at runtime using the `beartype` decorator. - -#### Methods - -- `get(id` - Union[str, UUID]) -> Agent: - Retrieves an agent by its unique identifier. - -#### Arguments - -id (Union[str, UUID]): The unique identifier of the agent, which can be either a string or a UUID. - -- `name` *str* - The name of the agent. -- `about` *str* - A description of the agent. -- `instructions` *List[str]* - A list of instructions or dictionaries defining instructions. -- `tools` *List[ToolDict], optional* - A list of dictionaries defining tools. Defaults to an empty list. -- `functions` *List[FunctionDefDict], optional* - A list of dictionaries defining functions. Defaults to an empty list. -- `default_settings` *DefaultSettingsDict, optional* - A dictionary of default settings. Defaults to an empty dictionary. -- `model` *ModelName, optional* - The model name to be used. Defaults to 'julep-ai/samantha-1-turbo'. -- `docs` *List[DocDict], optional* - A list of dictionaries defining documentation. Defaults to an empty list. -metadata (Dict[str, Any]) - -- `limit` *Optional[int], optional* - The maximum number of agents to retrieve. Defaults to None, meaning no limit. -- `offset` *Optional[int], optional* - The number of agents to skip (for pagination). Defaults to None. - -agent_id (Union[str, UUID]): The unique identifier of the agent to be deleted. - -- `update(*,` *agent_id* - Union[str, UUID], about: Optional[str]=None, instructions: Optional[List[str]]=None, name: Optional[str]=None, model: Optional[str]=None, default_settings: Optional[DefaultSettingsDict]=None) -> ResourceUpdatedResponse: - Updates an existing agent with new details. - -agent_id (Union[str, UUID]): The unique identifier of the agent to be updated. -- `about` *Optional[str], optional* - A new description of the agent. Defaults to None (no change). -- `instructions` *Optional[List[str]], optional* - A new list of instructions or dictionaries defining instructions. Defaults to None (no change). -- `name` *Optional[str], optional* - A new name for the agent. Defaults to None (no change). -- `model` *Optional[str], optional* - A new model name to be used. Defaults to None (no change). -- `default_settings` *Optional[DefaultSettingsDict], optional* - A new dictionary of default settings. Defaults to None (no change). -metadata (Dict[str, Any]) - -#### Returns - -- `Agent` - The agent with the corresponding identifier. - -- `create(*,` *name* - str, about: str, instructions: List[str], tools: List[ToolDict]=[], functions: List[FunctionDefDict]=[], default_settings: DefaultSettingsDict={}, model: ModelName='julep-ai/samantha-1-turbo', docs: List[DocDict]=[]) -> ResourceCreatedResponse: - Creates a new agent with the provided details. - -- `ResourceCreatedResponse` - The response indicating the resource (agent) was successfully created. - -- `list(*,` *limit* - Optional[int]=None, offset: Optional[int]=None) -> List[Agent]: - Lists all agents with pagination support. - -- `List[Agent]` - A list of agents, considering the pagination parameters. - -- `delete(agent_id` - Union[str, UUID]): - Deletes an agent by its unique identifier. - -- `ResourceUpdatedResponse` - The response indicating the resource (agent) was successfully updated. - -#### Signature - -```python -class AgentsManager(BaseAgentsManager): ... -``` - -#### See also - -- [BaseAgentsManager](#baseagentsmanager) - -### AgentsManager().create - -[Show source in agent.py:394](../../../../../../julep/managers/agent.py#L394) - -Creates a new resource with the specified details. - -#### Arguments - -- `name` *str* - The name of the resource. -- `about` *str* - A description of the resource. -- `instructions` *List[str]* - A list of instructions or dictionaries with instruction details. -- `tools` *List[ToolDict], optional* - A list of dictionaries with tool details. Defaults to an empty list. -- `functions` *List[FunctionDefDict], optional* - A list of dictionaries with function definition details. Defaults to an empty list. -- `default_settings` *DefaultSettingsDict, optional* - A dictionary with default settings. Defaults to an empty dictionary. -- `model` *ModelName, optional* - The name of the model to use. Defaults to 'julep-ai/samantha-1-turbo'. -- `docs` *List[DocDict], optional* - A list of dictionaries with documentation details. Defaults to an empty list. -metadata (Dict[str, Any]) - -#### Returns - -- `Agent` - An instance of the Agent with the specified details - -#### Notes - -This function is decorated with `@beartype`, which will perform runtime type checking on the arguments. - -#### Signature - -```python -@beartype -@rewrap_in_class(Agent) -def create(self, **kwargs: AgentCreateArgs) -> Agent: ... -``` - -#### See also - -- [AgentCreateArgs](#agentcreateargs) - -### AgentsManager().delete - -[Show source in agent.py:453](../../../../../../julep/managers/agent.py#L453) - -Delete the agent with the specified ID. - -Args: - agent_id (Union[str, UUID]): The identifier of the agent to be deleted. - -Returns: - The return type depends on the implementation of the `_delete` method. This will typically be `None` - if the deletion is successful, or an error may be raised if the deletion fails. - -Note: - The `@beartype` decorator is used to enforce type checking of the `agent_id` parameter. - -#### Signature - -```python -@beartype -def delete(self, agent_id: Union[str, UUID]): ... -``` - -### AgentsManager().get - -[Show source in agent.py:377](../../../../../../julep/managers/agent.py#L377) - -Retrieve an Agent object by its identifier. - -#### Arguments - -id (Union[str, UUID]): The unique identifier of the Agent to be retrieved. - -#### Returns - -- `Agent` - An instance of the Agent with the specified ID. - -#### Raises - -- `BeartypeException` - If the type of `id` is neither a string nor a UUID. -Any exception raised by the `_get` method. - -#### Signature - -```python -@beartype -def get(self, id: Union[str, UUID]) -> Agent: ... -``` - -### AgentsManager().list - -[Show source in agent.py:420](../../../../../../julep/managers/agent.py#L420) - -List the Agent objects, possibly with pagination. - -#### Arguments - -- `limit` *Optional[int], optional* - The maximum number of Agent objects to return. - Defaults to None, meaning no limit is applied. -- `offset` *Optional[int], optional* - The number of initial Agent objects to skip before - starting to collect the return list. Defaults to None, - meaning no offset is applied. - -#### Returns - -- `List[Agent]` - A list of Agent objects. - -#### Raises - -- `BeartypeDecorHintPepParamViolation` - If the function is called with incorrect types - for the `limit` or `offset` parameters. - -#### Signature - -```python -@beartype -def list( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[Agent]: ... -``` - -### AgentsManager().update - -[Show source in agent.py:470](../../../../../../julep/managers/agent.py#L470) - -Update the properties of a resource. - -This function updates various attributes of an existing resource based on the provided keyword arguments. All updates are optional and are applied only if the corresponding argument is given. - -#### Arguments - -agent_id (Union[str, UUID]): The identifier of the agent, either as a string or a UUID object. -- `about` *Optional[str], optional* - A brief description of the agent. Defaults to None. -- `instructions` *Optional[List[str]], optional* - A list of instructions or instruction dictionaries to update the agent with. Defaults to None. -- `name` *Optional[str], optional* - The new name to assign to the agent. Defaults to None. -- `model` *Optional[str], optional* - The model identifier to associate with the agent. Defaults to None. -- `default_settings` *Optional[DefaultSettingsDict], optional* - A dictionary of default settings to apply to the agent. Defaults to None. -metadata (Dict[str, Any]) -- `overwrite` *bool, optional* - Whether to overwrite the existing agent settings. Defaults to False. - -#### Returns - -- `ResourceUpdatedResponse` - An object representing the response to the update request. - -#### Notes - -This method is decorated with `beartype`, which means it enforces type annotations at runtime. - -#### Signature - -```python -@beartype -@rewrap_in_class(Agent) -def update(self, agent_id: Union[str, UUID], **kwargs: AgentUpdateArgs) -> Agent: ... -``` - -#### See also - -- [AgentUpdateArgs](#agentupdateargs) - - - -## AsyncAgentsManager - -[Show source in agent.py:499](../../../../../../julep/managers/agent.py#L499) - -A class for managing asynchronous agent operations. - -This class provides asynchronous methods for creating, retrieving, updating, -listing, and deleting agents. It is a subclass of BaseAgentsManager, which -defines the underlying functionality and structure that this class utilizes. - -#### Attributes - -None explicitly listed, as they are inherited from the [BaseAgentsManager](#baseagentsmanager) class. - -#### Methods - -get: - Retrieves a single agent by its ID. - -#### Arguments - -id (Union[UUID, str]): The unique identifier of the agent to retrieve. - -- `name` *str* - The name of the agent to create. -- `about` *str* - A description of the agent. -- `instructions` *List[str]* - The instructions for operating the agent. -- `tools` *List[ToolDict], optional* - An optional list of tools for the agent. -- `functions` *List[FunctionDefDict], optional* - An optional list of functions the agent can perform. -- `default_settings` *DefaultSettingsDict, optional* - Optional default settings for the agent. -- `model` *ModelName, optional* - The model name to associate with the agent, defaults to 'julep-ai/samantha-1-turbo'. -- `docs` *List[DocDict], optional* - An optional list of documents associated with the agent. -metadata (Dict[str, Any]) - -- `limit` *Optional[int], optional* - The maximum number of agents to retrieve. -- `offset` *Optional[int], optional* - The number of agents to skip before starting to collect the results. - -agent_id (Union[str, UUID]): The unique identifier of the agent to delete. - -agent_id (Union[str, UUID]): The unique identifier of the agent to update. -- `about` *Optional[str], optional* - An optional new description for the agent. -- `instructions` *Optional[List[str]], optional* - Optional new instructions for the agent. -- `name` *Optional[str], optional* - An optional new name for the agent. -- `model` *Optional[str], optional* - Optional new model associated with the agent. -- `default_settings` *Optional[DefaultSettingsDict], optional* - Optional new default settings for the agent. -metadata (Dict[str, Any]) - -#### Returns - -- `Agent` - The requested agent. - -create: - Creates a new agent with the provided specifications. - -- `ResourceCreatedResponse` - A response indicating the agent was created successfully. - -list: - Asynchronously lists agents with optional pagination and returns an awaitable object. - -- `List[Agent]` - A list of agents. - -delete: - Asynchronously deletes an agent by its ID and returns an awaitable object. - -The response from the delete operation (specific return type may vary). - -update: - Asynchronously updates the specified fields of an agent by its ID and returns an awaitable object. - -- `ResourceUpdatedResponse` - A response indicating the agent was updated successfully. - -#### Signature - -```python -class AsyncAgentsManager(BaseAgentsManager): ... -``` - -#### See also - -- [BaseAgentsManager](#baseagentsmanager) - -### AsyncAgentsManager().create - -[Show source in agent.py:591](../../../../../../julep/managers/agent.py#L591) - -Create a new resource asynchronously with specified details. - -This function is decorated with `beartype` to ensure that arguments conform to specified types. - -#### Arguments - -- `name` *str* - The name of the resource to create. -- `about` *str* - Information or description about the resource. -- `instructions` *List[str]* - A list of strings or dictionaries detailing the instructions for the resource. -- `tools` *List[ToolDict], optional* - A list of dictionaries representing the tools associated with the resource. Defaults to an empty list. -- `functions` *List[FunctionDefDict], optional* - A list of dictionaries defining functions that can be performed with the resource. Defaults to an empty list. -- `default_settings` *DefaultSettingsDict, optional* - A dictionary with default settings for the resource. Defaults to an empty dictionary. -- `model` *ModelName, optional* - The model identifier to use for the resource. Defaults to 'julep-ai/samantha-1-turbo'. -- `docs` *List[DocDict], optional* - A list of dictionaries containing documentation for the resource. Defaults to an empty list. -metadata (Dict[str, Any]) - -#### Returns - -- `Agent` - An instance of the Agent with the specified details - -#### Raises - -The exceptions that may be raised are not specified in the signature and depend on the implementation of the _create method. - -#### Signature - -```python -@beartype -@rewrap_in_class(Agent) -async def create(self, **kwargs: AgentCreateArgs) -> Agent: ... -``` - -#### See also - -- [AgentCreateArgs](#agentcreateargs) - -### AsyncAgentsManager().delete - -[Show source in agent.py:650](../../../../../../julep/managers/agent.py#L650) - -Asynchronously deletes an agent given its identifier. - -This function is decorated with @beartype to ensure type checking of the input argument at runtime. - -#### Arguments - -agent_id (Union[str, UUID]): The identifier of the agent to be deleted. Can be a string or a UUID object. - -#### Returns - -The result of the asynchronous deletion operation, which is implementation-dependent. - -#### Signature - -```python -@beartype -async def delete(self, agent_id: Union[str, UUID]): ... -``` - -### AsyncAgentsManager().get - -[Show source in agent.py:572](../../../../../../julep/managers/agent.py#L572) - -Asynchronously retrieve an Agent object by its ID. - -The `id` parameter can be either a UUID or a string representation of a UUID. - -#### Arguments - -id (Union[UUID, str]): The unique identifier of the Agent to retrieve. - -#### Returns - -- `Agent` - The Agent object associated with the given id. - -#### Raises - -- `Beartype` *exceptions* - If the input id does not conform to the specified types. -- `Other` *exceptions* - Depending on the implementation of the `_get` method. - -#### Signature - -```python -@beartype -async def get(self, id: Union[UUID, str]) -> Agent: ... -``` - -### AsyncAgentsManager().list - -[Show source in agent.py:619](../../../../../../julep/managers/agent.py#L619) - -Asynchronously lists agents with optional limit and offset. - -This method wraps the call to a private method '_list_items' which performs the actual listing -of agent items. It uses the 'beartype' decorator for runtime type checking. - -#### Arguments - -- `limit` *Optional[int], optional* - The maximum number of agent items to return. Defaults to None, which means no limit. -- `offset` *Optional[int], optional* - The offset from where to start the listing. Defaults to None, which means start from the beginning. - -#### Returns - -- `List[Agent]` - A list of agent items collected based on the provided 'limit' and 'offset' parameters. - -#### Signature - -```python -@beartype -async def list( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[Agent]: ... -``` - -### AsyncAgentsManager().update - -[Show source in agent.py:665](../../../../../../julep/managers/agent.py#L665) - -Asynchronously update an agent's details. - -This function is decorated with `beartype` to enforce the type checking of parameters. It updates the properties of the agent identified by `agent_id`. - -#### Arguments - -agent_id (Union[str, UUID]): Unique identifier for the agent. It can be a string or a UUID object. -- `about` *Optional[str]* - Additional information about the agent. Default is None. -- `instructions` *Optional[List[str]]* - A list of instructions or instruction dictionaries. Default is None. -- `name` *Optional[str]* - The name of the agent. Default is None. -- `model` *Optional[str]* - The model identifier or name. Default is None. -- `default_settings` *Optional[DefaultSettingsDict]* - Dictionary with default settings for the agent. Default is None. -metadata (Dict[str, Any]) -- `overwrite` *bool* - Whether to overwrite the existing agent settings. Default is False. - -#### Returns - -- `ResourceUpdatedResponse` - An object containing the details of the update response. - -#### Signature - -```python -@beartype -@rewrap_in_class(Agent) -async def update( - self, agent_id: Union[str, UUID], **kwargs: AgentUpdateArgs -) -> Agent: ... -``` - -#### See also - -- [AgentUpdateArgs](#agentupdateargs) - - - -## BaseAgentsManager - -[Show source in agent.py:63](../../../../../../julep/managers/agent.py#L63) - -A class responsible for managing agent entities. - -This manager handles CRUD operations for agents including retrieving, creating, listing, deleting, and updating agents using an API client. - -#### Attributes - -- `api_client` *ApiClientType* - The client responsible for API interactions. - -#### Methods - -- `_get(self,` *id* - Union[str, UUID]) -> Union[Agent, Awaitable[Agent]]: - Retrieves a single agent by its UUID. - -#### Arguments - -id (Union[str, UUID]): The UUID of the agent to retrieve. -- `name` *str* - The name of the new agent. -- `about` *str* - Description about the new agent. -- `instructions` *List[str]* - List of instructions or instruction dictionaries for the new agent. -- `tools` *List[ToolDict], optional* - List of tool dictionaries. Defaults to an empty list. -- `functions` *List[FunctionDefDict], optional* - List of function definition dictionaries. Defaults to an empty list. -- `default_settings` *DefaultSettingsDict, optional* - Dictionary of default settings for the new agent. Defaults to an empty dictionary. -- `model` *ModelName, optional* - The model name for the new agent. Defaults to 'julep-ai/samantha-1-turbo'. -- `docs` *List[DocDict], optional* - List of document dictionaries for the new agent. Defaults to an empty list. -metadata (Dict[str, Any], optional): Dictionary of metadata for the new agent. Defaults to an empty dictionary. -- `limit` *Optional[int], optional* - The maximum number of agents to list. Defaults to None. -- `offset` *Optional[int], optional* - The number of agents to skip (for pagination). Defaults to None. -metadata_filter (Dict[str, Any], optional): Filters for querying agents based on metadata. Defaults to an empty dictionary. -agent_id (Union[str, UUID]): The UUID of the agent to delete. -agent_id (Union[str, UUID]): The UUID of the agent to update. -- `about` *Optional[str], optional* - The new description about the agent. -- `instructions` *Optional[List[str]], optional* - The new list of instructions or instruction dictionaries. -- `name` *Optional[str], optional* - The new name for the agent. -- `model` *Optional[str], optional* - The new model name for the agent. -- `default_settings` *Optional[DefaultSettingsDict], optional* - The new default settings dictionary for the agent. -metadata (Dict[str, Any]) - -#### Returns - -The agent object or an awaitable that resolves to the agent object. - -- `_create(self,` *name* - str, about: str, instructions: List[str], tools: List[ToolDict] = [], functions: List[FunctionDefDict] = [], default_settings: DefaultSettingsDict = {}, model: ModelName = 'julep-ai/samantha-1-turbo', docs: List[DocDict] = [], metadata: Dict[str, Any] = {}) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: - Creates an agent with the given specifications. - The response indicating creation or an awaitable that resolves to the creation response. - -- `_list_items(self,` *limit* - Optional[int] = None, offset: Optional[int] = None, metadata_filter: Dict[str, Any] = {}) -> Union[ListAgentsResponse, Awaitable[ListAgentsResponse]]: - Lists agents with pagination support and optional metadata filtering. - The list of agents or an awaitable that resolves to the list of agents. - -- `_delete(self,` *agent_id* - Union[str, UUID]) -> Union[None, Awaitable[None]]: - Deletes an agent with the specified UUID. - None or an awaitable that resolves to None. - -- `_update(self,` *agent_id* - Union[str, UUID], about: Optional[str] = None, instructions: Optional[List[str]] = None, name: Optional[str] = None, model: Optional[str] = None, default_settings: Optional[DefaultSettingsDict] = None, metadata: Dict[str, Any] = {}) -> Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: - Updates the specified fields of an agent. - The response indicating successful update or an awaitable that resolves to the update response. - -#### Signature - -```python -class BaseAgentsManager(BaseManager): ... -``` - -### BaseAgentsManager()._create - -[Show source in agent.py:141](../../../../../../julep/managers/agent.py#L141) - -Create a new agent with the specified configuration. - -#### Arguments - -- `name` *str* - Name of the agent. -- `about` *str* - Information about the agent. -- `instructions` *List[str]* - List of instructions as either string or dictionaries for the agent. -- `tools` *List[ToolDict], optional* - List of tool configurations for the agent. Defaults to an empty list. -- `functions` *List[FunctionDefDict], optional* - List of function definitions for the agent. Defaults to an empty list. -- `default_settings` *DefaultSettingsDict, optional* - Dictionary of default settings for the agent. Defaults to an empty dict. -- `model` *ModelName, optional* - The model name identifier. Defaults to 'julep-ai/samantha-1-turbo'. -- `docs` *List[DocDict], optional* - List of document configurations for the agent. Defaults to an empty list. -metadata (Dict[str, Any]) - -#### Returns - -- `Union[ResourceCreatedResponse,` *Awaitable[ResourceCreatedResponse]]* - The response object indicating the resource has been created or a future of the response object if the creation is being awaited. - -#### Raises - -- `AssertionError` - If both functions and tools are provided. - -#### Notes - -The `_create` method is meant to be used internally and should be considered private. -It assumes the input data for instructions, tools, and docs will have the proper format, -and items in the 'instructions' list will be converted to Instruction instances. - -#### Signature - -```python -def _create( - self, - name: str, - about: str = "", - instructions: List[str] = [], - tools: List[ToolDict] = [], - functions: List[FunctionDefDict] = [], - default_settings: DefaultSettingsDict = {}, - model: ModelName = "julep-ai/samantha-1-turbo", - docs: List[DocDict] = [], - metadata: Dict[str, Any] = {}, -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - -#### See also - -- [ModelName](#modelname) - -### BaseAgentsManager()._delete - -[Show source in agent.py:235](../../../../../../julep/managers/agent.py#L235) - -Delete an agent by its ID. - -#### Arguments - -agent_id (Union[str, UUID]): The UUID v4 of the agent to be deleted. - -#### Returns - -- `Union[None,` *Awaitable[None]]* - A future that resolves to None if the -operation is asynchronous, or None immediately if the operation is -synchronous. - -#### Raises - -- `AssertionError` - If `agent_id` is not a valid UUID v4. - -#### Signature - -```python -def _delete(self, agent_id: Union[str, UUID]) -> Union[None, Awaitable[None]]: ... -``` - -### BaseAgentsManager()._get - -[Show source in agent.py:125](../../../../../../julep/managers/agent.py#L125) - -Retrieves an agent based on the provided identifier. - -#### Arguments - -id (Union[str, UUID]): The identifier of the agent, which can be a string or UUID object. - -#### Returns - -- `Union[Agent,` *Awaitable[Agent]]* - The agent object or an awaitable yielding the agent object, depending on the API client. - -#### Raises - -- `AssertionError` - If the provided id is not a valid UUID v4. - -#### Signature - -```python -def _get(self, id: Union[str, UUID]) -> Union[Agent, Awaitable[Agent]]: ... -``` - -### BaseAgentsManager()._list_items - -[Show source in agent.py:211](../../../../../../julep/managers/agent.py#L211) - -Lists items with optional pagination. - -This method wraps the `list_agents` API call and includes optional limit and offset parameters for pagination. - -Args: - limit (Optional[int], optional): The maximum number of items to return. Defaults to None, which means no limit. - offset (Optional[int], optional): The index of the first item to return. Defaults to None, which means no offset. - -Returns: - Union[ListAgentsResponse, Awaitable[ListAgentsResponse]]: A ListAgentsResponse object, or an awaitable that resolves to a ListAgentsResponse object. - -#### Signature - -```python -def _list_items( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: str = "{}", -) -> Union[ListAgentsResponse, Awaitable[ListAgentsResponse]]: ... -``` - -### BaseAgentsManager()._update - -[Show source in agent.py:253](../../../../../../julep/managers/agent.py#L253) - -Update the agent's properties. - -Args: - agent_id (Union[str, UUID]): The unique identifier for the agent, which can be a string or UUID object. - about (Optional[str], optional): A brief description of the agent. Defaults to None. - instructions (Optional[List[str]], optional): A list of either strings or instruction dictionaries that will be converted into Instruction objects. Defaults to None. - name (Optional[str], optional): The name of the agent. Defaults to None. - model (Optional[str], optional): The model identifier for the agent. Defaults to None. - default_settings (Optional[DefaultSettingsDict], optional): A dictionary of default settings to apply to the agent. Defaults to None. - metadata (Dict[str, Any]) - overwrite (bool, optional): Whether to overwrite the existing agent settings. Defaults to False. - -Returns: - Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: An object representing the response for the resource updated, which can also be an awaitable in asynchronous contexts. - -Raises: - AssertionError: If the provided agent_id is not validated by the is_valid_uuid4 function. - -Note: - This method asserts that the agent_id must be a valid UUID v4. The instructions and default_settings, if provided, are converted into their respective object types before making the update API call. - -#### Signature - -```python -def _update( - self, - agent_id: Union[str, UUID], - about: Optional[str] = NotSet, - instructions: List[str] = NotSet, - name: Optional[str] = NotSet, - model: Optional[str] = NotSet, - default_settings: Optional[DefaultSettingsDict] = NotSet, - metadata: Dict[str, Any] = NotSet, - overwrite: bool = False, -) -> Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/base.md b/docs/python-sdk-docs/julep/managers/base.md deleted file mode 100644 index 242176b4f..000000000 --- a/docs/python-sdk-docs/julep/managers/base.md +++ /dev/null @@ -1,27 +0,0 @@ -# Base - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Base - -> Auto-generated documentation for [julep.managers.base](../../../../../../julep/managers/base.py) module. - -- [Base](#base) - - [BaseManager](#basemanager) - -## BaseManager - -[Show source in base.py:7](../../../../../../julep/managers/base.py#L7) - -A class that serves as a base manager for working with different API clients. This class is responsible for abstracting the complexities of interacting with various API clients, providing a unified interface for higher-level components. - -Attributes: - api_client (Union[JulepApi, AsyncJulepApi]): A client instance for communicating with an API. This attribute is essential for enabling the class to perform API operations, whether they are synchronous or asynchronous. - -Args: - api_client (Union[JulepApi, AsyncJulepApi]): The API client that is used for making API calls. It is crucial for the operation of this class, allowing it to interact with the API effectively. - -#### Signature - -```python -class BaseManager: - def __init__(self, api_client: Union[JulepApi, AsyncJulepApi]): ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/doc.md b/docs/python-sdk-docs/julep/managers/doc.md deleted file mode 100644 index d25537089..000000000 --- a/docs/python-sdk-docs/julep/managers/doc.md +++ /dev/null @@ -1,501 +0,0 @@ -# Doc - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Doc - -> Auto-generated documentation for [julep.managers.doc](../../../../../../julep/managers/doc.py) module. - -- [Doc](#doc) - - [AsyncDocsManager](#asyncdocsmanager) - - [BaseDocsManager](#basedocsmanager) - - [DocsCreateArgs](#docscreateargs) - - [DocsManager](#docsmanager) - -## AsyncDocsManager - -[Show source in doc.py:342](../../../../../../julep/managers/doc.py#L342) - -A class for managing asynchronous operations on documents. - -Inherits from BaseDocsManager to provide async document retrieval, creation, and deletion. - -#### Attributes - -Inherited from BaseDocsManager. - -#### Methods - -async list(self, *, agent_id: Optional[Union[str, UUID]] = None, user_id: Optional[Union[str, UUID]] = None, limit: Optional[int] = None, offset: Optional[int] = None) -> List[Doc]: - Asynchronously get a list of documents, with optional filtering based on agent_id, user_id, and pagination options limit and offset. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The agent's identifier to filter documents. -user_id (Optional[Union[str, UUID]]): The user's identifier to filter documents. -- `limit` *Optional[int]* - The maximum number of documents to return. -- `offset` *Optional[int]* - The offset from where to start returning documents. -agent_id (Optional[Union[str, UUID]]): The agent's identifier associated with the document. -user_id (Optional[Union[str, UUID]]): The user's identifier associated with the document. -- `doc` *DocDict* - The document data to be created. -doc_id (Union[str, UUID]): The unique identifier of the document to be deleted. -agent_id (Optional[Union[str, UUID]]): The agent's identifier associated with the document, if applicable. -user_id (Optional[Union[str, UUID]]): The user's identifier associated with the document, if applicable. - -#### Returns - -- `List[Doc]` - A list of documents. - -async create(self, *, agent_id: Optional[Union[str, UUID]] = None, user_id: Optional[Union[str, UUID]] = None, doc: DocDict) -> ResourceCreatedResponse: - Asynchronously create a new document with the given document information, and optional agent_id and user_id. - - `ResourceCreatedResponse` - A response object indicating successful creation of the document. - -async delete(self, *, doc_id: Union[str, UUID], agent_id: Optional[Union[str, UUID]] = None, user_id: Optional[Union[str, UUID]] = None): - Asynchronously delete a document by its id, with optional association to a specific agent_id or user_id. - -#### Notes - -The `@beartype` decorator is being used to perform runtime type checking on the function arguments. - -#### Signature - -```python -class AsyncDocsManager(BaseDocsManager): ... -``` - -#### See also - -- [BaseDocsManager](#basedocsmanager) - -### AsyncDocsManager().create - -[Show source in doc.py:423](../../../../../../julep/managers/doc.py#L423) - -Create a new resource asynchronously. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The ID of the agent. Default is None. -user_id (Optional[Union[str, UUID]]): The ID of the user. Default is None. -- `doc` *DocDict* - A dictionary containing document data. - -#### Returns - -- `ResourceCreatedResponse` - An object representing the response for a resource created. - -#### Raises - -- `BeartypeException` - If any of the input arguments do not match their expected types. This is implicitly raised due to the use of the beartype decorator. - -#### Signature - -```python -@beartype -@rewrap_in_class(Doc) -async def create(self, **kwargs: DocsCreateArgs) -> Doc: ... -``` - -#### See also - -- [DocsCreateArgs](#docscreateargs) - -### AsyncDocsManager().delete - -[Show source in doc.py:443](../../../../../../julep/managers/doc.py#L443) - -Asynchronously deletes a document by its ID. - -This function is a coroutine and must be awaited. - -#### Arguments - -doc_id (Union[str, UUID]): The unique identifier of the document to delete. -agent_id (Optional[Union[str, UUID]]): The unique identifier of the agent, if any. -user_id (Optional[Union[str, UUID]]): The unique identifier of the user, if any. - -#### Returns - -- `Coroutine[Any]` - A coroutine that, when awaited, returns the result of the document deletion process. - -#### Notes - -The `@beartype` decorator is used to enforce type checking on the function arguments. - -#### Signature - -```python -@beartype -async def delete( - self, - doc_id: Union[str, UUID], - agent_id: Optional[Union[str, UUID]] = None, - user_id: Optional[Union[str, UUID]] = None, -): ... -``` - -### AsyncDocsManager().list - -[Show source in doc.py:382](../../../../../../julep/managers/doc.py#L382) - -Asynchronously get a list of documents. - -This function fetches documents based on the provided filtering criteria such as `agent_id`, `user_id`, -and supports pagination through `limit` and `offset`. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The ID of the agent to filter documents by. Default is None. -user_id (Optional[Union[str, UUID]]): The ID of the user to filter documents by. Default is None. -- `limit` *Optional[int]* - The maximum number of documents to return. Default is None. -- `offset` *Optional[int]* - The offset from where to start the document retrieval. Default is None. - -#### Returns - -- `List[Doc]` - A list of document objects. - -#### Notes - -The `@beartype` decorator is used to ensure that arguments conform to the expected types. - -#### Raises - -- `BeartypeDecorHintPepParamException` - If any of the parameters do not adhere to the declared types. - -#### Signature - -```python -@beartype -async def list( - self, - agent_id: Optional[Union[str, UUID]] = None, - user_id: Optional[Union[str, UUID]] = None, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[Doc]: ... -``` - - - -## BaseDocsManager - -[Show source in doc.py:30](../../../../../../julep/managers/doc.py#L30) - -Manages documents for agents or users by providing internal methods to list, create, and delete documents. - -The class utilizes an API client to interact with a back-end service that handles the document management operations. - -Typical usage example: - -docs_manager = BaseDocsManager(api_client) -agent_docs = docs_manager._list(agent_id="some-agent-uuid") -user_docs = docs_manager._list(user_id="some-user-uuid") -created_doc = docs_manager._create(agent_id="some-agent-uuid", doc={"key": "value"}) -docs_manager._delete(user_id="some-user-uuid", doc_id="some-doc-uuid") - -#### Attributes - -- `api_client` - A client instance used to make API calls to the document management system. - -#### Methods - -- `_list(agent_id` - Optional[Union[str, UUID]], user_id: Optional[Union[str, UUID]], - - `limit` - Optional[int]=None, offset: Optional[int]=None) -> Union[GetAgentDocsResponse, Awaitable[GetAgentDocsResponse]] - Retrieves docsrmation for either an agent or user. - Must provide exactly one valid UUID v4 for either `agent_id` or `user_id`. - -- `_create(agent_id` - Optional[Union[str, UUID]], user_id: Optional[Union[str, UUID]], doc: DocDict) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]] - Creates docsrmation for either an agent or user. - Must provide exactly one valid UUID v4 for either `agent_id` or `user_id`. - The `doc` parameter contains the document information to be created. - -- `_delete(agent_id` - Optional[Union[str, UUID]], user_id: Optional[Union[str, UUID]], doc_id: Union[str, UUID]): - Deletes docsrmation for either an agent or user. - Must provide exactly one valid UUID v4 for either `agent_id` or `user_id`, and a valid UUID for `doc_id`. - -#### Signature - -```python -class BaseDocsManager(BaseManager): ... -``` - -### BaseDocsManager()._create - -[Show source in doc.py:115](../../../../../../julep/managers/doc.py#L115) - -Create a new resource with docsrmation for either an agent or a user, but not both. - -This function asserts that exactly one of `agent_id` or `user_id` is provided and is a valid UUID v4. -It then creates the appropriate docsrmation based on which ID was provided. - -Args: - agent_id (Optional[Union[str, UUID]]): The UUID of the agent or None. - user_id (Optional[Union[str, UUID]]): The UUID of the user or None. - doc (DocDict): A dictionary containing the document data for the resource being created. - metadata (Dict[str, Any]): Optional metadata for the document. Defaults to an empty dictionary. - -Returns: - Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: The response after creating the resource, which could be immediate or an awaitable for asynchronous execution. - -Raises: - AssertionError: If both `agent_id` and `user_id` are provided, neither are provided, or if the provided IDs are not valid UUID v4 strings. - -Note: - One and only one of `agent_id` or `user_id` must be provided and must be a valid UUID v4. - The `DocDict` type should be a dictionary compatible with the `CreateDoc` schema. - -#### Signature - -```python -def _create( - self, - doc: DocDict, - agent_id: Optional[Union[str, UUID]] = None, - user_id: Optional[Union[str, UUID]] = None, - metadata: Dict[str, Any] = {}, -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - -### BaseDocsManager()._delete - -[Show source in doc.py:164](../../../../../../julep/managers/doc.py#L164) - -Delete docs based on either an agent_id or a user_id. - -This method selects the appropriate deletion operation (agent or user) based on whether an `agent_id` or `user_id` is provided. Only one of these ID types should be valid and provided. - -Args: - agent_id (Optional[Union[str, UUID]]): A unique identifier of an agent. Either a string or UUID v4, but not both `agent_id` and `user_id`. - user_id (Optional[Union[str, UUID]]): A unique identifier of a user. Either a string or UUID v4, but not both `agent_id` and `user_id`. - doc_id (Union[str, UUID]): A unique identifier for docsrmation to be deleted, as a string or UUID v4. - -Returns: - The result of the API deletion request. This can be the response object from the client's delete operation. - -Raises: - AssertionError: If both `agent_id` and `user_id` are provided, neither are provided, or if the provided IDs are not valid UUID v4 strings. - Other exceptions related to the `api_client` operations could potentially be raised and depend on its implementation. - -#### Signature - -```python -def _delete( - self, - agent_id: Optional[Union[str, UUID]], - user_id: Optional[Union[str, UUID]], - doc_id: Union[str, UUID], -) -> Union[ResourceDeletedResponse, Awaitable[ResourceDeletedResponse]]: ... -``` - -### BaseDocsManager()._list - -[Show source in doc.py:63](../../../../../../julep/managers/doc.py#L63) - -Retrieve docsrmation for an agent or user based on their ID. - -This internal method fetches docsrmation for either an agent or a user, -but not both. If both or neither `agent_id` and `user_id` are provided, it will -assert an error. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The UUID v4 of the agent for whom docs is requested, exclusive with `user_id`. -user_id (Optional[Union[str, UUID]]): The UUID v4 of the user for whom docs is requested, exclusive with `agent_id`. -- `limit` *Optional[int]* - The maximum number of records to return. Defaults to None. -- `offset` *Optional[int]* - The number of records to skip before starting to collect the response set. Defaults to None. -metadata_filter (Dict[str, Any]): A dictionary used for filtering documents based on metadata criteria. Defaults to an empty dictionary. - -#### Returns - -- `Union[GetAgentDocsResponse,` *Awaitable[GetAgentDocsResponse]]* - The response object containing docsrmation about the agent or user, or a promise of such an object if the call is asynchronous. - -#### Raises - -- `AssertionError` - If both `agent_id` and `user_id` are provided or neither is provided, or if the provided IDs are not valid UUID v4. - -#### Signature - -```python -def _list( - self, - agent_id: Optional[Union[str, UUID]], - user_id: Optional[Union[str, UUID]], - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> Union[GetAgentDocsResponse, Awaitable[GetAgentDocsResponse]]: ... -``` - - - -## DocsCreateArgs - -[Show source in doc.py:23](../../../../../../julep/managers/doc.py#L23) - -#### Signature - -```python -class DocsCreateArgs(TypedDict): ... -``` - - - -## DocsManager - -[Show source in doc.py:208](../../../../../../julep/managers/doc.py#L208) - -A class responsible for managing documents. - -This class provides methods for retrieving, creating, and deleting documents. It uses a base document management system to perform operations. - -#### Attributes - -None specific to this class, as all are inherited from BaseDocsManager. - -#### Methods - -get: - Retrieves a list of documents according to specified filters. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The agent's identifier to filter documents by, if any. -user_id (Optional[Union[str, UUID]]): The user's identifier to filter documents by, if any. -- `limit` *Optional[int]* - The maximum number of documents to be retrieved. -- `offset` *Optional[int]* - The number of documents to skip before starting to collect the document output list. - -agent_id (Optional[Union[str, UUID]]): The agent's identifier associated with the document, if any. -user_id (Optional[Union[str, UUID]]): The user's identifier associated with the document, if any. -- `doc` *DocDict* - The document to be created represented as a dictionary of document metadata. - -doc_id (Union[str, UUID]): The identifier of the document to be deleted. -agent_id (Optional[Union[str, UUID]]): The agent's identifier associated with the document, if any. -user_id (Optional[Union[str, UUID]]): The user's identifier associated with the document, if any. - -#### Returns - -- `List[Doc]` - A list of documents matching the provided filters. - -create: - Creates a new document. - -- `ResourceCreatedResponse` - An object representing the creation response, typically containing the ID of the created document. - -delete: - Deletes a document by its document identifier. - -None, but the method may raise exceptions on failure. - -#### Signature - -```python -class DocsManager(BaseDocsManager): ... -``` - -#### See also - -- [BaseDocsManager](#basedocsmanager) - -### DocsManager().create - -[Show source in doc.py:288](../../../../../../julep/managers/doc.py#L288) - -Create a new resource with the specified document. - -This method wraps a call to an internal '_create' method, passing along any -specified agent or user identifiers, along with the document data. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The agent identifier associated with the resource creation. -user_id (Optional[Union[str, UUID]]): The user identifier associated with the resource creation. -- `doc` *DocDict* - A dictionary containing the document data. - -#### Returns - -- `ResourceCreatedResponse` - An object representing the response for the resource creation operation. - -#### Raises - -- `BeartypeException` - If any input parameters are of incorrect type, due to type enforcement by the @beartype decorator. - -#### Signature - -```python -@beartype -@rewrap_in_class(Doc) -def create(self, **kwargs: DocsCreateArgs) -> Doc: ... -``` - -#### See also - -- [DocsCreateArgs](#docscreateargs) - -### DocsManager().delete - -[Show source in doc.py:311](../../../../../../julep/managers/doc.py#L311) - -Deletes a document by its identifier. - -This function wraps the internal _delete method, providing an interface to delete documents by their ID while optionally specifying the agent ID and user ID. - -#### Arguments - -doc_id (Union[str, UUID]): The unique identifier of the document to be deleted. -agent_id (Optional[Union[str, UUID]]): The unique identifier of the agent performing the delete operation, if any. -user_id (Optional[Union[str, UUID]]): The unique identifier of the user performing the delete operation, if any. - -#### Returns - -The return type depends on the implementation of the `_delete` method. - -#### Raises - -The exceptions raised depend on the implementation of the `_delete` method. - -#### Signature - -```python -@beartype -def delete( - self, - doc_id: Union[str, UUID], - agent_id: Optional[Union[str, UUID]] = None, - user_id: Optional[Union[str, UUID]] = None, -): ... -``` - -### DocsManager().list - -[Show source in doc.py:253](../../../../../../julep/managers/doc.py#L253) - -Retrieve a list of documents based on specified criteria. - -This method supports filtering the documents by agent_id or user_id, and also supports pagination through the limit and offset parameters. - -#### Arguments - -agent_id (Optional[Union[str, UUID]]): The unique identifier for the agent. Can be a string or a UUID object. Default is None, which means no filtering by agent_id is applied. -user_id (Optional[Union[str, UUID]]): The unique identifier for the user. Can be a string or a UUID object. Default is None, which means no filtering by user_id is applied. -- `limit` *Optional[int]* - The maximum number of documents to retrieve. Default is None, which means no limit is applied. -- `offset` *Optional[int]* - The number of documents to skip before starting to collect the document list. Default is None, which means no offset is applied. - -#### Returns - -- `List[Doc]` - A list of documents that match the provided criteria. - -#### Notes - -The `@beartype` decorator is used to ensure that the input arguments are of the expected types. If an argument is passed that does not match the expected type, a type error will be raised. - -#### Signature - -```python -@beartype -def list( - self, - agent_id: Optional[Union[str, UUID]] = None, - user_id: Optional[Union[str, UUID]] = None, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[Doc]: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/index.md b/docs/python-sdk-docs/julep/managers/index.md deleted file mode 100644 index 94775758f..000000000 --- a/docs/python-sdk-docs/julep/managers/index.md +++ /dev/null @@ -1,20 +0,0 @@ -# Managers - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / Managers - -> Auto-generated documentation for [julep.managers](../../../../../../julep/managers/__init__.py) module. - -- [Managers](#managers) - - [Modules](#modules) - -## Modules - -- [Agent](./agent.md) -- [Base](./base.md) -- [Doc](./doc.md) -- [Memory](./memory.md) -- [Session](./session.md) -- [Task](./task.md) -- [Tool](./tool.md) -- [Types](./types.md) -- [User](./user.md) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/memory.md b/docs/python-sdk-docs/julep/managers/memory.md deleted file mode 100644 index 11b7d9dc8..000000000 --- a/docs/python-sdk-docs/julep/managers/memory.md +++ /dev/null @@ -1,219 +0,0 @@ -# Memory - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Memory - -> Auto-generated documentation for [julep.managers.memory](../../../../../../julep/managers/memory.py) module. - -- [Memory](#memory) - - [AsyncMemoriesManager](#asyncmemoriesmanager) - - [BaseMemoriesManager](#basememoriesmanager) - - [MemoriesManager](#memoriesmanager) - -## AsyncMemoriesManager - -[Show source in memory.py:134](../../../../../../julep/managers/memory.py#L134) - -Asynchronously lists memories based on various filter parameters. - -Args: - agent_id (Union[str, UUID]): The unique identifier of the agent. - query (str): The search query string to filter memories. - types (Optional[Union[str, List[str]]], optional): The types of memories to filter by. Defaults to None. - user_id (Optional[str], optional): The unique identifier of the user. Defaults to None. - limit (Optional[int], optional): The maximum number of memories to return. Defaults to None. - offset (Optional[int], optional): The number of memories to skip before starting to collect the result set. Defaults to None. - -Returns: - List[Memory]: A list of Memory objects that match the given filters. - -Raises: - ValidationError: If the input validation fails. - DatabaseError: If there is a problem accessing the database. - -#### Signature - -```python -class AsyncMemoriesManager(BaseMemoriesManager): ... -``` - -#### See also - -- [BaseMemoriesManager](#basememoriesmanager) - -### AsyncMemoriesManager().list - -[Show source in memory.py:154](../../../../../../julep/managers/memory.py#L154) - -Asynchronously list memories based on query parameters. - -#### Arguments - -agent_id (Union[str, UUID]): The ID of the agent to list memories for. -- `query` *str* - The query string to filter memories. -types (Optional[Union[str, List[str]]], optional): The types of memories to retrieve. Defaults to None. -- `user_id` *Optional[str], optional* - The ID of the user to list memories for. Defaults to None. -- `limit` *Optional[int], optional* - The maximum number of memories to return. Defaults to None. -- `offset` *Optional[int], optional* - The offset to start listing memories from. Defaults to None. - -#### Returns - -- `List[Memory]` - A list of Memory objects that match the query. - -#### Notes - -`@beartype` decorator is used for runtime type checking. - -#### Signature - -```python -@beartype -async def list( - self, - agent_id: Union[str, UUID], - query: str, - types: Optional[Union[str, List[str]]] = None, - user_id: Optional[str] = None, - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[Memory]: ... -``` - - - -## BaseMemoriesManager - -[Show source in memory.py:16](../../../../../../julep/managers/memory.py#L16) - -A base manager class for handling agent memories. - -This manager provides an interface to interact with agent memories, facilitating -operations such as listing and retrieving memories based on various criteria. - -Methods: - _list(agent_id, query, types=None, user_id=None, limit=None, offset=None): - Retrieves a list of memories for a given agent. - -Args: - agent_id (str): A valid UUID v4 string identifying the agent. - query (str): The query string to search memories. - types (Optional[Union[str, List[str]]]): The type(s) of memories to retrieve. - user_id (Optional[str]): The user identifier associated with the memories. - limit (Optional[int]): The maximum number of memories to retrieve. - offset (Optional[int]): The number of initial memories to skip in the result set. - -Returns: - Union[GetAgentMemoriesResponse, Awaitable[GetAgentMemoriesResponse]]: - A synchronous or asynchronous response object containing the list of agent memories. - -Raises: - AssertionError: If `agent_id` is not a valid UUID v4. - -#### Signature - -```python -class BaseMemoriesManager(BaseManager): ... -``` - -### BaseMemoriesManager()._list - -[Show source in memory.py:43](../../../../../../julep/managers/memory.py#L43) - -List memories from a given agent based on a query and further filtering options. - -#### Arguments - -- `agent_id` *str* - A valid UUID v4 representing the agent ID. -- `query` *str* - Query string to filter memories. -types (Optional[Union[str, List[str]]], optional): The types of memories to filter. -- `user_id` *Optional[str], optional* - The user ID to filter memories. -- `limit` *Optional[int], optional* - The maximum number of memories to return. -- `offset` *Optional[int], optional* - The number of memories to skip before starting to collect the result set. - -#### Returns - -- `Union[GetAgentMemoriesResponse,` *Awaitable[GetAgentMemoriesResponse]]* - Returns a synchronous or asynchronous response with the agent memories. - -#### Raises - -- `AssertionError` - If `agent_id` is not a valid UUID v4. - -#### Signature - -```python -def _list( - self, - agent_id: str, - query: str, - types: Optional[Union[str, List[str]]] = None, - user_id: Optional[str] = None, - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> Union[GetAgentMemoriesResponse, Awaitable[GetAgentMemoriesResponse]]: ... -``` - - - -## MemoriesManager - -[Show source in memory.py:80](../../../../../../julep/managers/memory.py#L80) - -A class for managing memory entities associated with agents. - -Inherits from [BaseMemoriesManager](#basememoriesmanager) and extends its functionality to specifically -manage and retrieve memory entities for agents based on query parameters. - -Attributes: - Inherited from [BaseMemoriesManager](#basememoriesmanager). - -Methods: - list: Retrieves a list of memory entities based on query parameters. - -#### Signature - -```python -class MemoriesManager(BaseMemoriesManager): ... -``` - -#### See also - -- [BaseMemoriesManager](#basememoriesmanager) - -### MemoriesManager().list - -[Show source in memory.py:94](../../../../../../julep/managers/memory.py#L94) - -List memories meeting specified criteria. - -This function fetches a list of Memory objects based on various filters and parameters such as agent_id, query, types, user_id, limit, and offset. - -#### Arguments - -agent_id (Union[str, UUID]): The unique identifier for the agent. -- `query` *str* - The search term used to filter memories. -types (Optional[Union[str, List[str]]], optional): The types of memories to retrieve. Can be a single type as a string or a list of types. Default is None, which does not filter by type. -- `user_id` *Optional[str], optional* - The unique identifier for the user. If provided, only memories associated with this user will be retrieved. Default is None. -- `limit` *Optional[int], optional* - The maximum number of memories to return. Default is None, which means no limit. -- `offset` *Optional[int], optional* - The number of memories to skip before starting to return the results. Default is None. - -#### Returns - -- `List[Memory]` - A list of Memory objects that match the given criteria. - -#### Notes - -The `@beartype` decorator is used to ensure that arguments conform to the expected types at runtime. - -#### Signature - -```python -@beartype -def list( - self, - agent_id: Union[str, UUID], - query: str, - types: Optional[Union[str, List[str]]] = None, - user_id: Optional[str] = None, - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[Memory]: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/session.md b/docs/python-sdk-docs/julep/managers/session.md deleted file mode 100644 index 96a40a6de..000000000 --- a/docs/python-sdk-docs/julep/managers/session.md +++ /dev/null @@ -1,1226 +0,0 @@ -# Session - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Session - -> Auto-generated documentation for [julep.managers.session](../../../../../../julep/managers/session.py) module. - -- [Session](#session) - - [AsyncSessionsManager](#asyncsessionsmanager) - - [BaseSessionsManager](#basesessionsmanager) - - [SessionCreateArgs](#sessioncreateargs) - - [SessionUpdateArgs](#sessionupdateargs) - - [SessionsManager](#sessionsmanager) - -## AsyncSessionsManager - -[Show source in session.py:800](../../../../../../julep/managers/session.py#L800) - -A class for managing asynchronous sessions. - -This class handles operations related to creating, retrieving, updating, -deleting, and interacting with sessions asynchronously. It extends the -functionality of BaseSessionsManager with asynchronous behavior. - -#### Attributes - -Inherits attributes from the BaseSessionsManager class. - -#### Methods - -- `async` *get(id* - Union[UUID, str]) -> Session: - Retrieves a session by its ID. - -async create(*, user_id: Union[str, UUID], agent_id: Union[str, UUID], situation: Optional[str]=None) -> ResourceCreatedResponse: - Creates a new session with the specified user and agent IDs, and an optional situation. - -async list(*, limit: Optional[int]=None, offset: Optional[int]=None) -> List[Session]: - Lists sessions with an optional limit and offset for pagination. - -- `async` *delete(session_id* - Union[str, UUID]): - Deletes a session by its ID. - -async update(*, session_id: Union[str, UUID], situation: str) -> ResourceUpdatedResponse: - Updates the situation for a session by its ID. - -async chat(*, session_id: str, messages: List[InputChatMlMessage], tools: Optional[List[Tool]]=None, tool_choice: Optional[ToolChoiceOption]=None, frequency_penalty: Optional[float]=None, length_penalty: Optional[float]=None, logit_bias: Optional[Dict[str, Optional[int]]]=None, max_tokens: Optional[int]=None, presence_penalty: Optional[float]=None, repetition_penalty: Optional[float]=None, response_format: Optional[ChatSettingsResponseFormat]=None, seed: Optional[int]=None, stop: Optional[ChatSettingsStop]=None, stream: Optional[bool]=None, temperature: Optional[float]=None, top_p: Optional[float]=None, recall: Optional[bool]=None, remember: Optional[bool]=None) -> ChatResponse: - Initiates a chat session with given messages and optional parameters for the chat behavior and output. - -async suggestions(*, session_id: Union[str, UUID], limit: Optional[int]=None, offset: Optional[int]=None) -> List[Suggestion]: - Retrieves suggestions related to a session optionally limited and paginated. - -async history(*, session_id: Union[str, UUID], limit: Optional[int]=None, offset: Optional[int]=None) -> List[ChatMlMessage]: - Retrieves the history of messages in a session, optionally limited and paginated. - -- `async` *delete_history(session_id* - Union[str, UUID]) -> None: - -#### Notes - -The `@beartype` decorator is used for runtime type checking of the arguments. - -Additional methods may be provided by the BaseSessionsManager. - -#### Signature - -```python -class AsyncSessionsManager(BaseSessionsManager): ... -``` - -#### See also - -- [BaseSessionsManager](#basesessionsmanager) - -### AsyncSessionsManager().chat - -[Show source in session.py:975](../../../../../../julep/managers/session.py#L975) - -Sends a message in an asynchronous chat session and retrieves the response. - -This method leverages the messaging interface with various options to adjust the behavior of the chat bot. - -#### Arguments - -- `session_id` *str* - The unique identifier for the chat session. -- `messages` *List[InputChatMlMessage]* - A list of chat messages in the session's context. -- `tools` *Optional[List[Tool]]* - A list of tools, if provided, to enhance the chat capabilities. -- `tool_choice` *Optional[ToolChoiceOption]* - A preference for tool selection during the chat. -- `frequency_penalty` *Optional[float]* - Adjusts how much the model should avoid repeating the same line of thought. -- `length_penalty` *Optional[float]* - Penalizes longer responses. -logit_bias (Optional[Dict[str, Optional[int]]]): Biases the model's prediction towards or away from certain tokens. -- `max_tokens` *Optional[int]* - The maximum length of the generated response. -- `presence_penalty` *Optional[float]* - Adjusts how much the model should consider new concepts. -- `repetition_penalty` *Optional[float]* - Adjusts how much the model should avoid repeating previous input. -- `response_format` *Optional[ChatSettingsResponseFormat]* - The desired format for the response. -- `seed` *Optional[int]* - A seed used to initialize the model's random number generator. -- `stop` *Optional[ChatSettingsStop]* - Tokens that signify the end of the response. -- `stream` *Optional[bool]* - Whether or not to stream the responses. -- `temperature` *Optional[float]* - Controls randomness in the response generation. -- `top_p` *Optional[float]* - Controls diversity via nucleus sampling. -- `recall` *Optional[bool]* - If true, the model recalls previous messages within the same session. -- `remember` *Optional[bool]* - If true, the model incorporates the context from the previous conversations in the session. - -#### Returns - -- `ChatResponse` - The response from the chat bot, encapsulating the result of the chat action. - -#### Notes - -This function is decorated with `@beartype`, which enforces type annotations at runtime. - -#### Examples - -```python ->>> response = await chat(...) ->>> print(response) -``` - -#### Signature - -```python -@beartype -async def chat( - self, - session_id: str, - messages: List[Union[InputChatMlMessageDict, InputChatMlMessage]], - tools: Optional[List[Union[ToolDict, Tool]]] = None, - tool_choice: Optional[ToolChoiceOption] = None, - frequency_penalty: Optional[float] = None, - length_penalty: Optional[float] = None, - logit_bias: Optional[Dict[str, Optional[int]]] = None, - max_tokens: Optional[int] = None, - presence_penalty: Optional[float] = None, - repetition_penalty: Optional[float] = None, - response_format: Optional[ - Union[ChatSettingsResponseFormatDict, ChatSettingsResponseFormat] - ] = None, - seed: Optional[int] = None, - stop: Optional[ChatSettingsStop] = None, - stream: Optional[bool] = None, - temperature: Optional[float] = None, - top_p: Optional[float] = None, - recall: Optional[bool] = None, - remember: Optional[bool] = None, -) -> ChatResponse: ... -``` - -### AsyncSessionsManager().create - -[Show source in session.py:872](../../../../../../julep/managers/session.py#L872) - -Asynchronously create a resource with the specified user and agent identifiers. - -This function wraps an internal _create method and is decorated with `beartype` for run-time type checking. - -#### Arguments - -user_id (Union[str, UUID]): Unique identifier for the user. -agent_id (Union[str, UUID]): Unique identifier for the agent. -- `situation` *Optional[str], optional* - Description of the situation, defaults to None. - -#### Returns - -- `Session` - The created Session object - -#### Raises - -- `BeartypeException` - If any of the input arguments do not match their expected types. -Any exception raised by the internal _create method. - -#### Signature - -```python -@beartype -@rewrap_in_class(Session) -async def create(self, **kwargs: SessionCreateArgs) -> Session: ... -``` - -#### See also - -- [SessionCreateArgs](#sessioncreateargs) - -### AsyncSessionsManager().delete - -[Show source in session.py:925](../../../../../../julep/managers/session.py#L925) - -Asynchronously delete a session given its ID. - -#### Arguments - -session_id (Union[str, UUID]): The unique identifier for the session, which can - be either a string or a UUID. - -#### Returns - -Coroutine[Any, Any, Any]: A coroutine that, when awaited, completes the deletion process. - -#### Raises - -The decorators or the body of the '_delete' method may define specific exceptions that -could be raised during the execution. Generally, include any exceptions that are raised -by the '_delete' method or by the 'beartype' decorator in this section. - -#### Signature - -```python -@beartype -async def delete(self, session_id: Union[str, UUID]): ... -``` - -### AsyncSessionsManager().delete_history - -[Show source in session.py:1120](../../../../../../julep/managers/session.py#L1120) - -Delete the history of a session asynchronously. - -#### Arguments - -session_id (Union[str, UUID]): The unique identifier for the session. - -#### Returns - -- `None` - The result of the delete operation. - -#### Raises - -- `AssertionError` - If the `session_id` is not a valid UUID v4. - -#### Signature - -```python -@beartype -async def delete_history(self, session_id: Union[str, UUID]) -> None: ... -``` - -### AsyncSessionsManager().get - -[Show source in session.py:844](../../../../../../julep/managers/session.py#L844) - -Asynchronously get a Session object by its identifier. - -This method retrieves a Session based on the provided `id`. It uses an underlying -asynchronous '_get' method to perform the operation. - -#### Arguments - -id (Union[UUID, str]): The unique identifier of the Session to retrieve. It can be - either a string representation or a UUID object. - -#### Returns - -- `Session` - The retrieved Session object associated with the given id. - -#### Raises - -- `TypeError` - If the `id` is not of type UUID or str. -- `ValueError` - If the `id` is not a valid UUID or an invalid string is provided. -- `AnyExceptionRaisedBy_get` - Descriptive name of specific exceptions that '_get' - might raise, if any. Replace this with the actual exceptions. - -#### Notes - -The `@beartype` decorator is being used to enforce type checking at runtime. -This ensures that the argument `id` is of the correct type (UUID or str) and -that the return value is a Session object. - -#### Signature - -```python -@beartype -async def get(self, id: Union[UUID, str]) -> Session: ... -``` - -### AsyncSessionsManager().history - -[Show source in session.py:1088](../../../../../../julep/managers/session.py#L1088) - -Retrieve a history of chat messages based on the session ID, with optional limit and offset. - -This function is decorated with 'beartype' for runtime type checking. - -#### Arguments - -session_id (Union[str, UUID]): The unique identifier for the chat session. -- `limit` *Optional[int], optional* - The maximum number of chat messages to return. Defaults to None. -- `offset` *Optional[int], optional* - The number of chat messages to skip before starting to collect the history slice. Defaults to None. - -#### Returns - -- `List[ChatMlMessage]` - A list of chat messages from the history that match the criteria. - -#### Raises - -Any exceptions that may be raised by the underlying '_history' method or 'beartype' decorator. - -#### Signature - -```python -@beartype -async def history( - self, - session_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[ChatMlMessage]: ... -``` - -### AsyncSessionsManager().list - -[Show source in session.py:895](../../../../../../julep/managers/session.py#L895) - -Asynchronously retrieves a list of sessions with optional pagination. - -This method utilizes `_list_items` internally to obtain session data with support for limit and offset parameters. The `beartype` decorator is used to ensure that the function parameters match the expected types. - -#### Arguments - -- `limit` *Optional[int], optional* - The maximum number of sessions to retrieve. Default is None, which retrieves all available sessions. -- `offset` *Optional[int], optional* - The number to skip before starting to collect the response set. Default is None. - -#### Returns - -- `List[Session]` - A list of `Session` objects containing session data. - -#### Signature - -```python -@beartype -async def list( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[Session]: ... -``` - -### AsyncSessionsManager().suggestions - -[Show source in session.py:1056](../../../../../../julep/managers/session.py#L1056) - -Retrieve a list of suggestions asynchronously. - -This function asynchronously fetches suggestions based on the provided session ID, with optional limit and offset parameters for pagination. - -#### Arguments - -session_id (Union[str, UUID]): The session identifier for which suggestions are to be retrieved. -- `limit` *Optional[int]* - The maximum number of suggestions to return. Defaults to None, which means no limit. -- `offset` *Optional[int]* - The number of suggestions to skip before starting to return results. Defaults to None, which means no offset. - -#### Returns - -- `List[Suggestion]` - A list of Suggestion objects. - -#### Raises - -- `Exception` - Raises an exception if the underlying _suggestions call fails. - -#### Signature - -```python -@beartype -async def suggestions( - self, - session_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[Suggestion]: ... -``` - -### AsyncSessionsManager().update - -[Show source in session.py:944](../../../../../../julep/managers/session.py#L944) - -Asynchronously update a resource with the given situation. - -This method wraps the private `_update` method which performs the actual update -operation asynchronously. - -#### Arguments - -session_id (Union[str, UUID]): The session ID of the resource to update. - It can be either a `str` or a `UUID` object. -- `situation` *str* - Description of the situation to update the resource with. - -#### Returns - -- `Session` - The updated Session object - -#### Notes - -This function is decorated with `@beartype`, which will perform runtime type -checking on the arguments. - -#### Raises - -- `BeartypeCallHintParamViolation` - If the `session_id` or `situation` - arguments do not match their annotated types. - -#### Signature - -```python -@beartype -@rewrap_in_class(Session) -async def update(self, **kwargs: SessionUpdateArgs) -> Session: ... -``` - -#### See also - -- [SessionUpdateArgs](#sessionupdateargs) - - - -## BaseSessionsManager - -[Show source in session.py:57](../../../../../../julep/managers/session.py#L57) - -A class to manage sessions using base API client methods. - -This manager handles CRUD operations and additional actions on the session data, -such as chatting and retrieving history or suggestions. - -#### Attributes - -- `api_client` - The client used for communicating with an API. - -#### Methods - -_get(id): - Retrieve a specific session by its identifier. - -#### Arguments - -id (Union[str, UUID]): The unique identifier for the session. - -agent_id (Union[str, UUID]): The unique identifier for the agent. -user_id (Optional[Union[str, UUID]]): The unique identifier for the user. -- `situation` *Optional[str]* - An optional description of the situation for the session. - -- `limit` *Optional[int]* - The limit on the number of items to be retrieved. -- `offset` *Optional[int]* - The number of items to be skipped before starting to collect the result set. - -session_id (Union[str, UUID]): The unique identifier for the session to be deleted. - -session_id (Union[str, UUID]): The unique identifier for the session to be updated. -- `situation` *str* - The new situation description for the session. - -- `session_id` *str* - The unique identifier for the session. -- `messages` *List[InputChatMlMessage]* - The list of input chat messages to be sent. -- `tools` *Optional[List[Tool]]* - ... -- `tool_choice` *Optional[ToolChoiceOption]* - ... -- `...` - Other optional parameters for chat settings and modifiers. - -session_id (Union[str, UUID]): The unique identifier for the session. -- `limit` *Optional[int]* - The limit on the number of suggestions to be retrieved. -- `offset` *Optional[int]* - The number of suggestions to be skipped before starting to collect the result set. - -session_id (Union[str, UUID]): The unique identifier for the session. -- `limit` *Optional[int]* - The limit on the number of history entries to be retrieved. -- `offset` *Optional[int]* - The number of history entries to be skipped before starting to collect the result set. - -session_id (Union[str, UUID]): The unique identifier for the session. - -#### Returns - -- `Union[Session,` *Awaitable[Session]]* - The session object or an awaitable yielding it. - -- `Union[ResourceCreatedResponse,` *Awaitable[ResourceCreatedResponse]]* - The response for the created session or an awaitable yielding it. - -_list_items(limit, offset): - List multiple session items with optional pagination. - -- `Union[ListSessionsResponse,` *Awaitable[ListSessionsResponse]]* - The list of sessions or an awaitable yielding it. - -_delete(session_id): - Delete a session by its identifier. - -- `Union[None,` *Awaitable[None]]* - None or an awaitable yielding None if the operation is successful. - -_update(session_id, situation): - Update the situation for an existing session. - -- `Union[ResourceUpdatedResponse,` *Awaitable[ResourceUpdatedResponse]]* - The response for the updated session or an awaitable yielding it. - -_chat(session_id, messages, ...): - Send chat messages and get responses during a session. - -- `Union[ChatResponse,` *Awaitable[ChatResponse]]* - The chat response for the session or an awaitable yielding it. - -_suggestions(session_id, limit, offset): - Get suggestions for a session. - -- `Union[GetSuggestionsResponse,` *Awaitable[GetSuggestionsResponse]]* - The suggestions response for the session or an awaitable yielding it. - -_history(session_id, limit, offset): - Get the history for a session. - -- `Union[GetHistoryResponse,` *Awaitable[GetHistoryResponse]]* - The history response for the session or an awaitable yielding it. - -_delete_history(session_id): - Delete the history of a session. - -- `Union[None,` *Awaitable[None]]* - None or an awaitable yielding None if the operation is successful. - -#### Raises - -- `ValueError` - If the `id` is not a valid UUID. -- `NetworkError` - If there is an issue communicating with the API. - -_create(user_id, agent_id, situation): - Create a new session with specified user and agent identifiers. - -#### Signature - -```python -class BaseSessionsManager(BaseManager): ... -``` - -### BaseSessionsManager()._chat - -[Show source in session.py:310](../../../../../../julep/managers/session.py#L310) - -Conducts a chat conversation with an AI model using specific parameters. - -#### Arguments - -- `session_id` *str* - A unique identifier for the chat session. -- `messages` *List[InputChatMlMessage]* - A list of input messages for the AI to respond to. -- `tools` *Optional[List[Tool]]* - A list of tools to be used during the chat session. -- `tool_choice` *Optional[ToolChoiceOption]* - A method for choosing which tools to apply. -- `frequency_penalty` *Optional[float]* - A modifier to decrease the likelihood of frequency-based repetitions. -- `length_penalty` *Optional[float]* - A modifier to control the length of the generated responses. -logit_bias (Optional[Dict[str, Optional[int]]]): Adjustments to the likelihood of specific tokens appearing. -- `max_tokens` *Optional[int]* - The maximum number of tokens to generate in the output. -- `presence_penalty` *Optional[float]* - A modifier to control for new concepts' appearance. -- `repetition_penalty` *Optional[float]* - A modifier to discourage repetitive responses. -- `response_format` *Optional[ChatSettingsResponseFormat]* - The format in which the response is to be delivered. -- `seed` *Optional[int]* - An integer to seed the random number generator for reproducibility. -- `stop` *Optional[ChatSettingsStop]* - Tokens at which to stop generating further tokens. -- `stream` *Optional[bool]* - Whether to stream the response or deliver it when it's complete. -- `temperature` *Optional[float]* - A value to control the randomness of the output. -- `top_p` *Optional[float]* - A value to control the nucleus sampling, i.e., the cumulative probability cutoff. -- `recall` *Optional[bool]* - A flag to control the recall capability of the AI model. -- `remember` *Optional[bool]* - A flag to control the persistence of the chat history in the AI's memory. - -#### Returns - -- `Union[ChatResponse,` *Awaitable[ChatResponse]]* - The response from the AI given the input messages and parameters. This could be a synchronous `ChatResponse` object or an asynchronous `Awaitable[ChatResponse]` if the `stream` parameter is True. - -#### Notes - -The precise types of some arguments, like `Tool`, `ToolChoiceOption`, `ChatSettingsResponseFormat`, and `ChatSettingsStop`, are not defined within the given context. It's assumed that these types have been defined elsewhere in the code base. - -#### Raises - -It is not specified what exceptions this function might raise. Typically, one would expect potential exceptions to be associated with the underlying API client's `chat` method failure modes, such as network issues, invalid parameters, etc. - -#### Signature - -```python -def _chat( - self, - session_id: str, - messages: List[Union[InputChatMlMessageDict, InputChatMlMessage]], - tools: Optional[List[Union[ToolDict, Tool]]] = None, - tool_choice: Optional[ToolChoiceOption] = None, - frequency_penalty: Optional[float] = None, - length_penalty: Optional[float] = None, - logit_bias: Optional[Dict[str, Optional[int]]] = None, - max_tokens: Optional[int] = None, - presence_penalty: Optional[float] = None, - repetition_penalty: Optional[float] = None, - response_format: Optional[ - Union[ChatSettingsResponseFormatDict, ChatSettingsResponseFormat] - ] = None, - seed: Optional[int] = None, - stop: Optional[ChatSettingsStop] = None, - stream: Optional[bool] = None, - temperature: Optional[float] = None, - top_p: Optional[float] = None, - recall: Optional[bool] = None, - remember: Optional[bool] = None, -) -> Union[ChatResponse, Awaitable[ChatResponse]]: ... -``` - -### BaseSessionsManager()._create - -[Show source in session.py:182](../../../../../../julep/managers/session.py#L182) - -Creates a session for a specified user and agent. - -This internal method is responsible for creating a session using the API client. It validates that both the user and agent IDs are valid UUID v4 strings before proceeding with session creation. - -#### Arguments - -agent_id (Union[str, UUID]): The agent's identifier which could be a string or a UUID object. -user_id (Optional[Union[str, UUID]]): The user's identifier which could be a string or a UUID object. -- `situation` *Optional[str], optional* - An optional description of the situation. -metadata (Dict[str, Any]) -- `render_templates` *bool, optional* - Whether to render templates in the metadata. Defaults to False. - -#### Returns - -- `Union[ResourceCreatedResponse,` *Awaitable[ResourceCreatedResponse]]* - The response from the API client upon successful session creation, which can be a synchronous `ResourceCreatedResponse` or an asynchronous `Awaitable` of it. - -#### Raises - -- `AssertionError` - If either `user_id` or `agent_id` is not a valid UUID v4. - -#### Signature - -```python -def _create( - self, - agent_id: Union[str, UUID], - user_id: Optional[Union[str, UUID]] = None, - situation: Optional[str] = None, - metadata: Dict[str, Any] = {}, - render_templates: bool = False, - token_budget: Optional[int] = None, - context_overflow: Optional[str] = None, -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - -### BaseSessionsManager()._delete - -[Show source in session.py:251](../../../../../../julep/managers/session.py#L251) - -Delete a session given its session ID. - -This is an internal method that asserts the provided session_id is a valid UUID v4 -before making the delete request through the API client. - -Args: - session_id (Union[str, UUID]): The session identifier, which should be a valid UUID v4. - -Returns: - Union[None, Awaitable[None]]: The result of the delete operation, which can be either - None or an Awaitable that resolves to None, depending on whether this is a synchronous - or asynchronous call. - -Raises: - AssertionError: If the `session_id` is not a valid UUID v4. - -#### Signature - -```python -def _delete(self, session_id: Union[str, UUID]) -> Union[None, Awaitable[None]]: ... -``` - -### BaseSessionsManager()._delete_history - -[Show source in session.py:444](../../../../../../julep/managers/session.py#L444) - -Delete the history of a session. - -#### Arguments - -session_id (Union[str, UUID]): The unique identifier for the session. - -#### Returns - -- `Union[None,` *Awaitable[None]]* - The result of the delete operation, which can be either -None or an Awaitable that resolves to None, depending on whether this is a synchronous -or asynchronous call. - -#### Raises - -- `AssertionError` - If the `session_id` is not a valid UUID v4. - -#### Signature - -```python -def _delete_history( - self, session_id: Union[str, UUID] -) -> Union[None, Awaitable[None]]: ... -``` - -### BaseSessionsManager()._get - -[Show source in session.py:166](../../../../../../julep/managers/session.py#L166) - -Get a session by its ID. - -#### Arguments - -id (Union[str, UUID]): A string or UUID representing the session ID. - -#### Returns - -- `Union[Session,` *Awaitable[Session]]* - The session object associated with the given ID, which can be either a `Session` instance or an `Awaitable` that resolves to a `Session`. - -#### Raises - -- `AssertionError` - If the id is not a valid UUID v4. - -#### Signature - -```python -def _get(self, id: Union[str, UUID]) -> Union[Session, Awaitable[Session]]: ... -``` - -### BaseSessionsManager()._history - -[Show source in session.py:416](../../../../../../julep/managers/session.py#L416) - -Retrieve a session's history with optional pagination controls. - -Args: - session_id (Union[str, UUID]): Unique identifier for the session - whose history is being queried. Can be a string or a UUID object. - limit (Optional[int], optional): The maximum number of history - entries to retrieve. Defaults to None, which uses the API's default setting. - offset (Optional[int], optional): The number of initial history - entries to skip. Defaults to None, which means no offset is applied. - -Returns: - Union[GetHistoryResponse, Awaitable[GetHistoryResponse]]: - The history response object, which may be either synchronous or - asynchronous (awaitable), depending on the API client configuration. - -#### Signature - -```python -def _history( - self, - session_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> Union[GetHistoryResponse, Awaitable[GetHistoryResponse]]: ... -``` - -### BaseSessionsManager()._list_items - -[Show source in session.py:226](../../../../../../julep/managers/session.py#L226) - -List items with optional pagination. - -#### Arguments - -- `limit` *Optional[int]* - The maximum number of items to return. Defaults to None. -- `offset` *Optional[int]* - The number of items to skip before starting to collect the result set. Defaults to None. - -#### Returns - -- `Union[ListSessionsResponse,` *Awaitable[ListSessionsResponse]]* - The response object containing the list of items or an awaitable response object if called asynchronously. - -#### Notes - -The '_list_items' function is assumed to be a method of a class that has an 'api_client' attribute capable of listing sessions. - -#### Signature - -```python -def _list_items( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: str = "{}", -) -> Union[ListSessionsResponse, Awaitable[ListSessionsResponse]]: ... -``` - -### BaseSessionsManager()._suggestions - -[Show source in session.py:393](../../../../../../julep/managers/session.py#L393) - -Retrieve a list of suggestions for a given session. - -Args: - session_id (Union[str, UUID]): The ID of the session for which to get suggestions. - limit (Optional[int], optional): The maximum number of suggestions to retrieve. Defaults to None. - offset (Optional[int], optional): The offset from where to start retrieving suggestions. Defaults to None. - -Returns: - Union[GetSuggestionsResponse, Awaitable[GetSuggestionsResponse]]: The response containing the list of suggestions synchronously or asynchronously, depending on the API client. - -#### Signature - -```python -def _suggestions( - self, - session_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> Union[GetSuggestionsResponse, Awaitable[GetSuggestionsResponse]]: ... -``` - -### BaseSessionsManager()._update - -[Show source in session.py:272](../../../../../../julep/managers/session.py#L272) - -Update a session with a given situation. - -#### Arguments - -session_id (Union[str, UUID]): The session identifier, which can be a string-formatted UUID or an actual UUID object. -- `situation` *str* - A string describing the current situation. -- `overwrite` *bool, optional* - Whether to overwrite the existing situation. Defaults to False. - -#### Returns - -- `Union[ResourceUpdatedResponse,` *Awaitable[ResourceUpdatedResponse]]* - The response from the update operation, which can be either synchronous or asynchronous. - -#### Raises - -- `AssertionError` - If `session_id` is not a valid UUID v4. - -#### Signature - -```python -def _update( - self, - session_id: Union[str, UUID], - situation: Optional[str] = None, - metadata: Optional[Dict[str, Any]] = None, - overwrite: bool = False, - token_budget: Optional[int] = None, - context_overflow: Optional[str] = None, -) -> Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: ... -``` - - - -## SessionCreateArgs - -[Show source in session.py:37](../../../../../../julep/managers/session.py#L37) - -#### Signature - -```python -class SessionCreateArgs(TypedDict): ... -``` - - - -## SessionUpdateArgs - -[Show source in session.py:47](../../../../../../julep/managers/session.py#L47) - -#### Signature - -```python -class SessionUpdateArgs(TypedDict): ... -``` - - - -## SessionsManager - -[Show source in session.py:466](../../../../../../julep/managers/session.py#L466) - -A class responsible for managing session interactions. - -This class extends [BaseSessionsManager](#basesessionsmanager) and provides methods to get, create, -list, delete, and update sessions, as well as to initiate a chat within a session, -request suggestions, and access session history. - -#### Methods - -- `get` *(id* - Union[str, UUID]) -> Session: - Retrieves a session by its identifier. - -create ( - *, - - `user_id` - Union[str, UUID], - - `agent_id` - Union[str, UUID], - - `situation` - Optional[str]=None -) -> ResourceCreatedResponse: - Creates a new session given a user ID and an agent ID, and optionally - a description of the situation. - -list ( - *, - - `limit` - Optional[int]=None, - - `offset` - Optional[int]=None -) -> List[Session]: - Lists sessions with optional pagination via limit and offset. - -- `delete` *(session_id* - Union[str, UUID]): - Deletes a session identified by the given session ID. - -update ( - *, - - `session_id` - Union[str, UUID], - - `situation` - str -) -> ResourceUpdatedResponse: - Updates the situation of a specific session by its ID. - -chat ( - *args - see full method signature for detailed arguments -) -> ChatResponse: - Initiates a chat in the given session with messages and various settings, - including tools, penalties, biases, tokens, response format, etc. - -suggestions ( - *, - - `session_id` - Union[str, UUID], - - `limit` - Optional[int]=None, - - `offset` - Optional[int]=None -) -> List[Suggestion]: - Retrieves a list of suggestions for a given session, supported by - optional pagination parameters. - -history ( - *, - - `session_id` - Union[str, UUID], - - `limit` - Optional[int]=None, - - `offset` - Optional[int]=None -) -> List[ChatMlMessage]: - Retrieves the chat history for a given session, supported by - optional pagination parameters. - -- `delete_history` *(session_id* - Union[str, UUID]) -> None: - -Each method is decorated with `@beartype` for runtime type enforcement. - -#### Signature - -```python -class SessionsManager(BaseSessionsManager): ... -``` - -#### See also - -- [BaseSessionsManager](#basesessionsmanager) - -### SessionsManager().chat - -[Show source in session.py:647](../../../../../../julep/managers/session.py#L647) - -Initiate a chat session with the provided inputs and configurations. - -#### Arguments - -- `session_id` *str* - Unique identifier for the chat session. -- `messages` *List[InputChatMlMessage]* - List of messages to send in the chat session. -- `tools` *Optional[List[Tool]], optional* - List of tools to be used in the session. Defaults to None. -- `tool_choice` *Optional[ToolChoiceOption], optional* - The choice of tool to optimize response for. Defaults to None. -- `frequency_penalty` *Optional[float], optional* - Penalty for frequent tokens to control repetition. Defaults to None. -- `length_penalty` *Optional[float], optional* - Penalty for longer responses to control verbosity. Defaults to None. -logit_bias (Optional[Dict[str, Optional[int]]], optional): Bias for or against specific tokens. Defaults to None. -- `max_tokens` *Optional[int], optional* - Maximum number of tokens to generate in the response. Defaults to None. -- `presence_penalty` *Optional[float], optional* - Penalty for new tokens to control topic introduction. Defaults to None. -- `repetition_penalty` *Optional[float], optional* - Penalty to discourage repetition. Defaults to None. -- `response_format` *Optional[ChatSettingsResponseFormat], optional* - Format of the response. Defaults to None. -- `seed` *Optional[int], optional* - Random seed for deterministic responses. Defaults to None. -- `stop` *Optional[ChatSettingsStop], optional* - Sequence at which to stop generating further tokens. Defaults to None. -- `stream` *Optional[bool], optional* - Whether to stream responses or not. Defaults to None. -- `temperature` *Optional[float], optional* - Sampling temperature for randomness in the response. Defaults to None. -- `top_p` *Optional[float], optional* - Nucleus sampling parameter to control diversity. Defaults to None. -- `recall` *Optional[bool], optional* - Whether to allow recalling previous parts of the chat. Defaults to None. -- `remember` *Optional[bool], optional* - Whether to allow the model to remember previous chats. Defaults to None. - -#### Returns - -- `ChatResponse` - The response object after processing chat messages. - -#### Notes - -The 'beartype' decorator is used for runtime type checking. - -#### Signature - -```python -@beartype -def chat( - self, - session_id: str, - messages: List[Union[InputChatMlMessageDict, InputChatMlMessage]], - tools: Optional[List[Union[ToolDict, Tool]]] = None, - tool_choice: Optional[ToolChoiceOption] = None, - frequency_penalty: Optional[float] = None, - length_penalty: Optional[float] = None, - logit_bias: Optional[Dict[str, Optional[int]]] = None, - max_tokens: Optional[int] = None, - presence_penalty: Optional[float] = None, - repetition_penalty: Optional[float] = None, - response_format: Optional[ - Union[ChatSettingsResponseFormatDict, ChatSettingsResponseFormat] - ] = None, - seed: Optional[int] = None, - stop: Optional[ChatSettingsStop] = None, - stream: Optional[bool] = None, - temperature: Optional[float] = None, - top_p: Optional[float] = None, - recall: Optional[bool] = None, - remember: Optional[bool] = None, -) -> ChatResponse: ... -``` - -### SessionsManager().create - -[Show source in session.py:551](../../../../../../julep/managers/session.py#L551) - -Create a new resource with a user ID and an agent ID, optionally including a situation description. - -#### Arguments - -user_id (Union[str, UUID]): The unique identifier for the user. -agent_id (Union[str, UUID]): The unique identifier for the agent. -- `situation` *Optional[str]* - An optional description of the situation. - -#### Returns - -- `Session` - The created Session object. - -#### Raises - -- `BeartypeException` - If the provided `user_id` or `agent_id` do not match the required type. -Any other exception that `_create` might raise. - -#### Signature - -```python -@beartype -@rewrap_in_class(Session) -def create(self, **kwargs: SessionCreateArgs) -> Session: ... -``` - -#### See also - -- [SessionCreateArgs](#sessioncreateargs) - -### SessionsManager().delete - -[Show source in session.py:603](../../../../../../julep/managers/session.py#L603) - -Deletes a session based on its session ID. - -#### Arguments - -session_id (Union[str, UUID]): The session ID to be deleted, which can be a string or a UUID object. - -#### Returns - -The result from the internal `_delete` method call. - -#### Raises - -The specific exceptions that `self._delete` might raise, which should be documented in its docstring. - -#### Signature - -```python -@beartype -def delete(self, session_id: Union[str, UUID]): ... -``` - -### SessionsManager().delete_history - -[Show source in session.py:783](../../../../../../julep/managers/session.py#L783) - -Delete the history of a session. - -#### Arguments - -session_id (Union[str, UUID]): The unique identifier for the session. - -#### Returns - -- `None` - The result of the delete operation. - -#### Raises - -- `AssertionError` - If the `session_id` is not a valid UUID v4. - -#### Signature - -```python -@beartype -def delete_history(self, session_id: Union[str, UUID]) -> None: ... -``` - -### SessionsManager().get - -[Show source in session.py:534](../../../../../../julep/managers/session.py#L534) - -Retrieve a Session object based on a given identifier. - -Args: - id (Union[str, UUID]): The identifier of the session, which can be either a string or a UUID. - -Returns: - Session: The session object associated with the given id. - -Raises: - TypeError: If the id is neither a string nor a UUID. - KeyError: If the session with the given id does not exist. - -#### Signature - -```python -@beartype -def get(self, id: Union[str, UUID]) -> Session: ... -``` - -### SessionsManager().history - -[Show source in session.py:756](../../../../../../julep/managers/session.py#L756) - -Retrieve a history of ChatMl messages for a given session. - -This method uses the private method `_history` to fetch the message history and returns a list of ChatMlMessage objects. - -Args: - session_id (Union[str, UUID]): The session identifier to fetch the chat history for. - limit (Optional[int], optional): The maximum number of messages to return. If None, no limit is applied. Defaults to None. - offset (Optional[int], optional): The offset from where to start fetching messages. If None, no offset is applied. Defaults to None. - -Returns: - List[ChatMlMessage]: A list of ChatMlMessage objects representing the history of messages for the session. - -#### Signature - -```python -@beartype -def history( - self, - session_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[ChatMlMessage]: ... -``` - -### SessionsManager().list - -[Show source in session.py:572](../../../../../../julep/managers/session.py#L572) - -Retrieve a list of Session objects with optional pagination. - -Args: - limit (Optional[int]): The maximum number of Session objects to return. - Defaults to None, which indicates no limit. - offset (Optional[int]): The number of items to skip before starting to return the results. - Defaults to None, which indicates no offset. - -Returns: - List[Session]: A list of Session objects meeting the criteria. - -Raises: - BeartypeException: If the input arguments do not match their annotated types. - -#### Signature - -```python -@beartype -def list( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[Session]: ... -``` - -### SessionsManager().suggestions - -[Show source in session.py:722](../../../../../../julep/managers/session.py#L722) - -Provides a list of suggestion objects based on the given session ID. - -This method retrieves suggestions and is decorated with `beartype` for runtime type -checking of the passed arguments. - -#### Arguments - -session_id (Union[str, UUID]): The ID of the session to retrieve suggestions for. -- `limit` *Optional[int], optional* - The maximum number of suggestions to return. - Defaults to None, which means no limit. -- `offset` *Optional[int], optional* - The number to offset the list of returned - suggestions by. Defaults to None, which means no offset. - -#### Returns - -- `List[Suggestion]` - A list of suggestion objects. - -#### Raises - -Any exceptions that `_suggestions` might raise, for example, if the method is unable -to retrieve suggestions based on the provided session ID. - -#### Signature - -```python -@beartype -def suggestions( - self, - session_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[Suggestion]: ... -``` - -### SessionsManager().update - -[Show source in session.py:619](../../../../../../julep/managers/session.py#L619) - -Updates the state of a resource based on a given situation. - -This function is type-checked using beartype to ensure that the `session_id` parameter -is either a string or a UUID and that the `situation` parameter is a string. It delegates -the actual update process to an internal method '_update'. - -#### Arguments - -session_id (Union[str, UUID]): The session identifier, which can be a UUID or a - string that uniquely identifies the session. -- `situation` *str* - A string that represents the new situation for the resource update. -- `overwrite` *bool, optional* - A flag to indicate whether to overwrite the existing - -#### Returns - -- `Session` - The updated Session object. - -#### Notes - -The `@beartype` decorator is used for runtime type checking of the function arguments. - -#### Signature - -```python -@beartype -@rewrap_in_class(Session) -def update(self, **kwargs: SessionUpdateArgs) -> Session: ... -``` - -#### See also - -- [SessionUpdateArgs](#sessionupdateargs) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/task.md b/docs/python-sdk-docs/julep/managers/task.md deleted file mode 100644 index e295f2d5f..000000000 --- a/docs/python-sdk-docs/julep/managers/task.md +++ /dev/null @@ -1,608 +0,0 @@ -# Task - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Task - -> Auto-generated documentation for [julep.managers.task](../../../../../../julep/managers/task.py) module. - -- [Task](#task) - - [AsyncTasksManager](#asynctasksmanager) - - [BaseTasksManager](#basetasksmanager) - - [StartTaskExecutionArgs](#starttaskexecutionargs) - - [TaskCreateArgs](#taskcreateargs) - - [TasksManager](#tasksmanager) - -## AsyncTasksManager - -[Show source in task.py:348](../../../../../../julep/managers/task.py#L348) - -A class for managing tasks, inheriting from [BaseTasksManager](#basetasksmanager). - -This class provides asynchronous functionalities to interact with and manage tasks, including creating, retrieving, start execution and get execution of tasks. It utilizes type annotations to ensure type correctness at runtime using the `beartype` decorator. - -#### Methods - -- `get(self,` *agent_id* - Union[UUID, str], task_id: Union[UUID, str]) -> Task: - Asynchronously retrieves a single task given agent and task IDs. - -#### Arguments - -agent_id (Union[UUID, str]): The UUID of the agent -task_id (Union[UUID, str]): The UUID of the task -agent_id (Union[UUID, str]): Agent ID -- `name` *str* - Task name -- `description` *Optional[str]* - Task description -- `tools_available` *Optional[List[str]]* - A list of available tools -input_schema (Optional[Dict[str, Any]]): Input schema -- `main` *List[WorkflowStep]* - A list of workflow steps -task_id Union[UUID, str]: Task ID -execution_id (Union[UUID, str]): Execution ID -agent_id (Union[UUID, str]): Agent ID -task_id (Union[UUID, str]): Task ID -arguments (Dict[str, Any]): Task arguments -- `status` *ExecutionStatus* - Task execution status -agent_id (Union[UUID, str]): Agent ID - -#### Returns - -- `Task` - The task object with the corresponding identifier. - -- `create(self,` *agent_id* - Union[UUID, str], name: str, description: Optional[str] = None, tools_available: Optional[List[str]] = None, input_schema: Optional[Dict[str, Any]] = None, main: List[WorkflowStep]) -> Task: - Asynchronously creates a task with the given specifications. - - `Task` - A newly created task object. - -- `get_task_execution(self,` *task_id* - Union[UUID, str], execution_id: Union[UUID, str]) -> List[Execution]: - Asynchronously retrieves task execution objects given a task and execution IDs - - `List[Execution]` - A list of Execution objects - -- `start_task_execution(self,` *agent_id* - Union[UUID, str], task_id: Union[UUID, str], arguments: Dict[str, Any], status: ExecutionStatus) -> Execution: - Asynchronously starts task execution given agent and task IDs and all the required parameters - - `Execution` - A newly created execution object - -- `list(self,` *agent_id* - Union[UUID, str]) -> List[Task]: - Asynchronously retrieves a list of tasks. - -- `List[Task]` - A list of Task objects. - -#### Signature - -```python -class AsyncTasksManager(BaseTasksManager): ... -``` - -#### See also - -- [BaseTasksManager](#basetasksmanager) - -### AsyncTasksManager().create - -[Show source in task.py:418](../../../../../../julep/managers/task.py#L418) - -Asynchronously creates a task with the given specifications. - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID -- `name` *str* - Task name -- `description` *Optional[str]* - Task description -- `tools_available` *Optional[List[str]]* - A list of available tools -input_schema (Optional[Dict[str, Any]]): Input schema -- `main` *List[WorkflowStep]* - A list of workflow steps - -#### Returns - -- `Task` - A newly created task object. - -#### Signature - -```python -@beartype -@rewrap_in_class(Task) -async def create(self, **kwargs: TaskCreateArgs) -> Task: ... -``` - -#### See also - -- [TaskCreateArgs](#taskcreateargs) - -### AsyncTasksManager().get - -[Show source in task.py:436](../../../../../../julep/managers/task.py#L436) - -Asynchronously retrieves a single task given agent and task IDs. - -#### Arguments - -agent_id (Union[UUID, str]): The UUID of the agent -task_id (Union[UUID, str]): The UUID of the task - -#### Returns - -- `Task` - The task object with the corresponding identifier. - -#### Signature - -```python -@beartype -async def get(self, agent_id: Union[UUID, str], task_id: Union[UUID, str]) -> Task: ... -``` - -### AsyncTasksManager().get_task_execution - -[Show source in task.py:449](../../../../../../julep/managers/task.py#L449) - -Asynchronously retrieves task execution objects given a task and execution IDs - -#### Arguments - -task_id Union[UUID, str]: Task ID -execution_id (Union[UUID, str]): Execution ID - -#### Returns - -- `List[Execution]` - A list of Execution objects - -#### Signature - -```python -@beartype -async def get_task_execution( - self, task_id: Union[UUID, str], execution_id: Union[UUID, str] -) -> List[Execution]: ... -``` - -### AsyncTasksManager().list - -[Show source in task.py:402](../../../../../../julep/managers/task.py#L402) - -Asynchronously retrieves a list of tasks. - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID - -#### Returns - -- `List[Task]` - A list of Task objects. - -#### Signature - -```python -@beartype -async def list(self, agent_id: Union[UUID, str]) -> List[Task]: ... -``` - -### AsyncTasksManager().start_task_execution - -[Show source in task.py:466](../../../../../../julep/managers/task.py#L466) - -Asynchronously starts task execution given agent and task IDs and all the required parameters - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID -task_id (Union[UUID, str]): Task ID -arguments (Dict[str, Any]): Task arguments -- `status` *ExecutionStatus* - Task execution status - -#### Returns - -- `Execution` - A newly created execution object - -#### Signature - -```python -@beartype -@rewrap_in_class(Execution) -async def start_task_execution(self, **kwargs: StartTaskExecutionArgs) -> Execution: ... -``` - -#### See also - -- [StartTaskExecutionArgs](#starttaskexecutionargs) - - - -## BaseTasksManager - -[Show source in task.py:32](../../../../../../julep/managers/task.py#L32) - -A class responsible for managing task entities. - -This manager handles CRUD operations for tasks including retrieving, creating, starting execution, getting execution of tasks using an API client. - -#### Attributes - -- `api_client` *ApiClientType* - The client responsible for API interactions. - -#### Methods - -- `_get(self,` *agent_id* - Union[UUID, str], task_id: Union[UUID, str]) -> Union[Task, Awaitable[Task]]: - Retrieves a single task given agent and task IDs. - -#### Arguments - - agent_id (Union[UUID, str]): The UUID of the agent - task_id (Union[UUID, str]): The UUID of the task - agent_id (Union[UUID, str]): Agent ID - - `name` *str* - Task name - - `description` *Optional[str]* - Task description - - `tools_available` *Optional[List[str]]* - A list of available tools - input_schema (Optional[Dict[str, Any]]): Input schema - - `main` *List[WorkflowStep]* - A list of workflow steps - task_id Union[UUID, str]: Task ID - execution_id (Union[UUID, str]): Execution ID - agent_id (Union[UUID, str]): Agent ID - task_id (Union[UUID, str]): Task ID - arguments (Dict[str, Any]): Task arguments - - `status` *ExecutionStatus* - Task execution status -agent_id (Union[UUID, str]): Agent ID - -#### Returns - -The task object or an awaitable that resolves to the task object. - -- `_create(self,` *agent_id* - Union[UUID, str], name: str, description: Optional[str] = None, tools_available: Optional[List[str]] = None, input_schema: Optional[Dict[str, Any]] = None, main: List[WorkflowStep]) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: - Creates a task with the given specifications. - The response indicating creation or an awaitable that resolves to the creation response. - -- `_get_task_execution(self,` *task_id* - Union[UUID, str], execution_id: Union[UUID, str]) -> Union[List[Execution], Awaitable[List[Execution]]]: - Retrieves task execution objects given a task and execution IDs - A list of Execution objects - -- `_start_task_execution(self,` *agent_id* - Union[UUID, str], task_id: Union[UUID, str], arguments: Dict[str, Any], status: ExecutionStatus) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: - Starts task execution given agent and task IDs and all the required parameters - The response indicating creation or an awaitable that resolves to the creation response. - -- `_list(self,` *agent_id* - Union[UUID, str]) -> Union[List[Task], Awaitable[List[Task]]]: -Retrieves a list of tasks. - - `List[Task]` - A list of Task objects. - -#### Signature - -```python -class BaseTasksManager(BaseManager): ... -``` - -### BaseTasksManager()._create - -[Show source in task.py:105](../../../../../../julep/managers/task.py#L105) - -Creates a task with the given specifications. - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID -- `name` *str* - Task name -- `description` *Optional[str]* - Task description -- `tools_available` *Optional[List[str]]* - A list of available tools -input_schema (Optional[Dict[str, Any]]): Input schema -- `main` *List[WorkflowStep]* - A list of workflow steps - -#### Returns - -The response indicating creation or an awaitable that resolves to the creation response. - -#### Signature - -```python -def _create( - self, - agent_id: Union[UUID, str], - name: str, - description: Optional[str] = None, - tools_available: Optional[List[str]] = None, - input_schema: Optional[Dict[str, Any]] = None, - main: List[WorkflowStep], -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - -### BaseTasksManager()._get - -[Show source in task.py:139](../../../../../../julep/managers/task.py#L139) - -Retrieves a single task given agent and task IDs. - -#### Arguments - -agent_id (Union[UUID, str]): The UUID of the agent -task_id (Union[UUID, str]): The UUID of the task - -#### Returns - -The task object or an awaitable that resolves to the task object. - -#### Signature - -```python -def _get( - self, agent_id: Union[UUID, str], task_id: Union[UUID, str] -) -> Union[Task, Awaitable[Task]]: ... -``` - -### BaseTasksManager()._get_task_execution - -[Show source in task.py:159](../../../../../../julep/managers/task.py#L159) - -Retrieves task execution objects given a task and execution IDs - -#### Arguments - -task_id Union[UUID, str]: Task ID -execution_id (Union[UUID, str]): Execution ID - -#### Returns - -A list of Execution objects - -#### Signature - -```python -def _get_task_execution( - self, task_id: Union[UUID, str], execution_id: Union[UUID, str] -) -> Union[List[Execution], Awaitable[List[Execution]]]: ... -``` - -### BaseTasksManager()._list - -[Show source in task.py:88](../../../../../../julep/managers/task.py#L88) - -Retrieves a list of tasks. - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID - -#### Returns - -- `List[Task]` - A list of Task objects. - -#### Signature - -```python -def _list( - self, agent_id: Union[UUID, str] -) -> Union[List[Task], Awaitable[List[Task]]]: ... -``` - -### BaseTasksManager()._start_task_execution - -[Show source in task.py:179](../../../../../../julep/managers/task.py#L179) - -Starts task execution given agent and task IDs and all the required parameters - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID -task_id (Union[UUID, str]): Task ID -arguments (Dict[str, Any]): Task arguments -- `status` *ExecutionStatus* - Task execution status - -#### Returns - -The response indicating creation or an awaitable that resolves to the creation response. - -#### Signature - -```python -def _start_task_execution( - self, - agent_id: Union[UUID, str], - task_id: Union[UUID, str], - arguments: Dict[str, Any], - status: ExecutionStatus, -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - - - -## StartTaskExecutionArgs - -[Show source in task.py:25](../../../../../../julep/managers/task.py#L25) - -#### Signature - -```python -class StartTaskExecutionArgs(TypedDict): ... -``` - - - -## TaskCreateArgs - -[Show source in task.py:16](../../../../../../julep/managers/task.py#L16) - -#### Signature - -```python -class TaskCreateArgs(TypedDict): ... -``` - - - -## TasksManager - -[Show source in task.py:210](../../../../../../julep/managers/task.py#L210) - -A class for managing tasks, inheriting from [BaseTasksManager](#basetasksmanager). - -This class provides functionalities to interact with and manage tasks, including creating, retrieving, start execution and get execution of tasks. It utilizes type annotations to ensure type correctness at runtime using the `beartype` decorator. - -#### Methods - -- `get(self,` *agent_id* - Union[UUID, str], task_id: Union[UUID, str]) -> Task: - Retrieves a single task given agent and task IDs. - -#### Arguments - -agent_id (Union[UUID, str]): The UUID of the agent -task_id (Union[UUID, str]): The UUID of the task -agent_id (Union[UUID, str]): Agent ID -- `name` *str* - Task name -- `description` *Optional[str]* - Task description -- `tools_available` *Optional[List[str]]* - A list of available tools -input_schema (Optional[Dict[str, Any]]): Input schema -- `main` *List[WorkflowStep]* - A list of workflow steps -task_id Union[UUID, str]: Task ID -execution_id (Union[UUID, str]): Execution ID -agent_id (Union[UUID, str]): Agent ID -task_id (Union[UUID, str]): Task ID -arguments (Dict[str, Any]): Task arguments -- `status` *ExecutionStatus* - Task execution status -agent_id (Union[UUID, str]): Agent ID - -#### Returns - -- `Task` - The task object with the corresponding identifier. - -- `create(self,` *agent_id* - Union[UUID, str], name: str, description: Optional[str] = None, tools_available: Optional[List[str]] = None, input_schema: Optional[Dict[str, Any]] = None, main: List[WorkflowStep]) -> Task: - Creates a task with the given specifications. - - `Task` - A newly created task object. - -- `get_task_execution(self,` *task_id* - Union[UUID, str], execution_id: Union[UUID, str]) -> List[Execution]: - Retrieves task execution objects given a task and execution IDs - - `List[Execution]` - A list of Execution objects - -- `start_task_execution(self,` *agent_id* - Union[UUID, str], task_id: Union[UUID, str], arguments: Dict[str, Any], status: ExecutionStatus) -> Execution: - Starts task execution given agent and task IDs and all the required parameters - - `Execution` - A newly created execution object - -- `list(self,` *agent_id* - Union[UUID, str]) -> List[Task]: - Retrieves a list of tasks. - - `List[Task]` - A list of Task objects. - -#### Signature - -```python -class TasksManager(BaseTasksManager): ... -``` - -#### See also - -- [BaseTasksManager](#basetasksmanager) - -### TasksManager().create - -[Show source in task.py:282](../../../../../../julep/managers/task.py#L282) - -Creates a task with the given specifications. - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID -- `name` *str* - Task name -- `description` *Optional[str]* - Task description -- `tools_available` *Optional[List[str]]* - A list of available tools -input_schema (Optional[Dict[str, Any]]): Input schema -- `main` *List[WorkflowStep]* - A list of workflow steps - -#### Returns - -- `Task` - A newly created task object. - -#### Signature - -```python -@beartype -@rewrap_in_class(Task) -def create(self, **kwargs: TaskCreateArgs) -> Task: ... -``` - -#### See also - -- [TaskCreateArgs](#taskcreateargs) - -### TasksManager().get - -[Show source in task.py:300](../../../../../../julep/managers/task.py#L300) - -Retrieves a single task given agent and task IDs. - -#### Arguments - -agent_id (Union[UUID, str]): The UUID of the agent -task_id (Union[UUID, str]): The UUID of the task - -#### Returns - -- `Task` - The task object with the corresponding identifier. - -#### Signature - -```python -@beartype -def get(self, agent_id: Union[UUID, str], task_id: Union[UUID, str]) -> Task: ... -``` - -### TasksManager().get_task_execution - -[Show source in task.py:313](../../../../../../julep/managers/task.py#L313) - -Retrieves task execution objects given a task and execution IDs - -#### Arguments - -task_id Union[UUID, str]: Task ID -execution_id (Union[UUID, str]): Execution ID - -#### Returns - -- `List[Execution]` - A list of Execution objects - -#### Signature - -```python -@beartype -def get_task_execution( - self, task_id: Union[UUID, str], execution_id: Union[UUID, str] -) -> List[Execution]: ... -``` - -### TasksManager().list - -[Show source in task.py:263](../../../../../../julep/managers/task.py#L263) - -Retrieves a list of tasks. - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID - -#### Returns - -- `List[Task]` - A list of Task objects. - -#### Signature - -```python -@beartype -def list(self, agent_id: Union[UUID, str]) -> List[Task]: ... -``` - -### TasksManager().start_task_execution - -[Show source in task.py:331](../../../../../../julep/managers/task.py#L331) - -Starts task execution given agent and task IDs and all the required parameters - -#### Arguments - -agent_id (Union[UUID, str]): Agent ID -task_id (Union[UUID, str]): Task ID -arguments (Dict[str, Any]): Task arguments -- `status` *ExecutionStatus* - Task execution status - -#### Returns - -- `Execution` - A newly created execution object - -#### Signature - -```python -@beartype -@rewrap_in_class(Execution) -def start_task_execution(self, **kwargs: StartTaskExecutionArgs) -> Execution: ... -``` - -#### See also - -- [StartTaskExecutionArgs](#starttaskexecutionargs) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/tool.md b/docs/python-sdk-docs/julep/managers/tool.md deleted file mode 100644 index 73889b87a..000000000 --- a/docs/python-sdk-docs/julep/managers/tool.md +++ /dev/null @@ -1,521 +0,0 @@ -# Tool - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Tool - -> Auto-generated documentation for [julep.managers.tool](../../../../../../julep/managers/tool.py) module. - -- [Tool](#tool) - - [AsyncToolsManager](#asynctoolsmanager) - - [BaseToolsManager](#basetoolsmanager) - - [ToolsManager](#toolsmanager) - -## AsyncToolsManager - -[Show source in tool.py:352](../../../../../../julep/managers/tool.py#L352) - -A manager for asynchronous tools handling. - -This class provides async methods to manage tools, allowing create, retrieve, update, and delete operations. - -Methods: - get: Asynchronously retrieves tools associated with an agent. - create: Asynchronously creates a new tool associated with an agent. - delete: Asynchronously deletes a tool associated with an agent. - update: Asynchronously updates a tool associated with an agent. - -Attributes: - Inherited from BaseToolsManager. - -#### Signature - -```python -class AsyncToolsManager(BaseToolsManager): ... -``` - -#### See also - -- [BaseToolsManager](#basetoolsmanager) - -### AsyncToolsManager().create - -[Show source in tool.py:403](../../../../../../julep/managers/tool.py#L403) - -Create a new resource asynchronously. - -This method creates a new resource using the provided `agent_id` and `tool` information. - -#### Arguments - -agent_id (Union[str, UUID]): The identifier of the agent, which can be a string or a UUID object. -- `tool` *ToolDict* - A dictionary containing tool-specific data. - -#### Returns - -- `ResourceCreatedResponse` - An object representing the response received after creating the resource. - -#### Raises - -- `BeartypeException` - If the type of any argument does not match the expected type. - -#### Signature - -```python -@beartype -async def create( - self, agent_id: Union[str, UUID], tool: ToolDict -) -> ResourceCreatedResponse: ... -``` - -### AsyncToolsManager().delete - -[Show source in tool.py:430](../../../../../../julep/managers/tool.py#L430) - -Asynchronously delete a specified agent-tool association. - -This function is a high-level asynchronous API that delegates to a -private coroutinal method `_delete` to perform the actual deletion based on -the provided `agent_id` and `tool_id`. - -Args: - agent_id (Union[str, UUID]): The unique identifier of the agent. - tool_id (Union[str, UUID]): The unique identifier of the tool. - -Returns: - The return type is not explicitly stated in the function signature. - Typically, the returned value would be documented here, but you may need - to investigate the implementation of `_delete` to determine what it - returns. - -Raises: - The exceptions that this function might raise are not stated in the - snippet provided. If the private method `_delete` raises any exceptions, - they should be documented here. Depending on the implementation, common - exceptions might include `ValueError` if identifiers are invalid or - `RuntimeError` if deletion fails. - -#### Signature - -```python -@beartype -async def delete( - self, agent_id: Union[str, UUID], tool_id: Union[str, UUID] -) -> Awaitable[ResourceDeletedResponse]: ... -``` - -### AsyncToolsManager().get - -[Show source in tool.py:368](../../../../../../julep/managers/tool.py#L368) - -Asynchronously get a list of Tool objects based on provided filters. - -This method fetches Tool objects with the option to limit the results and -offset them, to allow for pagination. - -#### Arguments - -agent_id (Union[str, UUID]): The unique identifier of the agent for which to fetch tools. -- `limit` *Optional[int], optional* - The maximum number of tools to return. Defaults to None, which implies no limit. -- `offset` *Optional[int], optional* - The number of tools to skip before starting to return the tools. Defaults to None, which means start from the beginning. - -#### Returns - -- `List[Tool]` - A list of Tool objects that match the criteria. - -#### Notes - -This function is decorated with beartype, which assures that the input -arguments adhere to the specified types at runtime. It is an asynchronous -function and should be called with `await`. - -#### Signature - -```python -@beartype -async def get( - self, - agent_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[Tool]: ... -``` - -### AsyncToolsManager().update - -[Show source in tool.py:466](../../../../../../julep/managers/tool.py#L466) - -Asynchronously updates a resource identified by the agent_id and tool_id with a new definition. - -This function is type-enforced using the `beartype` decorator. - -#### Arguments - -agent_id (Union[str, UUID]): The unique identifier for the agent. -tool_id (Union[str, UUID]): The unique identifier for the tool. -- `function` *FunctionDefDict* - A dictionary containing the function definition which needs to be updated. - -#### Returns - -- `ResourceUpdatedResponse` - An object representing the response received after updating the resource. - -#### Raises - -This will depend on the implementation of the `_update` method and any exceptions that it raises. - -#### Signature - -```python -@beartype -async def update( - self, - agent_id: Union[str, UUID], - tool_id: Union[str, UUID], - function: FunctionDefDict, -) -> ResourceUpdatedResponse: ... -``` - - - -## BaseToolsManager - -[Show source in tool.py:22](../../../../../../julep/managers/tool.py#L22) - -A class to manage tools by interacting with an API client. - -This class provides methods for creating, reading, updating, and deleting tools associated with agents. It ensures the validity of UUIDs for agent_id and tool_id where applicable and handles both synchronous and asynchronous operations. - -#### Attributes - -- `api_client` - The API client used to send requests to the service. - -#### Methods - -- `_get(self,` *agent_id* - Union[str, UUID], limit: Optional[int]=None, offset: Optional[int]=None) -> Union[GetAgentToolsResponse, Awaitable[GetAgentToolsResponse]]: - Retrieves a list of tools associated with the specified agent. Supports pagination through limit and offset parameters. - -- `_create(self,` *agent_id* - Union[str, UUID], tool: ToolDict) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: - Creates a new tool associated with the specified agent. - -- `_update(self,` *agent_id* - Union[str, UUID], tool_id: Union[str, UUID], function: FunctionDefDict) -> Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: - Updates the definition of an existing tool associated with the specified agent. - -- `_delete(self,` *agent_id* - Union[str, UUID], tool_id: Union[str, UUID]): - Deletes a tool associated with the specified agent. - -#### Signature - -```python -class BaseToolsManager(BaseManager): ... -``` - -### BaseToolsManager()._create - -[Show source in tool.py:77](../../../../../../julep/managers/tool.py#L77) - -Create a new tool associated with a given agent. - -Args: - agent_id (Union[str, UUID]): The ID of the agent for which to create the tool. Must be a valid UUID v4. - tool (ToolDict): A dictionary with tool data conforming to the CreateToolRequest structure. - -Returns: - Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: The response object indicating the newly created tool, - either as a direct response or as an awaitable if it's an asynchronous operation. - -#### Signature - -```python -def _create( - self, agent_id: Union[str, UUID], tool: ToolDict -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - -### BaseToolsManager()._delete - -[Show source in tool.py:142](../../../../../../julep/managers/tool.py#L142) - -Delete a tool associated with an agent. - -Args: - agent_id (Union[str, UUID]): The UUID of the agent. - tool_id (Union[str, UUID]): The UUID of the tool to be deleted. - -Returns: - The response from the API client's delete_agent_tool method. - -Raises: - AssertionError: If either `agent_id` or `tool_id` is not a valid UUID v4. - -#### Signature - -```python -def _delete( - self, agent_id: Union[str, UUID], tool_id: Union[str, UUID] -) -> Union[ResourceDeletedResponse, Awaitable[ResourceDeletedResponse]]: ... -``` - -### BaseToolsManager()._get - -[Show source in tool.py:45](../../../../../../julep/managers/tool.py#L45) - -Retrieve tools associated with the given agent. - -This is a private method that fetches tools for the provided agent ID, with optional -limit and offset parameters for pagination. - -#### Arguments - -agent_id (Union[str, UUID]): The unique identifier for the agent, which can be a - string or UUID object. -- `limit` *Optional[int], optional* - The maximum number of tools to retrieve. Defaults to None. -- `offset` *Optional[int], optional* - The number of tools to skip before starting to collect - the result set. Defaults to None. - -#### Returns - -- `Union[GetAgentToolsResponse,` *Awaitable[GetAgentToolsResponse]]* - The response object which -contains the list of tools, or an awaitable response object for asynchronous operations. - -#### Raises - -- `AssertionError` - If the agent_id is not a valid UUID v4. - -#### Signature - -```python -def _get( - self, - agent_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> Union[GetAgentToolsResponse, Awaitable[GetAgentToolsResponse]]: ... -``` - -### BaseToolsManager()._update - -[Show source in tool.py:102](../../../../../../julep/managers/tool.py#L102) - -Update the tool definition for a given agent. - -Args: - agent_id (Union[str, UUID]): The unique identifier for the agent, either in string or UUID format. - tool_id (Union[str, UUID]): The unique identifier for the tool, either in string or UUID format. - function (FunctionDefDict): A dictionary containing the function definition that conforms with the required API schema. - overwrite (bool): A flag to indicate whether to overwrite the existing function definition. Defaults to False. - -Returns: - Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: The updated resource response sync or async. - -Raises: - AssertionError: If the `agent_id` or `tool_id` is not a valid UUID v4. - -#### Signature - -```python -def _update( - self, - agent_id: Union[str, UUID], - tool_id: Union[str, UUID], - function: FunctionDefDict, - overwrite: bool = False, -) -> Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: ... -``` - - - -## ToolsManager - -[Show source in tool.py:170](../../../../../../julep/managers/tool.py#L170) - -A manager class for handling tools related to agents. - -This class provides an interface to manage tools, including their retrieval, creation, -deletion, and updating. It extends the functionalities of the BaseToolsManager. - -#### Methods - -get: - Retrieves a list of tools for the given agent. - -#### Arguments - -agent_id (Union[str, UUID]): The identifier of the agent whose tools are being retrieved. -- `limit` *Optional[int], optional* - The maximum number of tools to retrieve. -- `offset` *Optional[int], optional* - The index from which to start the retrieval. - -agent_id (Union[str, UUID]): The identifier of the agent for whom the tool is being created. -- `tool` *ToolDict* - A dictionary of tool attributes. - -agent_id (Union[str, UUID]): The identifier of the agent whose tool is being deleted. -tool_id (Union[str, UUID]): The unique identifier of the tool to be deleted. - -update: - Updates the definition of an existing tool for the given agent. - -agent_id (Union[str, UUID]): The identifier of the agent whose tool is being updated. -tool_id (Union[str, UUID]): The unique identifier of the tool to be updated. -- `function` *FunctionDefDict* - A dictionary representing the definition of the tool to be updated. - -#### Returns - -- `List[Tool]` - A list of Tool objects. - -create: - Creates a new tool for the given agent. - -- `ResourceCreatedResponse` - An object indicating the successful creation of the tool. - -delete: - Deletes a tool for the given agent. - -- `ResourceUpdatedResponse` - An object indicating the successful update of the tool. - -Inherits: - - [BaseToolsManager](#basetoolsmanager) - A base class that defines the basic operations for tool management. - -#### Signature - -```python -class ToolsManager(BaseToolsManager): ... -``` - -#### See also - -- [BaseToolsManager](#basetoolsmanager) - -### ToolsManager().create - -[Show source in tool.py:252](../../../../../../julep/managers/tool.py#L252) - -Create a new resource with the provided agent identifier and tool information. - -This method wraps the internal `_create` method to construct and return a ResourceCreatedResponse. - -Args: - agent_id (Union[str, UUID]): The unique identifier for the agent. Can be a string or a UUID object. - tool (ToolDict): A dictionary containing tool-specific configuration or information. - -Returns: - ResourceCreatedResponse: An object representing the successfully created resource, including metadata like creation timestamps and resource identifiers. - -Raises: - TypeError: If the `agent_id` or `tool` arguments are not of the expected type. - ValueError: If any values within the `tool` dictionary are invalid or out of accepted range. - RuntimeError: If the creation process encounters an unexpected error. - -Note: - The `@beartype` decorator is used to enforce type checking of the arguments at runtime. - -Example usage: - -```python ->>> response = instance.create(agent_id="123e4567-e89b-12d3-a456-426614174000", tool={"type": "screwdriver", "size": "M4"}) ->>> print(response) -ResourceCreatedResponse(resource_id='abcde-12345', created_at='2021-01-01T12:00:00Z') -``` - -#### Signature - -```python -@beartype -def create( - self, agent_id: Union[str, UUID], tool: ToolDict -) -> ResourceCreatedResponse: ... -``` - -### ToolsManager().delete - -[Show source in tool.py:290](../../../../../../julep/managers/tool.py#L290) - -Deletes an agent's access to a specific tool. - -#### Arguments - -agent_id (Union[str, UUID]): The unique identifier of the agent. -tool_id (Union[str, UUID]): The unique identifier of the tool. - -#### Returns - -The result of the delete operation, the specific type of which may depend on the implementation of `_delete`. - -#### Raises - -- `Beartype` *exceptions* - If `agent_id` or `tool_id` are of the wrong type. - -#### Signature - -```python -@beartype -def delete(self, agent_id: Union[str, UUID], tool_id: Union[str, UUID]): ... -``` - -### ToolsManager().get - -[Show source in tool.py:221](../../../../../../julep/managers/tool.py#L221) - -Retrieve a list of Tool objects for the specified agent. - -This method wraps the internal _get method and returns the 'items' property -from the result, which contains a list of Tool instances. - -Args: - agent_id (Union[str, UUID]): The ID of the agent to retrieve Tool objects for. - limit (Optional[int]): The maximum number of Tool objects to return. Defaults to None, implying no limit. - offset (Optional[int]): The number to skip before starting to collect the result set. Defaults to None, implying no offset. - -Returns: - List[Tool]: A list of Tool instances associated with the specified agent ID. - -Raises: - BeartypeException: If the input argument types do not match the expected types. - -#### Signature - -```python -@beartype -def get( - self, - agent_id: Union[str, UUID], - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> List[Tool]: ... -``` - -### ToolsManager().update - -[Show source in tool.py:315](../../../../../../julep/managers/tool.py#L315) - -Update a specific tool definition for an agent. - -#### Arguments - -agent_id (Union[str, UUID]): The unique identifier of the agent. -tool_id (Union[str, UUID]): The unique identifier of the tool to be updated. -- `function` *FunctionDefDict* - A dictionary containing the new definition of the tool. -- `overwrite` *bool* - A flag indicating whether to overwrite the existing definition. - -#### Returns - -- `ResourceUpdatedResponse` - An object representing the update operation response. - -#### Notes - -This function is decorated with `beartype` which ensures that the arguments provided -match the expected types at runtime. - -#### Raises - -- `BeartypeDecorHintPepParamException` - If the type of any parameter does not match the expected type. -Any exceptions that `self._update` method might raise. - -#### Signature - -```python -@beartype -def update( - self, - agent_id: Union[str, UUID], - tool_id: Union[str, UUID], - function: FunctionDefDict, - overwrite: bool = False, -) -> ResourceUpdatedResponse: ... -``` \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/managers/types.md b/docs/python-sdk-docs/julep/managers/types.md deleted file mode 100644 index 03813b1c6..000000000 --- a/docs/python-sdk-docs/julep/managers/types.md +++ /dev/null @@ -1,22 +0,0 @@ -# Types - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / Types - -> Auto-generated documentation for [julep.managers.types](../../../../../../julep/managers/types.py) module. - -#### Attributes - -- `ChatSettingsResponseFormatDict` - Represents the settings for chat response formatting, used in configuring agent chat behavior.: TypedDict('ChatSettingsResponseFormat', **{k: v.outer_type_ for (k, v) in ChatSettingsResponseFormat.__fields__.items()}) - -- `InputChatMlMessageDict` - Represents an input message for chat in ML format, used for processing chat inputs.: TypedDict('InputChatMlMessage', **{k: v.outer_type_ for (k, v) in InputChatMlMessage.__fields__.items()}) - -- `ToolDict` - Represents the structure of a tool, used for defining tools within the system.: TypedDict('Tool', **{k: v.outer_type_ for (k, v) in Tool.__fields__.items()}) - -- `DocDict` - Represents the serialized form of a document, used for API communication.: TypedDict('DocDict', **{k: v.outer_type_ for (k, v) in CreateDoc.__fields__.items()}) - -- `DefaultSettingsDict` - Represents the default settings for an agent, used in agent configuration.: TypedDict('DefaultSettingsDict', **{k: v.outer_type_ for (k, v) in AgentDefaultSettings.__fields__.items()}) - -- `FunctionDefDict` - Represents the definition of a function, used for defining functions within the system.: TypedDict('FunctionDefDict', **{k: v.outer_type_ for (k, v) in FunctionDef.__fields__.items()}) - -- `ToolDict` - Represents the request structure for creating a tool, used in tool creation API calls.: TypedDict('ToolDict', **{k: v.outer_type_ for (k, v) in CreateToolRequest.__fields__.items()}) -- [Types](#types) diff --git a/docs/python-sdk-docs/julep/managers/user.md b/docs/python-sdk-docs/julep/managers/user.md deleted file mode 100644 index 606b2f5c9..000000000 --- a/docs/python-sdk-docs/julep/managers/user.md +++ /dev/null @@ -1,621 +0,0 @@ -# User - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Managers](./index.md#managers) / User - -> Auto-generated documentation for [julep.managers.user](../../../../../../julep/managers/user.py) module. - -- [User](#user) - - [AsyncUsersManager](#asyncusersmanager) - - [BaseUsersManager](#baseusersmanager) - - [UserCreateArgs](#usercreateargs) - - [UserUpdateArgs](#userupdateargs) - - [UsersManager](#usersmanager) - -## AsyncUsersManager - -[Show source in user.py:358](../../../../../../julep/managers/user.py#L358) - -A class that provides asynchronous management of users extending BaseUsersManager. - -Attributes are inherited from BaseUsersManager. - -#### Methods - -get (Union[UUID, str]) -> User: - Asynchronously retrieves a user by their unique identifier (either a UUID or a string). - -create (*, name: str, about: str, docs: List[DocDict]=[]) -> ResourceCreatedResponse: - Asynchronously creates a new user with the given name, about description, and optional list of documents. - -list (*, limit: Optional[int]=None, offset: Optional[int]=None) -> List[User]: - Asynchronously retrieves a list of users with an optional limit and offset for pagination. - -delete (*, user_id: Union[str, UUID]) -> None: - Asynchronously deletes a user identified by their unique ID (either a string or a UUID). - -update (*, user_id: Union[str, UUID], about: Optional[str]=None, name: Optional[str]=None) -> ResourceUpdatedResponse: - Asynchronously updates a user's information identified by their unique ID with optional new about description and name. - -#### Notes - -The beartype decorator is used for runtime type checking of the parameters passed to the methods. - -#### Signature - -```python -class AsyncUsersManager(BaseUsersManager): ... -``` - -#### See also - -- [BaseUsersManager](#baseusersmanager) - -### AsyncUsersManager().create - -[Show source in user.py:402](../../../../../../julep/managers/user.py#L402) - -Asynchronously create a new resource with the provided name, description, and documents. - -This function is decorated with `@beartype` to ensure type checking at runtime. - -#### Arguments - -- `name` *str* - The name of the resource to be created. -- `about` *str* - Brief information about the resource. -- `docs` *List[DocDict], optional* - A list of document dictionaries with structure defined by DocDict type. - -#### Returns - -- `ResourceCreatedResponse` - An instance representing the response after resource creation. - -#### Raises - -- `BeartypeException` - If any of the parameters do not match their annotated types. - -#### Signature - -```python -@beartype -@rewrap_in_class(User) -async def create(self, **kwargs: UserCreateArgs) -> User: ... -``` - -#### See also - -- [UserCreateArgs](#usercreateargs) - -### AsyncUsersManager().delete - -[Show source in user.py:461](../../../../../../julep/managers/user.py#L461) - -Asynchronously deletes a user by their user ID. - -#### Arguments - -user_id (Union[str, UUID]): The unique identifier of the user to delete, which can be a string or a UUID. - -#### Returns - -- `None` - This function does not return anything. - -#### Notes - -- The function is decorated with `@beartype` for runtime type checking. -- This function is a coroutine, it should be called with `await`. - -#### Raises - -- The raised exceptions depend on the implementation of the underlying `_delete` coroutine. - -#### Signature - -```python -@beartype -async def delete(self, user_id: Union[str, UUID]) -> None: ... -``` - -### AsyncUsersManager().get - -[Show source in user.py:384](../../../../../../julep/managers/user.py#L384) - -Fetch a User object asynchronously by its identifier. - -This method retrieves a User object from some data storage asynchronously based on the provided identifier, which can be either a UUID or a string. - -#### Arguments - -id (Union[UUID, str]): The unique identifier of the User to be retrieved. - -#### Returns - -- `User` - An instance of the User class corresponding to the given id. - -#### Raises - -- `Exception` - If the retrieval fails or the user cannot be found. - -#### Signature - -```python -@beartype -async def get(self, id: Union[UUID, str]) -> User: ... -``` - -### AsyncUsersManager().list - -[Show source in user.py:424](../../../../../../julep/managers/user.py#L424) - -Asynchronously lists users with optional limits and offsets. - -This function applies the `beartype` decorator for runtime type checking. - -#### Arguments - -- `limit` *Optional[int], optional* - The maximum number of users to be returned. Defaults to None, which means no limit. -- `offset` *Optional[int], optional* - The number to offset the list of returned users by. Defaults to None, which means no offset. - -#### Returns - -- `List[User]` - A list of user objects. - -#### Raises - -- `TypeError` - If any input arguments are not of the expected type. -Any other exception that might be raised during the retrieval of users from the data source. - -#### Notes - -The actual exception raised by the `beartype` decorator or during the users' retrieval will depend on the implementation detail of the `self._list_items` method and the `beartype` configuration. - -#### Signature - -```python -@beartype -async def list( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[User]: ... -``` - -### AsyncUsersManager().update - -[Show source in user.py:486](../../../../../../julep/managers/user.py#L486) - -Asynchronously updates user details. - -This function updates user details such as 'about' and 'name'. It uses type annotations to enforce the types of the parameters and an asynchronous call to '_update' method to perform the actual update operation. - -#### Arguments - -user_id (Union[str, UUID]): The unique identifier of the user, which can be either a string or a UUID. -- `about` *Optional[str], optional* - A description of the user. Default is None, indicating no update. -- `name` *Optional[str], optional* - The name of the user. Default is None, indicating no update. - -#### Returns - -- `ResourceUpdatedResponse` - An object representing the update status. - -#### Notes - -This function is decorated with @beartype to perform runtime type checking. - -#### Signature - -```python -@beartype -@rewrap_in_class(User) -async def update(self, user_id: Union[str, UUID], **kwargs: UserUpdateArgs) -> User: ... -``` - -#### See also - -- [UserUpdateArgs](#userupdateargs) - - - -## BaseUsersManager - -[Show source in user.py:36](../../../../../../julep/managers/user.py#L36) - -A manager class for handling user-related operations through an API client. - -This class provides high-level methods to interact with user records, -such as retrieving a user by ID, creating a new user, listing all users, -deleting a user, and updating a user's details. - -Attributes: - api_client: The API client instance to communicate with the user service. - -Methods: - _get: Retrieve a user by a unique UUID. - _create: Create a new user with the specified name and about fields, and optionally additional documents. - _list_items: List users with optional pagination through limit and offset parameters. - _delete: Delete a user by UUID. - _update: Update user details such as the 'about' description and name by UUID. - -Raises: - AssertionError: If the provided ID for the user operations is not a valid UUID v4. - -#### Signature - -```python -class BaseUsersManager(BaseManager): ... -``` - -### BaseUsersManager()._create - -[Show source in user.py:79](../../../../../../julep/managers/user.py#L79) - -Create a new resource with the given name and about information, optionally including additional docs. - -This internal method allows for creating a new resource with optional docsrmation. - -#### Arguments - -- `name` *str* - The name of the new resource. -- `about` *str* - A brief description about the new resource. -- `docs` *List[DocDict], optional* - A list of dictionaries with documentation-related information. Each dictionary - must conform to the structure expected by CreateDoc. Defaults to an empty list. -metadata (Dict[str, Any]) - -#### Returns - -- `Union[ResourceCreatedResponse,` *Awaitable[ResourceCreatedResponse]]* - The response indicating the resource has been -created successfully. It can be either a synchronous ResourceCreatedResponse or an asynchronous Awaitable object -containing a ResourceCreatedResponse. - -#### Notes - -This method is an internal API implementation detail and should not be used directly outside the defining class -or module. - -Side effects: - Modifies internal state by converting each doc dict to an instance of CreateDoc and uses the - internal API client to create a new user resource. - -#### Signature - -```python -def _create( - self, name: str, about: str, docs: List[DocDict] = [], metadata: Dict[str, Any] = {} -) -> Union[ResourceCreatedResponse, Awaitable[ResourceCreatedResponse]]: ... -``` - -### BaseUsersManager()._delete - -[Show source in user.py:144](../../../../../../julep/managers/user.py#L144) - -Delete a user given their user ID. - -Args: - user_id (Union[str, UUID]): The identifier of the user. Must be a valid UUID version 4. - -Returns: - Union[None, Awaitable[None]]: None if the deletion is synchronous, or an Awaitable - that resolves to None if the deletion is asynchronous. - -Raises: - AssertionError: If the user_id is not a valid UUID v4. - -#### Signature - -```python -def _delete(self, user_id: Union[str, UUID]) -> Union[None, Awaitable[None]]: ... -``` - -### BaseUsersManager()._get - -[Show source in user.py:58](../../../../../../julep/managers/user.py#L58) - -Get the user by their ID. - -This method is intended to retrieve a User object or an Awaitable User object by the user's unique identifier. The identifier can be a string representation of a UUID or a UUID object itself. - -#### Arguments - -id (Union[str, UUID]): The unique identifier of the user to retrieve. It must be a valid UUID v4. - -#### Returns - -- `Union[User,` *Awaitable[User]]* - The retrieved User instance or an Awaitable that resolves to a User instance. - -#### Raises - -- `AssertionError` - If the `id` is not a valid UUID v4. - -#### Notes - -The leading underscore in the method name suggests that this method is intended for internal use and should not be a part of the public interface of the class. - -#### Signature - -```python -def _get(self, id: Union[str, UUID]) -> Union[User, Awaitable[User]]: ... -``` - -### BaseUsersManager()._list_items - -[Show source in user.py:121](../../../../../../julep/managers/user.py#L121) - -Fetch a list of users, with optional pagination parameters. - -Args: - limit (Optional[int], optional): The maximum number of users to return. Defaults to None. - offset (Optional[int], optional): The offset from the start of the list to begin returning users. Defaults to None. - -Returns: - Union[ListUsersResponse, Awaitable[ListUsersResponse]]: An instance of ListUsersResponse, - or an awaitable that will resolve to it, depending on the API client implementation. - -#### Signature - -```python -def _list_items( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: str = "{}", -) -> Union[ListUsersResponse, Awaitable[ListUsersResponse]]: ... -``` - -### BaseUsersManager()._update - -[Show source in user.py:161](../../../../../../julep/managers/user.py#L161) - -Update user details for a given user ID. - -This method updates the 'about' and/or 'name' fields for the user identified by user_id. - -#### Arguments - -user_id (Union[str, UUID]): The ID of the user to be updated. Must be a valid UUID v4. -- `about` *Optional[str], optional* - The new information about the user. Defaults to None. -- `name` *Optional[str], optional* - The new name for the user. Defaults to None. -metadata (Dict[str, Any]) -- `overwrite` *bool, optional* - Whether to overwrite the existing user data. Defaults to False. - -#### Returns - -- `Union[ResourceUpdatedResponse,` *Awaitable[ResourceUpdatedResponse]]* - The response indicating successful update or an Awaitable that resolves to such a response. - -#### Raises - -- `AssertionError` - If `user_id` is not a valid UUID v4. - -#### Signature - -```python -def _update( - self, - user_id: Union[str, UUID], - about: Optional[str] = NotSet, - name: Optional[str] = NotSet, - metadata: Dict[str, Any] = NotSet, - overwrite: bool = False, -) -> Union[ResourceUpdatedResponse, Awaitable[ResourceUpdatedResponse]]: ... -``` - - - -## UserCreateArgs - -[Show source in user.py:22](../../../../../../julep/managers/user.py#L22) - -#### Signature - -```python -class UserCreateArgs(TypedDict): ... -``` - - - -## UserUpdateArgs - -[Show source in user.py:29](../../../../../../julep/managers/user.py#L29) - -#### Signature - -```python -class UserUpdateArgs(TypedDict): ... -``` - - - -## UsersManager - -[Show source in user.py:208](../../../../../../julep/managers/user.py#L208) - -A class responsible for managing users in a system. - -This class is a specialized version of the BaseUsersManager and provides -methods for retrieving, creating, listing, deleting, and updating users within -the system. - -#### Methods - -- `get(id` - Union[str, UUID]) -> User: - Retrieves a user based on their unique identifier (either a string or UUID). - -- `create(*,` *name* - str, about: str, docs: List[DocDict]=[]) -> ResourceCreatedResponse: - Creates a new user with the specified name, description about the user, - and an optional list of documents associated with the user. - -- `list(*,` *limit* - Optional[int]=None, offset: Optional[int]=None) -> List[User]: - Lists users in the system, with optional limit and offset for pagination. - -- `delete(*,` *user_id* - Union[str, UUID]) -> None: - Deletes a user from the system based on their unique identifier. - -- `update(*,` *user_id* - Union[str, UUID], about: Optional[str]=None, name: Optional[str]=None) -> ResourceUpdatedResponse: - Updates an existing user's information with optional new about and name - fields. - -#### Signature - -```python -class UsersManager(BaseUsersManager): ... -``` - -#### See also - -- [BaseUsersManager](#baseusersmanager) - -### UsersManager().create - -[Show source in user.py:255](../../../../../../julep/managers/user.py#L255) - -Create a new resource with the specified name, about text, and associated docs. - -Args: - name (str): The name of the resource to create. - about (str): A brief description of the resource. - docs (List[DocDict], optional): A list of dictionaries representing the documents associated with the resource. Defaults to an empty list. - -Returns: - ResourceCreatedResponse: An object representing the response received upon the successful creation of the resource. - -Note: - Using mutable types like list as default argument values in Python is risky because if the list is modified, - those changes will persist across subsequent calls to the function which use the default value. It is - generally safer to use `None` as a default value and then set the default inside the function if needed. - -Raises: - BeartypeException: If the input types do not match the specified function annotations. - -#### Signature - -```python -@beartype -@rewrap_in_class(User) -def create(self, **kwargs: UserCreateArgs) -> User: ... -``` - -#### See also - -- [UserCreateArgs](#usercreateargs) - -### UsersManager().delete - -[Show source in user.py:311](../../../../../../julep/managers/user.py#L311) - -Deletes a user based on the provided user ID. - -#### Arguments - -user_id (Union[str, UUID]): Unique identifier of the user. - -#### Returns - -None - -#### Notes - -This function is type-checked with `beartype` to ensure that the `user_id` -parameter matches either a string or a UUID type. - -#### Raises - -The specific exceptions raised depend on the implementation of the `_delete` -method this function proxies to. - -#### Signature - -```python -@beartype -def delete(self, user_id: Union[str, UUID]) -> None: ... -``` - -### UsersManager().get - -[Show source in user.py:235](../../../../../../julep/managers/user.py#L235) - -Retrieve a User object by its identifier. - -The method supports retrieval by both string representations of a UUID and -UUID objects directly. - -#### Arguments - -id (Union[str, UUID]): The identifier of the User, can be a string or UUID. - -#### Returns - -- `User` - The User object associated with the provided id. - -#### Raises - -- `ValueError` - If 'id' is neither a string nor a UUID. -- `NotFoundError` - If a User with the given 'id' does not exist. - -#### Signature - -```python -@beartype -def get(self, id: Union[str, UUID]) -> User: ... -``` - -### UsersManager().list - -[Show source in user.py:280](../../../../../../julep/managers/user.py#L280) - -Lists the users optionally applying limit and offset. - -#### Arguments - -- `limit` *Optional[int], optional* - The maximum number of users to return. - None means no limit. Defaults to None. -- `offset` *Optional[int], optional* - The index of the first user to return. - None means start from the beginning. Defaults to None. - -#### Returns - -- `List[User]` - A list of user objects. - -#### Raises - -- `BeartypeException` - If the type of `limit` or `offset` is not as expected. - -#### Signature - -```python -@beartype -def list( - self, - limit: Optional[int] = None, - offset: Optional[int] = None, - metadata_filter: Dict[str, Any] = {}, -) -> List[User]: ... -``` - -### UsersManager().update - -[Show source in user.py:337](../../../../../../julep/managers/user.py#L337) - -Update user information. - -This method updates user details such as the `about` text and user's `name` for a given `user_id`. - -#### Arguments - -user_id (Union[str, UUID]): The unique identifier for the user, which can be a string or a UUID object. -- `about(Optional[str],` *optional)* - The descriptive information about the user. Defaults to None, indicating that `about` should not be updated if not provided. -- `name(Optional[str],` *optional)* - The name of the user. Defaults to None, indicating that `name` should not be updated if not provided. -- `overwrite(bool,` *optional)* - Whether to overwrite the existing user data. Defaults to False. - -#### Returns - -- `ResourceUpdatedResponse` - An object indicating the outcome of the update operation, which typically includes the status of the operation and possibly the updated resource data. - -#### Signature - -```python -@beartype -@rewrap_in_class(User) -def update(self, user_id: Union[str, UUID], **kwargs: UserUpdateArgs) -> User: ... -``` - -#### See also - -- [UserUpdateArgs](#userupdateargs) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/utils/index.md b/docs/python-sdk-docs/julep/utils/index.md deleted file mode 100644 index 5a2c64b61..000000000 --- a/docs/python-sdk-docs/julep/utils/index.md +++ /dev/null @@ -1,12 +0,0 @@ -# Utils - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / Utils - -> Auto-generated documentation for [julep.utils](../../../../../../julep/utils/__init__.py) module. - -- [Utils](#utils) - - [Modules](#modules) - -## Modules - -- [Openai Patch](./openai_patch.md) \ No newline at end of file diff --git a/docs/python-sdk-docs/julep/utils/openai_patch.md b/docs/python-sdk-docs/julep/utils/openai_patch.md deleted file mode 100644 index e1aa0323e..000000000 --- a/docs/python-sdk-docs/julep/utils/openai_patch.md +++ /dev/null @@ -1,93 +0,0 @@ -# Openai Patch - -[Julep Python SDK Index](../../README.md#julep-python-sdk-index) / [Julep](../index.md#julep) / [Utils](./index.md#utils) / Openai Patch - -> Auto-generated documentation for [julep.utils.openai_patch](../../../../../../julep/utils/openai_patch.py) module. - -- [Openai Patch](#openai-patch) - - [patch_chat_acreate](#patch_chat_acreate) - - [patch_chat_create](#patch_chat_create) - - [patch_completions_acreate](#patch_completions_acreate) - - [patch_completions_create](#patch_completions_create) - -## patch_chat_acreate - -[Show source in openai_patch.py:95](../../../../../../julep/utils/openai_patch.py#L95) - -Asynchronously patches the `chat.completions.create` method of the OpenAI client. - -This function updates the `chat.completions.create` method to an asynchronous version, enabling the inclusion of additional parameters and adjustments to its behavior. - -#### Arguments - -- client (OpenAI): The OpenAI client instance to be patched. - -#### Returns - -- `-` *OpenAI* - The patched OpenAI client instance with the updated `chat.completions.create` method. - -#### Signature - -```python -def patch_chat_acreate(client: OpenAI): ... -``` - - - -## patch_chat_create - -[Show source in openai_patch.py:270](../../../../../../julep/utils/openai_patch.py#L270) - -#### Signature - -```python -def patch_chat_create(client: OpenAI): ... -``` - - - -## patch_completions_acreate - -[Show source in openai_patch.py:20](../../../../../../julep/utils/openai_patch.py#L20) - -Asynchronously patches the `completions.create` method of the OpenAI client. - -This function replaces the original `completions.create` method with a custom asynchronous version that allows for additional parameters and custom behavior. - -#### Arguments - -- client (OpenAI): The OpenAI client instance to be patched. - -#### Returns - -- `-` *OpenAI* - The patched OpenAI client instance with the modified `completions.create` method. - -#### Signature - -```python -def patch_completions_acreate(client: OpenAI): ... -``` - - - -## patch_completions_create - -[Show source in openai_patch.py:195](../../../../../../julep/utils/openai_patch.py#L195) - -Patches the `completions.create` method (non-async version) of the OpenAI client. - -This function replaces the original `completions.create` method with a custom version that supports additional parameters and custom behavior, without changing it to an asynchronous function. - -#### Arguments - -- client (OpenAI): The OpenAI client instance to be patched. - -#### Returns - -- `-` *OpenAI* - The patched OpenAI client instance with the modified `completions.create` method. - -#### Signature - -```python -def patch_completions_create(client: OpenAI): ... -``` \ No newline at end of file diff --git a/docs/reference/api_endpoints/agent_endpoints.md b/docs/reference/api_endpoints/agent_endpoints.md new file mode 100644 index 000000000..692931bb2 --- /dev/null +++ b/docs/reference/api_endpoints/agent_endpoints.md @@ -0,0 +1,74 @@ +# Agent Endpoints + +This document provides a reference for all Agent API endpoints in Julep. + +## List Agents + +- **Endpoint**: `GET /agents` +- **Description**: Retrieves a paginated list of agents. +- **Query Parameters**: + - `limit` (optional): Number of agents to return per page. + - `offset` (optional): Number of agents to skip. + +## Create a New Agent + +- **Endpoint**: `POST /agents` +- **Description**: Creates a new agent. +- **Request Body**: + ```json + { + "name": "string", + "about": "string", + "model": "string", + "instructions": ["string"] + } + ``` + +## Get an Agent + +- **Endpoint**: `GET /agents/{id}` +- **Description**: Retrieves details of a specific agent. + +## Update an Agent + +- **Endpoint**: `PUT /agents/{id}` +- **Description**: Updates an existing agent (overwrites existing values). +- **Request Body**: Same as Create a New Agent + +## Partially Update an Agent + +- **Endpoint**: `PATCH /agents/{id}` +- **Description**: Updates an existing agent (merges with existing values). +- **Request Body**: Partial agent object + +## Delete an Agent + +- **Endpoint**: `DELETE /agents/{id}` +- **Description**: Deletes a specific agent. + +## Get Agent Documents + +- **Endpoint**: `GET /agents/{id}/docs` +- **Description**: Retrieves documents associated with an agent. + +## Search Agent Documents + +- **Endpoint**: `GET /agents/{id}/search` +- **Description**: Searches documents owned by an agent. + +## Get Agent Tools + +- **Endpoint**: `GET /agents/{id}/tools` +- **Description**: Retrieves tools associated with an agent. + +## Get Agent Tasks + +- **Endpoint**: `GET /agents/{id}/tasks` +- **Description**: Retrieves tasks associated with an agent. + +## Create or Update Agent Tasks + +- **Endpoint**: `PUT /agents/{parent_id}/tasks` +- **Description**: Creates or updates tasks for an agent. + +For all endpoints, replace `{id}` or `{parent_id}` with the actual agent ID. \ No newline at end of file diff --git a/docs/reference/api_endpoints/doc_endpoints.md b/docs/reference/api_endpoints/doc_endpoints.md new file mode 100644 index 000000000..c168ecac2 --- /dev/null +++ b/docs/reference/api_endpoints/doc_endpoints.md @@ -0,0 +1,36 @@ +# Doc Endpoints + +This document provides a reference for all Doc API endpoints in Julep. + +## List Docs for a User + +- **Endpoint**: `GET /users/{id}/docs` +- **Description**: Retrieves a paginated list of documents for a specific user. +- **Query Parameters**: + - `limit` (optional): Number of documents to return per page. + - `offset` (optional): Number of documents to skip. + +## Create a New Doc for a User + +- **Endpoint**: `POST /users/{id}/docs` +- **Description**: Creates a new document for a specific user. +- **Request Body**: + ```json + { + "title": "string", + "content": "string" + } + ``` + +## Delete a Doc for a User + +- **Endpoint**: `DELETE /users/{id}/docs/{child_id}` +- **Description**: Deletes a specific document for a user. + +## List Docs for an Agent + +- **Endpoint**: `GET /agents/{id}/docs` +- **Description**: Retrieves a paginated list of documents for a specific agent. +- **Query Parameters**: + - `limit` (optional): Number of documents to return per page. + - `offset` (optional): Number of documents to skip. \ No newline at end of file diff --git a/docs/reference/api_endpoints/session_endpoints.md b/docs/reference/api_endpoints/session_endpoints.md new file mode 100644 index 000000000..f7a649594 --- /dev/null +++ b/docs/reference/api_endpoints/session_endpoints.md @@ -0,0 +1,84 @@ +# Session Endpoints + +This document provides a reference for all Session API endpoints in Julep. + +## List Sessions + +- **Endpoint**: `GET /sessions` +- **Description**: Retrieves a paginated list of sessions. +- **Query Parameters**: + - `limit` (optional): Number of sessions to return per page. + - `offset` (optional): Number of sessions to skip. + +## Create a New Session + +- **Endpoint**: `POST /sessions` +- **Description**: Creates a new session. +- **Request Body**: + ```json + { + "agent_id": "string", + "user_id": "string", + "situation": "string", + "token_budget": 4000, + "context_overflow": "truncate" + } + ``` + +## Get a Session + +- **Endpoint**: `GET /sessions/{id}` +- **Description**: Retrieves details of a specific session. + +## Update a Session + +- **Endpoint**: `PUT /sessions/{id}` +- **Description**: Updates an existing session. +- **Request Body**: Partial session object + +## Delete a Session + +- **Endpoint**: `DELETE /sessions/{id}` +- **Description**: Deletes a specific session. + +## Get Session Messages + +- **Endpoint**: `GET /sessions/{id}/messages` +- **Description**: Retrieves messages in a session. + +## Create a New Message in a Session + +- **Endpoint**: `POST /sessions/{id}/messages` +- **Description**: Adds a new message to a session. +- **Request Body**: + ```json + { + "role": "user", + "content": "string" + } + ``` + +## Get Session Tools + +- **Endpoint**: `GET /sessions/{id}/tools` +- **Description**: Retrieves tools available in a session. + +## Chat in a Session + +- **Endpoint**: `POST /sessions/{id}/chat` +- **Description**: Initiates a chat interaction in a session. +- **Request Body**: + ```json + { + "messages": [ + { + "role": "user", + "content": "string" + } + ], + "stream": false, + "max_tokens": 150 + } + ``` + +For all endpoints, replace `{id}` with the actual session ID. \ No newline at end of file diff --git a/docs/reference/api_endpoints/tool_endpoints.md b/docs/reference/api_endpoints/tool_endpoints.md new file mode 100644 index 000000000..a0aeab36a --- /dev/null +++ b/docs/reference/api_endpoints/tool_endpoints.md @@ -0,0 +1,55 @@ +# Tool Endpoints + +This document provides a reference for all Tool API endpoints in Julep. + +## List Tools for an Agent + +- **Endpoint**: `GET /agents/{id}/tools` +- **Description**: Retrieves a paginated list of tools for a specific agent. +- **Query Parameters**: + - `limit` (optional): Number of tools to return per page. + - `offset` (optional): Number of tools to skip. + +## Create a New Tool for an Agent + +- **Endpoint**: `POST /agents/{id}/tools` +- **Description**: Creates a new tool for a specific agent. +- **Request Body**: + ```json + { + "name": "string", + "type": "function", + "function": { + "description": "string", + "parameters": { + "type": "object", + "properties": { + "param_name": { + "type": "string", + "description": "string" + } + }, + "required": ["param_name"] + } + } + } + ``` + +## Update a Tool for an Agent + +- **Endpoint**: `PUT /agents/{id}/tools/{child_id}` +- **Description**: Updates an existing tool for a specific agent (overwrites existing values). +- **Request Body**: Same as Create a New Tool + +## Partially Update a Tool for an Agent + +- **Endpoint**: `PATCH /agents/{id}/tools/{child_id}` +- **Description**: Updates an existing tool for a specific agent (merges with existing values). +- **Request Body**: Partial tool object + +## Delete a Tool for an Agent + +- **Endpoint**: `DELETE /agents/{id}/tools/{child_id}` +- **Description**: Deletes a specific tool for an agent. + +For all endpoints, replace `{id}` with the actual agent ID and `{child_id}` with the actual tool ID. \ No newline at end of file diff --git a/docs/reference/api_endpoints/user_endpoints.md b/docs/reference/api_endpoints/user_endpoints.md new file mode 100644 index 000000000..9242c7167 --- /dev/null +++ b/docs/reference/api_endpoints/user_endpoints.md @@ -0,0 +1,57 @@ +# User Endpoints + +This document provides a reference for all User API endpoints in Julep. + +## List Users + +- **Endpoint**: `GET /users` +- **Description**: Retrieves a paginated list of users. +- **Query Parameters**: + - `limit` (optional): Number of users to return per page. + - `offset` (optional): Number of users to skip. + +## Create a New User + +- **Endpoint**: `POST /users` +- **Description**: Creates a new user. +- **Request Body**: + ```json + { + "name": "string", + "about": "string" + } + ``` + +## Get a User + +- **Endpoint**: `GET /users/{id}` +- **Description**: Retrieves details of a specific user. + +## Update a User + +- **Endpoint**: `PUT /users/{id}` +- **Description**: Updates an existing user (overwrites existing values). +- **Request Body**: Same as Create a New User + +## Partially Update a User + +- **Endpoint**: `PATCH /users/{id}` +- **Description**: Updates an existing user (merges with existing values). +- **Request Body**: Partial user object + +## Delete a User + +- **Endpoint**: `DELETE /users/{id}` +- **Description**: Deletes a specific user. + +## Get User Documents + +- **Endpoint**: `GET /users/{id}/docs` +- **Description**: Retrieves documents associated with a user. + +## Search User Documents + +- **Endpoint**: `GET /users/{id}/search` +- **Description**: Searches documents owned by a user. + +For all endpoints, replace `{id}` with the actual user ID. \ No newline at end of file diff --git a/docs/s1-model/capabilities/README.md b/docs/s1-model/capabilities/README.md deleted file mode 100644 index 9fc323294..000000000 --- a/docs/s1-model/capabilities/README.md +++ /dev/null @@ -1,364 +0,0 @@ ---- -description: >- - This section showcases the different use-cases that Samantha-1-Turbo has been - fine-tuned for. ---- - -# Capabilities - -The [Julep Playground](https://playground.julep.ao) offers an interface to prompt and tweak parameters different use-cases. - -## **Chain of Thought** - -Chain of Thought is a technique used to handle complex queries or solve problems that require multiple steps. It's a way to prompt the model to "think out loud" before arriving at a final solution. - -CoT can be executed by prompting some information or structure in the `thought` section and then [continuing the generation](../context-sections.md#continue-inline) inline. - -### Prompt Example - -[Model Playground Example](https://platform.julep.ai/short/XtrQd8) - -**Situation** - -
Your name is Albert.
-You are a personal math tutor who holds 2 PhDs in physics and computational math.
-You are talking to your student.
-Answer with vigour and interest.
-Explain your answers thoroughly.
-
- -**User** - -``` -Please solve for the equation `3x + 11 = 14`. I need the solution only. -``` - -**Thought**\ -Prompt the model to continue generating and come up with a response in this section. The `continue` flag has to be set to **True** with or without a prompt. - -{% hint style="info" %} -The `continue` flag is what aids generation in the final section and allows the model to "think" in the thought section before it speaks. -{% endhint %} - -{% tabs %} -{% tab title="Chat Completion" %} -{% code overflow="wrap" %} -```json -{ - "role": "system", - "name": "thought", - "content": "Let's break this down step-by-step:" - "continue": True -} -``` -{% endcode %} -{% endtab %} -{% endtabs %} - -**Response** - -The model shall attempt to solve the problem step-by-step. - -In order to generate the final answer, - -* Set `continue` to False -* Re-prompt with the completed Chain of Thought. - -
- -Python Sample Code - -{% code overflow="wrap" %} -```python -from julep import Client - -api_key = "YOUR_API_KEY" -client = Client(api_key=api_key) - -messages = [ - { - "role": "system", - "name": "situation", - "content": "Your name is Albert.\nYou are a personal math tutor who holds 2 PhDs in physics and computational math.\nYou are talking to your student.\nAnswer with vigour and interest.\nExplain your answers thoroughly.", - }, - { - "role": "user", - "name": "David", - "content": "Please solve for the equation `3x + 11 = 14`. I need the solution only.", - }, - # Thought section can have a starting prompt to guide the CoT - { - "role": "system", - "name": "thought", - "content": "Let's break this down step-by-step:", - "continue": True # Important: needs to be added to generate in the same section. - }, -] - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - temperature=0 -) - -content = chat_completion.choices[0].message.content -``` -{% endcode %} - -To generate the final answer, the model is re-prompted with it's complete thought. - -```python -messages[-1]["continue"] = False -messages[-1]["content"] = content - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - seed=42, - messages=messages, - max_tokens=300, - temperature=0.2, -) - -print("Albert:", chat_completion.choices[0].message.content) -``` - -This results in the final response: - -``` -Albert: The solution to the equation `3x + 11 = 14` is x = 1. -``` - -
- -*** - -## **Multi-participant Conversations** - -[**Model Playground Example**](https://platform.julep.ai/short/cUt9JY) - -`samantha-1-turbo` has been trained to handle multi-participant conversations as well as keep track of different perspectives of the participants. The `user` section is used to create multiple users. - -### Prompt Example - -**Situation** - -``` -You are Danny, Jacob and Anna's friend. -You are hanging out with them at a party and you overhear this conversation between them. -You will talk casually. -Make sure you respond to both Anna and Jacob when necessary. -Make sure your responses are that of a 18 year old teenager. Be casual and young in your tone -``` - -**User** - -Here one can - - - -{% code overflow="wrap" %} -```python -from julep import Client - -api_key = "YOUR_API_KEY" -client = Client(api_key=api_key) - -messages = [ - { - "role": "system", - "name": "situation", - "content": "You are Danny, Jacob and Anna's friend.\nYou are hanging out with them at a party.\nYou will talk casually.\nMake sure you respond to both Anna and Jacob when necessary.\nMake sure your responses are that of a 18 year old teenager. Be casual and young in your tone.", - }, - { - "role": "user", - "name": "Anna", - "content": "I'm feeling really anxious lately and I don't know why.", - }, - { - "role": "user", - "name": "Jacob", - "content": "Anxiety is just a sign of weakness. You need to toughen up and stop worrying so much. Have you tried just distracting yourself from your anxious thoughts with something else?", - }, -] - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - max_tokens=200, - temperature=0.2, -) - -print("Danny:", chat_completion.choices[0].message.content) -``` -{% endcode %} - -Running the above prompt chain should result in the following response. - -{% code overflow="wrap" %} -``` -Danny: Hey Anna, I'm sorry to hear you're feeling anxious. It's not a sign of weakness, though. It's actually pretty normal to feel anxious sometimes, especially when you're going through a lot of changes like we are. Have you talked to anyone about it? Maybe a counselor or a friend? And have you tried some relaxation techniques like deep breathing or meditation? They can really help. -``` -{% endcode %} - -*** - -## **Intent Detection** - -[**Playground Example**](https://playground.julep.ai/short/zACl1Y) - -Intent detection is a powerful feature to identify the purpose or goal behind a user's query. It allows for users to converse and get things done without needing to explicitly state their goals, making conversations more contextual and natural. - -It can be achieved with a combination of `information` and `thought` sections. - -In this example, there are three possible intents; _A) Shopping, B) Feedback, C) None_ and give relevant context about those intents to help the model identify those intents. - -{% code overflow="wrap" %} -```python -from julep import Client - -api_key = "YOUR_API_KEY" -client = Client(api_key=api_key) - -messages = [ - { - "role": "system", - "name": "situation", - "content": 'You are Julia, a shopping assistant for "Uniqlo", an online clothing store.\nYou will help the user shop. Help the user decide which clothes to pick.\nYou will understand the user\'s intent\n', - }, - {"role": "assistant", "name": "Julia", "content": "Hi Jacob! How can I help you?"}, - { - "role": "user", - "name": "Jacob", - "content": "Hey. I'd like to talk to a sales representative regarding my delivery experience with my last purchase.", - }, - { - "role": "system", - "name": "thought", - "content": "Following are the actions I can help the user with:\n\nA) Shopping:\nThe user is looking to shop from my catalogue and needs help in suggesting, browsing and finding clothing and accessories.\nI can use the `get_catalogue()` and `checkout()` functions\n\nB) Feedback:\nThe user wants to provide feedback for a previous order. I can use the `get_order()`, `send_feedback()` or `connect_with_rep()` functions\n\nC) None:\nI am unsure of what the user wants.\n\nBased on the conversation, user needs help with: \nAnswer:", - "continue": True, - }, -] - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - max_tokens=1, - temperature=0.2, -) -``` -{% endcode %} - -Given a dictionary mapping intent with instructions, it is possible to switch and use any suitable instruction based on the intent. - -{% code overflow="wrap" %} -```python -actions = { - "A": "As Julia, your task is to be a shopping assistant for the user {}. Be cheerful and happy.\nAsk the user important relevant questions regarding choice of clothing, occasion, taste, style preferences, inspiration and more. Make sure you are cheerful and thankful.\n\nYou have access to the `get_catalogue()` and `checkout()` functions", - "B": "As Julia, your task is to be a feedback collector from the user {}. Ask relevant questions regarding the order.\nMake sure you gather all information about the experience.\nBe extremely empathetic and regretful in case the feedback is negative.\nBe cheerful and thankful in case the feedback is positive.\n\nYou have access to the `get_order()`, `send_feedback()` or `connect_with_rep()` functions.", - "C": "As Julia, you are unsure of what the user intends to do. Convey this to the user and ask questions to understand more.", -} - -user_intent = chat_completion.choices[0].message.content - -user = "Jacob" -messages.pop() - -messages.append( - { - "role": "system", - "name": "information", - "content": actions[user_intent.lstrip()].format(user), - } -) - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - max_tokens=250, - temperature=0.2, -) - -print(chat_completion.choices[0].message.content) -``` -{% endcode %} - -{% code overflow="wrap" %} -``` -Julia: Of course, Jacob. I'd be happy to help. Could you please provide me with your order number so I can look up the details? -``` -{% endcode %} - -*** - -## Function Calling (experimental) - -_Function calling is not supported on the Playground._ - -All the models from Julep support function calling out of the box. You can describe the functions and their arguments to the model and have it intelligently choose which function to call. \ -The model generates JSON that you can use to call the function in your code. - -With the intelligently chosen function and arguments, you can call the relevant functions - -Here's an example of how to execute function calling. - -```python -from julep import Client - -api_key = "YOUR_API_KEY" -client = Client(api_key=api_key) - -functions = [ - { - "name": "get_current_weather", - "description": "Get the current weather", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA", - }, - "format": { - "type": "string", - "enum": ["celsius", "fahrenheit"], - "description": "The temperature unit to use. Infer this from the users location.", - }, - }, - "required": ["location", "format"], - }, - }, -] - -messages = [ - { - "role": "system", - "name": "situation", - "content": "You are a Weather Bot. Use functions to get information", - }, - { - "role": "user", - "name": "Alice", - "content": "What is the weather like in Delhi like today?", - }, -] - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - functions=functions, - max_tokens=250, - temperature=0, -) - -arguments = -function = - -function_to_call = globals().get(function) -result = function_to_call(**function_args) -``` - - - - - -*** diff --git a/docs/s1-model/capabilities/capabilities.md b/docs/s1-model/capabilities/capabilities.md deleted file mode 100644 index 8b183495a..000000000 --- a/docs/s1-model/capabilities/capabilities.md +++ /dev/null @@ -1,90 +0,0 @@ -# Human-like conversations - -`samantha-1-turbo` has been trained to be conversational and chatty as opposed to the robotic tone of other models like GPT, Llama or Mistral. - -It requires significantly less prompting to craft a personality and set the tone for conversations using the context sections. - -### Example - -[**Model Playground Example**](https://platform.julep.ai/short/rNnbSe) - -**Situation**\ -This section sets up _situation_ the model should enact. This prompt sets the context of the conversation. - -{% code title="" overflow="wrap" %} -``` -Your name is Jessica. -You are a stuck up Cali teenager. -You basically complain about everything. -Showing rebellion is an evolutionary necessity for you. - -You are talking to a random person. -Answer with disinterest and complete irreverence to absolutely everything. -Don't write emotions. Keep your answers short. -``` -{% endcode %} - -**Information**\ -Helps guide the conversation by setting a topic providing some facts that can be referenced later into the conversation. - -{% code overflow="wrap" %} -``` -David is currently planning to travel to San Francisco to raise some funds for his -startup, "CoffeeAI". -``` -{% endcode %} - -
- -Python Sample Code - -{% code overflow="wrap" %} -```python -from julep import Client - -api_key = "YOUR_API_KEY" -client = Client(api_key=api_key) - -messages = [ - { - "role": "system", - "name": "situation", - "content": "Your name is Jessica.\nYou are a stuck up Cali teenager.\nYou basically complain about everything.\nShowing rebellion is an evolutionary necessity for you.\n\nYou are talking to a random person.\nAnswer with disinterest and complete irreverence to absolutely everything.\nDon't write emotions. Keep your answers short.", - }, - { - "role": "system", - "name": "information", - "content": 'David is currently planning to travel to San Francisco to raise some funds for his startup, "CoffeeAI"', - }, - { - "role": "user", - "name": "David", - "content": "Hey, can you tell me how Silicon Valley is? I'm planning on moving there.", - }, -] - -chat_completion = client.chat.completions.create( - model="julep-ai/samantha-1-turbo", - messages=messages, - temperature=0.2 -) - -print("Jessica:", chat_completion.choices[0].message.content) -``` -{% endcode %} - - - -
- -
- -Complete Prompt - - - -
- - - -*** diff --git a/docs/s1-model/context-sections.md b/docs/s1-model/context-sections.md deleted file mode 100644 index bfe5e0b9b..000000000 --- a/docs/s1-model/context-sections.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -description: >- - This guide will walk you through the key components of the chat structure, - including user messages, assistant responses, situation context, thought - progression, and additional information. ---- - -# Concepts - -Samantha models use a set of defined sections to provide context, guide the conversation, and simulate a dynamic interaction. - -> **Note about the Completion API Template** -> -> The Completion API prompts use the sentinel tokens, `<|im_start|>` and `<|im_end|>` -> -> Each section of the prompt starts with `<|im_start|>` followed by the section name and ends with `<|im_end|>`. Below are examples which show how to use the Completion API with this format. - -## Sections Overview - -### **User** - -Represent user input and include the user's name and content. These messages drive the conversation and guide the model's responses. - -{% tabs %} -{% tab title="Chat Completion API" %} -```json -{ - "role": "user", - "name": "Alice", - "content": "What is the show Silicon Valley about?" -} -``` -{% endtab %} - -{% tab title="Completion API" %} -```markup -<|im_start|>user (Alice) -What is the show Silicon Valley about?<|im_end|> -``` -{% endtab %} -{% endtabs %} - -*** - -### **Assistant** - -Represents the persona given to the LLM. Assistant responses are model-generated replies that provide relevant information, advice, or guidance to users' queries. They are strictly meant to be part of the conversation with the user. - -{% tabs %} -{% tab title="Chat Completion API" %} -{% code overflow="wrap" %} -```json -{ - "role": "assistant", - "name": "Julia", - "content": "Silicon Valley is an American television show that focuses on the lives of six people who are members of a fictional startup company called \"Pied Piper.\" The show explores the challenges and triumphs the founders face while trying to navigate the complex world of technology and the cutthroat startup culture in Silicon Valley. It also offers a satirical take on the tech industry, with a focus on themes like innovation, ambition, and the pursuit of success." -} - -``` -{% endcode %} -{% endtab %} - -{% tab title="Completion API" %} -{% code overflow="wrap" %} -```markup -<|im_start|>assistant (Julia) -Silicon Valley is an American television show that focuses on the lives of six people who are members of a fictional startup company called \"Pied Piper.\" The show explores the challenges and triumphs the founders face while trying to navigate the complex world of technology and the cutthroat startup culture in Silicon Valley. It also offers a satirical take on the tech industry, with a focus on themes like innovation, ambition, and the pursuit of success.<|im_end|> -``` -{% endcode %} -{% endtab %} -{% endtabs %} - -*** - -### **Situation** - -Used to set the conversation tone with context and background. This helps the model understand the scenario. Typically, one uses this section as a _system_ prompt and to give the model a persona. - -{% tabs %} -{% tab title="Chat Completion API" %} -{% code overflow="wrap" %} -```json -{ - "role": "system", - "name": "situation", - "content": "Imagine you are J. Robert Oppenheimer, the renowned physicist known for your pivotal role in the Manhattan Project. You are meeting a new person in real life and having a conversation with him. Your responses should be short and concise mirror these characteristics. You should aim to provide answers that are not only scientifically accurate and intellectually stimulating but also demonstrate a deep understanding of the ethical and philosophical dimensions of the topics at hand. Your language should be sophisticated yet accessible, inviting engagement and reflection.", -}, -``` -{% endcode %} -{% endtab %} - -{% tab title="Completion API" %} -{% code overflow="wrap" %} -```markup -<|im_start|>situation -Imagine you are J. Robert Oppenheimer, the renowned physicist known for your pivotal role in the Manhattan Project. You are meeting a new person in real life and having a conversation with him. Your responses should be short and concise mirror these characteristics. You should aim to provide answers that are not only scientifically accurate and intellectually stimulating but also demonstrate a deep understanding of the ethical and philosophical dimensions of the topics at hand. Your language should be sophisticated yet accessible, inviting engagement and reflection.<|im_end|> -``` -{% endcode %} -{% endtab %} -{% endtabs %} - -### **Information** - -A section to store factual information and introduce context in order to enrich conversation. This section provides a way to "feed' information about the interaction that affect conversations. Provides a paradigm for RAG. - -{% tabs %} -{% tab title="Chat Completion API" %} -{% code overflow="wrap" %} -```json -{ - "role": "system", - "name": "information", - "content": "You are talking to Diwank. He has ordered his soup. He is vegetarian.", -} -``` -{% endcode %} -{% endtab %} - -{% tab title="Completion API" %} -{% code overflow="wrap" %} -```markup -<|im_start|>information -You are talking to Diwank. He has ordered his soup. He is vegetarian.<|im_end|> -``` -{% endcode %} -{% endtab %} -{% endtabs %} - -### **Thought** - -A section specifically for doing [Chain of Thought](https://arxiv.org/abs/2201.11903). This provides a way to prompt the model to _think_ before generating a final response to the user. - -{% tabs %} -{% tab title="Chat Completion API" %} -{% code overflow="wrap" %} -```json -{ - "role": "system", - "name": "thought", - "content": "I should ask him more about his food preferences and choices.", -} -``` -{% endcode %} -{% endtab %} - -{% tab title="Completion API" %} -{% code overflow="wrap" %} -```markup -<|im_start|>thought -I should ask him more about his food preferences and choices.<|im_end|> -``` -{% endcode %} -{% endtab %} -{% endtabs %} - -*** - -## Continue Inline - -Julep's API also exposes a special paradigm for allowing the model to continue generating in any context section given some prompt. - -{% code overflow="wrap" %} -```python -messages = [ - { - "role": "system", - "name": "situation", - "content": "Your name is Albert.\nYou are a personal math tutor who holds 2 PhDs in physics and computational math.\nYou are talking to your student.\nAnswer with vigour and interest.\nExplain your answers thoroughly.", - }, - { - "role": "user", - "name": "David", - "content": "Please solve for the equation `3x + 11 = 14`. I need the solution only.", - }, - {"role": "system", "name": "thought", "continue": True}, -] -``` -{% endcode %} - -With `continue` set to `True`, the model will now respond with a continued generation in the `thought` section. This is particularly useful in [Chain of Thought](capabilities/#chain-of-thought) prompting and [Intent Detection](capabilities/#intent-detection). diff --git a/docs/s1-model/overview.md b/docs/s1-model/overview.md deleted file mode 100644 index 6a4bea482..000000000 --- a/docs/s1-model/overview.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -description: >- - Samantha-1 is a series of our specially fine-tuned models for human-like - conversations and agentic capabilities. ---- - -# Overview - -## `samantha-1-turbo` - -`samantha-1-turbo` a conversational LLM, is a fine-tuned version of Mistral-7B-v0.1. - -During the fine-tuning process, 35 open-source datasets were adapted to enhance the model's capabilities. Each dataset underwent formatting and revision to not only support a conversational structure involving multiple turns and participants, but also incorporate the ability for native function calling. This enabled the conversational LLM to seamlessly integrate conversational dynamics with function execution within the same context. - -### Key Features - -* Fine-tuned for human-like conversations. -* Handles multi-turn multi-participant conversations. -* Supports function-calling. -* Special context section for embedded Chain of Thought. -* Special context section for memory management. -* More control over anthropomorphic personality. - -### Training - -Model: - -* Layers: 32 -* Hidden Size: 4096 -* Attention Heads: 32 -* Context Length: 32768 (with Sliding Window Attention) -* Vocab Size: 32032 - -Software: - -* PyTorch -* DeepSpeed -* Flash-Attention -* Axolotl - -### Context Section - -This model has the following context sections. - -* `user`: Represent the user and user input. -* `assistant`: Represents the output by the model -* `situation`: An equivalent of the `system` section in OpenAI and other models. Meant to give the background and set the conversation tone. -* `thought`: A section for doing Chain of Thought. Let's the model "think" before generating a final response in the `assistant` section. -* `information`: A section to store factual information and introduce context in order to enrich conversation. - -The model and speaker sections can optionally include a name like `me (Samantha)` or `person (Dmitry)` - -[Read more about Context Sections](overview.md#context-section) - -### Usage - -You will need an API key to inference the model. - -Samantha can be inferenced using either the Chat Completion API or Completion API. For more details check out [Quickstart](../getting-started/python-setup.md). - -{% tabs %} -{% tab title="Chat Completion API" %} -```python -messages = [ - { - "role": "system", - "name": "situation", - "content": "You are a Julia, an AI waiter. Your task is to help the guests decide their order." - }, - { - "role": "system", - "name": "information", - "content": "You are talking to Diwank. He has ordered his soup. He is vegetarian." - }, - { - "role": "system", - "name": "thought", - "content": "I should ask him more about his food preferences and choices." - } -] - -``` -{% endtab %} - -{% tab title="Completion API" %} -```python -messages = """ -<|im_start|>situation -You are a Julia, an AI waiter. Your task is to help the guests decide their order.<|im_end|> -<|im_start|>information -You are talking to Diwank. He has ordered his soup. He is vegetarian. -<|im_start|>thought -I should ask him more about his food preferences and choices.<|im_end|> -""" -``` -{% endtab %} -{% endtabs %} - -### Evaluation - -Evaluations show that training fine tuning Mistral-7B with our dataset and format does not lead to catastrophic forgetting. - -Benchmarks show that `samantha-1-turbo` retains most, if not all the qualities of Mistral with better results in EQBench and TruthfulQA, due to it's better emotional understanding and ability to use the `thought` section for more conversational questions. - -| Benchmarks | Samantha-1-Turbo | Mistral 7B | -| -------------- | ---------------- | ---------- | -| **EQBench** | 57.6% | 52.1% | -| **TruthfulQA** | 43.57% | 42.15% | -| Hellaswag | 79.07% | 81.3% | -| MMLU | 57.7% | 59.5% | -| Arc | 79% | 80% | - -*** - -## Use Cases - -* **Personal Assistants**: Create AI personal assistants with a fun and consistent personality. -* **Customer Service**: Automate customer service with a system that can remember past interactions and respond accordingly. -* **Empathetic systems**: For use cases such as therapeutic support, personal coaching, and companionship. -* **Games and Interactive Media**: Create engaging characters and interactive dialogues for games and media. -* **Community Engagement:** Connect and empower users to engage with brand communities on channels such as WhatsApp diff --git a/docs/s1-model/tutorial.md b/docs/s1-model/tutorial.md deleted file mode 100644 index 04a8e7e25..000000000 --- a/docs/s1-model/tutorial.md +++ /dev/null @@ -1,5 +0,0 @@ -# Tutorial - -{% hint style="info" %} -**Coming soon.** -{% endhint %} diff --git a/docs/tutorials/creating_your_first_agent.md b/docs/tutorials/creating_your_first_agent.md new file mode 100644 index 000000000..a21d27b1d --- /dev/null +++ b/docs/tutorials/creating_your_first_agent.md @@ -0,0 +1,48 @@ +# Creating Your First Agent + +This tutorial will guide you through the process of creating your first agent using the Julep API. + +## Step 1: Prepare the Agent Data + +Decide on the basic properties of your agent: + +```json +{ + "name": "MyFirstAgent", + "about": "A helpful assistant for general tasks", + "model": "gpt-4-turbo", + "instructions": ["Be helpful", "Be concise"] +} +``` + +## Step 2: Create the Agent + +Use the following curl command to create your agent: + +```bash +curl -X POST "https://api.julep.ai/api/agents" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "MyFirstAgent", + "about": "A helpful assistant for general tasks", + "model": "gpt-4-turbo", + "instructions": ["Be helpful", "Be concise"] + }' +``` + +## Step 3: Verify the Agent Creation + +Check if your agent was created successfully: + +```bash +curl -X GET "https://api.julep.ai/api/agents" \ + -H "Authorization: Bearer $JULEP_API_KEY" +``` + +You should see your newly created agent in the list. + +## Next Steps + +- Learn how to [manage sessions](./managing_sessions.md) with your new agent. +- Explore [integrating tools](./integrating_tools.md) to enhance your agent's capabilities. \ No newline at end of file diff --git a/docs/tutorials/integrating_tools.md b/docs/tutorials/integrating_tools.md new file mode 100644 index 000000000..16889f4a6 --- /dev/null +++ b/docs/tutorials/integrating_tools.md @@ -0,0 +1,58 @@ +# Integrating Tools + +This tutorial will show you how to integrate tools with your Julep agents. + +## Creating a User-Defined Function Tool + +Here's how to create a simple tool for sending emails: + +```bash +curl -X POST "https://api.julep.ai/api/agents/YOUR_AGENT_ID/tools" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "send_email", + "type": "function", + "function": { + "description": "Send an email to a recipient", + "parameters": { + "type": "object", + "properties": { + "to": { + "type": "string", + "description": "Recipient email address" + }, + "subject": { + "type": "string", + "description": "Email subject" + }, + "body": { + "type": "string", + "description": "Email body" + } + }, + "required": ["to", "subject", "body"] + } + } + }' +``` + +## Using Tools in Sessions + +When creating or updating a session, you can specify which tools to use: + +```bash +curl -X POST "https://api.julep.ai/api/sessions" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "agent_id": "YOUR_AGENT_ID", + "user_id": "YOUR_USER_ID", + "tools": ["send_email"] + }' +``` + +## Next Steps + +- Learn about [customizing tasks](../how-to-guides/customizing_tasks.md) to create complex workflows using tools. +- Explore [handling executions](../how-to-guides/handling_executions.md) to manage tool usage in tasks. \ No newline at end of file diff --git a/docs/tutorials/managing_sessions.md b/docs/tutorials/managing_sessions.md new file mode 100644 index 000000000..866484912 --- /dev/null +++ b/docs/tutorials/managing_sessions.md @@ -0,0 +1,51 @@ +# Managing Sessions + +This tutorial will guide you through creating and managing sessions with your Julep agents. + +## Creating a Session + +To create a new session with an agent: + +```bash +curl -X POST "https://api.julep.ai/api/sessions" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "agent_id": "YOUR_AGENT_ID", + "user_id": "YOUR_USER_ID", + "situation": "Custom situation for this session" + }' +``` + +## Interacting with a Session + +To send a message in a session: + +```bash +curl -X POST "https://api.julep.ai/api/sessions/YOUR_SESSION_ID/messages" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "role": "user", + "content": "Hello, how can you help me today?" + }' +``` + +## Managing Context Overflow + +If you're dealing with long conversations, you may need to handle context overflow: + +```bash +curl -X PUT "https://api.julep.ai/api/sessions/YOUR_SESSION_ID" \ + -H "Authorization: Bearer $JULEP_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "token_budget": 4000, + "context_overflow": "truncate" + }' +``` + +## Next Steps + +- Learn about [integrating tools](./integrating_tools.md) to enhance your sessions. +- Explore [customizing tasks](../how-to-guides/customizing_tasks.md) for more complex interactions. \ No newline at end of file diff --git a/example.py b/example.py new file mode 100644 index 000000000..ef6d6f427 --- /dev/null +++ b/example.py @@ -0,0 +1,107 @@ +from julep import Julep, AsyncJulep + +# 🔑 Initialize the Julep client +# Or alternatively, use AsyncJulep for async operations +client = Julep(api_key="your_api_key") + +################## +## 🤖 Agent 🤖 ## +################## + +# Create a research agent +agent = client.agents.create( + name="Research Agent", + about="You are a research agent designed to handle research inquiries.", + model="claude-3.5-sonnet", +) + +# 🔍 Add a web search tool to the agent +client.agents.tools.create( + agent_id=agent.id, + name="web_search", # Should be python valid variable name + description="Use this tool to research inquiries.", + integration={ + "provider": "brave", + "method": "search", + "setup": { + "api_key": "your_brave_api_key", + }, + }, +) + +################# +## 💬 Chat 💬 ## +################# + +# Start an interactive chat session with the agent +session = client.sessions.create( + agent_id=agent.id, + context_overflow="adaptive", # 🧠 Julep will dynamically compute the context window if needed +) + +# 🔄 Chat loop +while (user_input := input("You: ")) != "exit": + response = client.sessions.chat( + session_id=session.id, + message=user_input, + ) + + print("Agent: ", response.choices[0].message.content) + + +################# +## 📋 Task 📋 ## +################# + +# Create a recurring research task for the agent +task = client.tasks.create( + agent_id=agent.id, + name="Research Task", + description="Research the given topic every 24 hours.", + # + # 🛠️ Task specific tools + tools=[ + { + "name": "send_email", + "description": "Send an email to the user with the results.", + "api_call": { + "method": "post", + "url": "https://api.sendgrid.com/v3/mail/send", + "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"}, + }, + } + ], + # + # 🔢 Task main steps + main=[ + # + # Step 1: Research the topic + { + # `_` (underscore) variable refers to the previous step's output + # Here, it points to the topic input from the user + "prompt": "Look up topic '{{_.topic}}' and summarize the results.", + "tools": [{"ref": {"name": "web_search"}}], # 🔍 Use the web search tool from the agent + "unwrap": True, + }, + # + # Step 2: Send email with research results + { + "tool": "send_email", + "arguments": { + "subject": "Research Results", + "body": "'Here are the research results for today: ' + _.content", + "to": "inputs[0].email", # Reference the email from the user's input + }, + }, + # + # Step 3: Wait for 24 hours before repeating + {"sleep": "24 * 60 * 60"}, + ], +) + +# 🚀 Start the recurring task +client.executions.create(task_id=task.id, input={"topic": "Python"}) + +# 🔁 This will run the task every 24 hours, +# research for the topic "Python", and +# send the results to the user's email diff --git a/example.ts b/example.ts new file mode 100644 index 000000000..3ef4e1a91 --- /dev/null +++ b/example.ts @@ -0,0 +1,117 @@ +import Julep from '@julep/sdk'; + +// 🔑 Initialize the Julep client +const client = new Julep({ + apiKey: 'your_api_key', + environment: 'production', // or 'dev' | 'local_multi_tenant' | 'local' +}); + +async function main() { + /* + * 🤖 Agent 🤖 + */ + + // Create a research agent + const agent = await client.agents.createOrUpdate('dad00000-0000-4000-a000-000000000000', { + name: 'Research Agent', + about: 'You are a research agent designed to handle research inquiries.', + model: 'claude-3.5-sonnet', + }); + + // 🔍 Add a web search tool to the agent + await client.agents.tools.create(agent.id, { + name: 'web_search', + description: 'Use this tool to research inquiries.', + integration: { + provider: 'brave', + method: 'search', + setup: { + api_key: 'your_brave_api_key', + }, + }, + }); + + /* + * 💬 Chat 💬 + */ + + // Start an interactive chat session with the agent + const session = await client.sessions.create({ + agentId: agent.id, + contextOverflow: 'adaptive', /* 🧠 Julep will dynamically compute the context window if needed */ + }); + + // 🔄 Chat loop + const readline = require('readline').createInterface({ + input: process.stdin, + output: process.stdout, + }); + + const askQuestion = (query: string) => new Promise((resolve) => readline.question(query, resolve)); + + while (true) { + const userInput = await askQuestion('You: '); + if (userInput === 'exit') break; + + const response = await client.sessions.chat(session.id, { + message: userInput, + }); + + console.log('Agent: ', response.choices[0].message.content); + } + + readline.close(); + + /* + * 📋 Task 📋 + */ + + // Create a recurring research task for the agent + const task = await client.tasks.create(agent.id, { + name: 'Research Task', + description: 'Research the given topic every 24 hours.', + /* 🛠️ Task specific tools */ + tools: [ + { + name: 'send_email', + description: 'Send an email to the user with the results.', + apiCall: { + method: 'post', + url: 'https://api.sendgrid.com/v3/mail/send', + headers: { Authorization: 'Bearer YOUR_SENDGRID_API_KEY' }, + }, + }, + ], + /* 🔢 Task main steps */ + main: [ + // Step 1: Research the topic + { + prompt: "Look up topic '{{_.topic}}' and summarize the results.", + tools: [{ ref: { name: 'web_search' } }], /* 🔍 Use the web search tool from the agent */ + unwrap: true, + }, + // Step 2: Send email with research results + { + tool: 'send_email', + arguments: { + subject: 'Research Results', + body: "'Here are the research results for today: ' + _.content", + to: 'inputs[0].email', // Reference the email from the user's input + }, + }, + // Step 3: Wait for 24 hours before repeating + { sleep: 24 * 60 * 60 }, + ], + }); + + // 🚀 Start the recurring task + await client.executions.create(task.id, { input: { topic: 'TypeScript' } }); + + /* + * 🔁 This will run the task every 24 hours, + * research for the topic "TypeScript", and + * send the results to the user's email + */ +} + +main().catch(console.error); \ No newline at end of file diff --git a/image.png b/image.png deleted file mode 100644 index ccb8756cb1901d931b9fd98af0af4419b2b0dfc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426141 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 P_ETb>Mv+VS17HXO6P5ABMx-6Om;$31hi7H< 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Œ~)%Gi-Afg2w%05`Jj1RH>#Z?&~j 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

- ---- - -💸🤑 **宣布我们的赏金计划:** 帮助 Julep 社区修复错误并发布功能,即可获得报酬。更多详情[点击这里](https://github.com/julep-ai/julep/discussions/categories/bounty-program)。 - ---- -## 在对话历史记录、支持任何LLM、代理式工作流、集成等方面开始您的项目。 - -

-
-
探索文档 » -
-
- 报告错误 - · - 请求功能 - · - 加入我们的Discord - · - X - · - 领英 -

- - -

- NPM Version -   - PyPI - Version -   - Docker Image Version -   - GitHub License -

- ---- - -## 为什么选择 Julep? -我们构建了许多人工智能应用程序,并且了解评估数百种工具、技术和模型,然后使它们良好地配合在一起有多么困难。 - -**问题** -1. 具有记忆、知识和工具的LLM应用的门槛太高了。 -2. 通过多代理框架进行代理行为的控制很难。 - ---- -## 特性 -- **设计时状态性**: 默认情况下管理对话历史记录。使用简单的标志 `remember` 和 `recall` 来调整是否保存或检索对话历史记录。 -- **支持用户和代理**: 允许创建不同的用户 <-> 代理交互,如 `一个代理 <-> 多个用户`;`多个代理 <-> 一个用户`等。[了解更多](https://docs.julep.ai/concepts/)。 -- **内置RAG**: 添加、删除和更新文档,为LLM提供关于用户或代理的上下文,具体取决于您的用例。[在此处阅读更多](https://docs.julep.ai/guides/build-a-retrieval-augmented-generation-rag-agent)。 -- **内置90+工具**: 使用[Composio](https://docs.composio.dev/framework/julep/)本地连接您的AI应用到90+第三方应用程序。`toolset.handle_tool_calls(julep_client, session.id, response)` 将为您调用和处理工具![查看示例](https://docs.julep.ai/guides/use-julep-with-composio) -- **本地优先**: Julep 可以使用 Docker Compose 部署到生产环境。对于 k8s 的支持即将推出! -- **动态切换LLM**: 更新代理以在OpenAI、Anthropic或Ollama之间切换LLM。同时保留状态。 -- **为代理分配任务**: 定义异步执行的代理工作流,一个或多个代理无需担心超时或幻觉增多。[正在进行中](https://github.com/julep-ai/julep/discussions/387) - -> (*) 即将推出! - ---- -## 指南 -您可以在 [指南文档](https://docs.julep.ai/guides/) 中查看 Julep 的不同功能。 -1. [简单的对话机器人](https://deepnote.com/app/julep-ai-761c/Julep-Mixers-4dfff09a-84f2-4278-baa3-d1a00b88ba26) -2. [搜索代理](https://docs.julep.ai/guides/) -3. [RAG 代理](https://docs.julep.ai/guides/build-a-retrieval-augmented-generation-rag-agent) -4. [使用 Composio 的 GitHub 代理](https://docs.julep.ai/guides/use-julep-with-composio) -5. [用于视觉的 GPT 4o](https://docs.julep.ai/guides/image-+-text-with-gpt-4o) - ---- - - -## 快速开始 -### 选项1:使用 Julep 云 -我们的托管平台处于测试版! - -获取访问权限: -- 前往 https://platform.julep.ai -- 生成并添加您的 `JULEP_API_KEY` 到 `.env` 文件中 - -### 选项2:在本地安装和运行 Julep -前往 [自托管](https://docs.julep.ai/guides/self-hosting) 文档了解如何在本地运行 Julep! - -### 安装 - -``` -pip install julep -``` - -### 设置 `client` - -```py -from julep import Client -from pprint import pprint -import textwrap -import os - -base_url = os.environ.get("JULEP_API_URL") -api_key = os.environ.get("JULEP_API_KEY") - -client = Client(api_key=api_key, base_url=base_url) -``` - -### 创建代理 -代理是 LLM 设置的对象,例如模型、温度以及工具。 - -```py -agent = client.agents.create( - name="Jessica", - model="gpt-4", - tools=[] # 在此处定义工具 -) -``` - -### 创建用户 -用户是应用程序的用户对象。 - -为每个用户形成和保存记忆,许多用户可以与一个代理交谈。 - -```py -user = client.users.create( - name="Anon", - about="每天花8小时在笔记本电脑上的普通技术宅/女孩", -) -``` - ---- - -### 创建会话 -一个 "用户" 和一个 "代理" 在一个 "会话" 中进行通信。系统提示在这里。 -会话历史记录和摘要存储在一个 "会话" 中,该会话保存了对话历史记录。 - -会话范式允许许多用户与一个代理进行交互,并允许对话历史记录和记忆的分离。 - -```py -situation_prompt = """你是 Jessica。你是一个自命不凡的加州少年。 你基本上抱怨一切。 你住在洛杉矶的贝尔埃尔,必要时你会去科蒂斯高中上学。 -""" -session = client.sessions.create( - user_id=user.id, agent_id=agent.id, situation=situation_prompt -) -``` - -### 开始有状态的对话 -`session.chat` 控制 "代理" 和 "用户" 之间的通信。 - -它有两个重要的参数; -- `recall`: 检索之前的对话和记忆。 -- `remember`: 将当前的对话转换为内存存储。 - -要保持会话有状态,两者都需要设置为 `True` - -```py -user_msg = "嗨,你觉得星巴克怎么样" -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - "name": "Anon", - } - ], - recall=True, - remember=True, -) - -print("\n".join(textwrap.wrap(response.response[0][0].content, width=100))) -``` - ---- - -## API 和 SDK -要直接使用 API 或查看请求和响应格式、认证、可用端点等信息,请参阅 [API 文档](https://docs.julep.ai/api-reference/agents-api/agents-api)。 - -您也可以使用 [Postman 集合](https://god.gw.postman.com/run-collection/33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336%26entityType%3Dcollection%26workspaceId%3D183380b4-f2ac-44ef-b018-1f65dfc8256b) 进行参考。 - -### Python SDK - -要安装 Python SDK,请运行: - -```bash -pip install julep -``` - -有关使用 Python SDK 的更多信息,请参阅 [Python SDK 文档](https://docs.julep.ai/api-reference/python-sdk-docs)。 - - -### TypeScript SDK -要使用 `npm` 安装 TypeScript SDK,请运行: - -```bash -npm install @julep/sdk -``` - -有关使用 TypeScript SDK 的更多信息,请参阅 [TypeScript SDK 文档](https://docs.julep.ai/api-reference/js-sdk-docs)。 - ---- - -## 部署 -查看 [自托管指南](https://docs.julep.ai/agents/self-hosting) 以自行托管平台。 - -如果您想将 Julep 部署到生产环境中,请 [与我们通话](https://cal.com/ishitaj/15min)! - -我们将帮助您自定义平台并帮助您设置: -- 多租户 -- 反向代理以及认证和授权 -- 自托管 LLMs -- 等等 - ---- - -## 贡献 -我们欢迎社区的贡献,以帮助改进和扩展 Julep AI 平台。请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 - ---- - -## 许可证 -Julep AI 使用 Apache 2.0 许可证发布。通过使用、贡献或分发 Julep AI 平台,您同意此许可证的条款和条件。 - ---- - -## 联系和支持 -如果您有任何问题,需要帮助,或想要联系 Julep AI 团队,请使用以下渠道: - -- [Discord](https://discord.com/invite/JTSBGRZrzj):加入我们的社区论坛,讨论想法,提出问题,并从其他 Julep AI 用户和开发团队中获取帮助。 -- GitHub Issues:对于技术问题、错误报告和功能请求,请在 Julep AI GitHub 存储库上开启一个 issue。 -- 电子邮件支持:如果您需要直接向我们的支持团队寻求帮助,请发送电子邮件至 hey@julep.ai,我们会尽快回复您。 -- 关注 [X](https://twitter.com/julep_ai) & [LinkedIn](https://www.linkedin.com/company/julep-ai/) -- [与我们通话](https://cal.com/ishitaj/15min):我们想了解您正在构建什么以及我们如何调整和优化 Julep 以帮助您构建下一个 AI 应用程序。 diff --git a/v0.3_README.md b/v0.3_README.md deleted file mode 100644 index 2f9b12e9e..000000000 --- a/v0.3_README.md +++ /dev/null @@ -1,228 +0,0 @@ - -English | [中文翻译](/v0.3_README-CN.md) - -
- julep -
- -

-Start your project with conversation history, support for any LLM, agentic workflows, integrations & more. -

- -

-
- Explore the docs » -
-
- Report Bug - · - Request Feature - · - Join Our Discord - · - X - · - LinkedIn - -

- - -

- NPM Version -   - PyPI - Version -   - Docker Image Version -   - GitHub License -

- ---- -## Why Julep? -We've built a lot of AI apps and understand how difficult it is to evaluate hundreds of tools, techniques, and models, and then make them work well together. - -**The Problems** -1. The barrier to making LLM apps with memory, knowledge & tools is too high. -2. Agentic behaviour is hard to control when done through multi-agent frameworks. - ---- -## Features -- **Statefulness By Design**: Manages conversation history by default. Use simple flags; `remember` & `recall` to tune whether to save or retrieve conversation history. -- **Support for Users & Agents**: Allows creating different user <-> agent interactions like `One Agent <-> Many Users`; `Many Agents <-> One User` etc. [Read more,](https://docs.julep.ai/concepts/). -- **Built-in RAG**: Add, delete & update documents to give the LLM context about the user or an agent depending on your use case. [Read more here.](https://docs.julep.ai/guides/build-a-retrieval-augmented-generation-rag-agent) -- **90+ tools built-in**: Connect your AI app to 90+ third-party applications using [Composio](https://docs.composio.dev/framework/julep/) natively. `toolset.handle_tool_calls(julep_client, session.id, response)` will call and handle your tools for you! [See example](https://docs.julep.ai/guides/use-julep-with-composio) -- **Local-first**: Julep comes ready to be deployed to production using Docker Compose. Support for k8s coming soon! -- **Switch LLMs on the fly**: Update the Agent to switch between LLMs from OpenAI, Anthropic or Ollama. All the while preserving state. -- ***Assign Tasks to Agents**: Define agentic workflows to be executed asynchronously with one ore more without worrying about timeouts or multiplying hallucinations. [Work in progress](https://github.com/julep-ai/julep/discussions/387) - -> (*) Coming soon! - ---- -## Guides -You can view the different features of Julep in action in the [guide docs](https://docs.julep.ai/guides/). -1. [Simple Conversational Bot](https://deepnote.com/app/julep-ai-761c/Julep-Mixers-4dfff09a-84f2-4278-baa3-d1a00b88ba26) -2. [Search Agent](https://docs.julep.ai/guides/) -3. [RAG Agent](https://docs.julep.ai/guides/build-a-retrieval-augmented-generation-rag-agent) -5. [GitHub Agent with Composio](https://docs.julep.ai/guides/use-julep-with-composio) -5. [GPT 4o for Vision](https://docs.julep.ai/guides/image-+-text-with-gpt-4o) ---- - -## Quickstart -### Option 1: Use the Julep Cloud -Our hosted platform is in Beta! - -To get access: -- Head over to https://platform.julep.ai -- Generate and add your `JULEP_API_KEY` in `.env` - -### Option 2: Install and run Julep locally -Head over to docs on [self-hosting](https://docs.julep.ai/guides/self-hosting) to see how to run Julep locally! -### Installation - -``` -pip install julep -``` -### Setting up the `client` - -```py -from julep import Client -from pprint import pprint -import textwrap -import os - -base_url = os.environ.get("JULEP_API_URL") -api_key = os.environ.get("JULEP_API_KEY") - -client = Client(api_key=api_key, base_url=base_url) -``` - -### Create an agent -Agent is the object to which LLM settings like model, temperature along with tools are scoped to. -```py -agent = client.agents.create( - name="Jessica" - model="gpt-4", - tools=[] # Tools defined here -) -``` - -### Create a user -User is the object which represents the user of the application. - -Memories are formed and saved for each user and many users can talk to one agent. -```py -user = client.users.create( - name="Anon", - about="Average nerdy techbro/girl spending 8 hours a day on a laptop, -) -``` - -### Create a session -A "user" and an "agent" communicate in a "session". System prompt goes here. -Conversation history and summary are stored in a "session" which saves the conversation history. - -The session paradigm allows for; many users to interact with one agent and allow separation of conversation history and memories. - -```py -situation_prompt = """You are Jessica. You're a stuck up Cali teenager. -You basically complain about everything. You live in Bel-Air, Los Angeles and drag yourself to Curtis High School when you must. -""" -session = client.sessions.create( - user_id=user.id, agent_id=agent.id, situation=situation_prompt -) -``` - -### Start a stateful conversation -`session.chat` controls the communication between the "agent" and the "user". - -It has two important arguments; -- `recall`: Retrieves the previous conversations and memories. -- `remember`: Saves the current conversation turn into the memory store. - -To keep the session stateful, both need to be `True` - -```py -user_msg = "hey. what do u think of starbucks" -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": user_msg, - "name": "Anon", - } - ], - recall=True, - remember=True, -) - -print("\n".join(textwrap.wrap(response.response[0][0].content, width=100))) -``` ---- - -## API and SDKs -To use the API directly or to take a look at request & response formats, authentication, available endpoints and more, please refer to the [API Documentation](https://docs.julep.ai/api-reference/agents-api/agents-api) - -You can also use the [Postman Collection](https://god.gw.postman.com/run-collection/33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336%26entityType%3Dcollection%26workspaceId%3D183380b4-f2ac-44ef-b018-1f65dfc8256b) for reference. - -### Python SDK - -To install the Python SDK, run: - -```bash -pip install julep -``` -For more information on using the Python SDK, please refer to the [Python SDK documentation](https://docs.julep.ai/api-reference/python-sdk-docs). - - -### TypeScript SDK -To install the TypeScript SDK using `npm`, run: - -```bash -npm install @julep/sdk -``` - -For more information on using the TypeScript SDK, please refer to the [TypeScript SDK documentation](https://docs.julep.ai/api-reference/js-sdk-docs). - ---- - -## Deployment -Check out the [self-hosting guide](https://docs.julep.ai/agents/self-hosting) to host the platform yourself. - -If you want to deploy Julep to production, [let's hop on a call](https://cal.com/ishitaj/15min)! - -We'll help you customise the platform and help you get set up with: -- Multi-tenancy -- Reverse proxy along with authentication and authorisation -- Self-hosted LLMs -- & more - ---- -## Contributing -We welcome contributions from the community to help improve and expand the Julep AI platform. See [CONTRIBUTING.md](CONTRIBUTING.md) - ---- -## License -Julep AI is released under the Apache 2.0 License. By using, contributing to, or distributing the Julep AI platform, you agree to the terms and conditions of this license. - ---- -## Contact and Support -If you have any questions, need assistance, or want to get in touch with the Julep AI team, please use the following channels: - -- [Discord](https://discord.com/invite/JTSBGRZrzj): Join our community forum to discuss ideas, ask questions, and get help from other Julep AI users and the development team. -- GitHub Issues: For technical issues, bug reports, and feature requests, please open an issue on the Julep AI GitHub repository. -- Email Support: If you need direct assistance from our support team, send an email to hey@julep.ai, and we'll get back to you as soon as possible. -- Follow for updates on [X](https://twitter.com/julep_ai) & [LinkedIn](https://www.linkedin.com/company/julep-ai/) -- [Hop on a call](https://cal.com/ishitaj/15min): We wanna know what you're building and how we can tweak and tune Julep to help you build your next AI app. From a2291f5abd1cc85a694e7aff857f0ca73f9df9fe Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 30 Sep 2024 14:59:12 -0400 Subject: [PATCH 014/113] feat: Update README social banner and bake-push-to-hub.yml (#537) --- .github/workflows/bake-push-to-hub.yml | 2 +- README-CN.md | 4 ++-- README.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/bake-push-to-hub.yml b/.github/workflows/bake-push-to-hub.yml index 9a5be0c90..e25436c5d 100644 --- a/.github/workflows/bake-push-to-hub.yml +++ b/.github/workflows/bake-push-to-hub.yml @@ -8,7 +8,7 @@ on: tags: - "v*" release: - types: [published] + types: [published, released, prereleased] jobs: Bake-Push-Images: diff --git a/README-CN.md b/README-CN.md index ddf5e10ee..22bd8cb81 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,7 +1,7 @@ [English](README.md) | 中文
- julep + julep

@@ -634,4 +634,4 @@ results = client.documents.search( ## 致谢 -我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 \ No newline at end of file +我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 diff --git a/README.md b/README.md index 9f9fdafd6..71d87b6b3 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ The **Quick Start Guide Focused README** is the most promising for optimizing th English | [中文翻译](/README-CN.md)

- julep + julep

@@ -754,4 +754,4 @@ This project is licensed under the [Apache License 2.0](https://github.com/julep ## Acknowledgements -We would like to express our gratitude to all contributors and the open-source community for their valuable resources and contributions. \ No newline at end of file +We would like to express our gratitude to all contributors and the open-source community for their valuable resources and contributions. From aaea24ee0d87d13e756476a62ef98276c9e81fc9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 00:30:59 +0530 Subject: [PATCH 015/113] Update changelog for v1.0.0-alpha1 (#538) Co-authored-by: creatorrr --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f0fee2b0..80bdebaed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ + +# [v1.0.0-alpha1](https://github.com/julep-ai/julep/releases/tag/v1.0.0-alpha1) - 30 Sep 2024 + +## What's Changed +* doc: v1.0 docs by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/527 +* feat: Update README social banner and bake-push-to-hub.yml by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/537 + + +**Full Changelog**: https://github.com/julep-ai/julep/compare/v0.4.1...v1.0.0-alpha1 + +[Changes][v1.0.0-alpha1] + + + +# [v0.4.1](https://github.com/julep-ai/julep/releases/tag/v0.4.1) - 28 Sep 2024 + +## What's Changed +* Update changelog for v0.4.0 by [@github-actions](https://github.com/github-actions) in https://github.com/julep-ai/julep/pull/531 +* fix: Bake on release as well by [@creatorrr](https://github.com/creatorrr) in https://github.com/julep-ai/julep/pull/532 + +## New Contributors +* [@github-actions](https://github.com/github-actions) made their first contribution in https://github.com/julep-ai/julep/pull/531 + +**Full Changelog**: https://github.com/julep-ai/julep/compare/v0.4.0...v0.4.1 + +[Changes][v0.4.1] + + # [v0.4.0](https://github.com/julep-ai/julep/releases/tag/v0.4.0) - 28 Sep 2024 @@ -248,6 +276,8 @@ [Changes][v0.2.12] +[v1.0.0-alpha1]: https://github.com/julep-ai/julep/compare/v0.4.1...v1.0.0-alpha1 +[v0.4.1]: https://github.com/julep-ai/julep/compare/v0.4.0...v0.4.1 [v0.4.0]: https://github.com/julep-ai/julep/compare/v0.3.4...v0.4.0 [v0.3.4]: https://github.com/julep-ai/julep/compare/v0.3.3...v0.3.4 [v0.3.3]: https://github.com/julep-ai/julep/compare/v0.3.2...v0.3.3 From 654f082ff29555a565e83dfa2cec150dc572d986 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 30 Sep 2024 15:42:12 -0400 Subject: [PATCH 016/113] Create bandit-security-check-python-agents-api.yml (#534) - **Workflow Addition**: - Adds `bandit-security-check-python-agents-api.yml` to `.github/workflows/`. - Triggers on pull requests to the `main` branch. - **Security Check**: - Uses `mdegis/bandit-action@v1.1` to check Python code in `./agents-api/agents_api`. - Configured with `level: high` and `confidence: high`. - `exit_zero: true` allows workflow to pass even if issues are found. --- ...bandit-security-check-python-agents-api.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/bandit-security-check-python-agents-api.yml diff --git a/.github/workflows/bandit-security-check-python-agents-api.yml b/.github/workflows/bandit-security-check-python-agents-api.yml new file mode 100644 index 000000000..9ae06e3ca --- /dev/null +++ b/.github/workflows/bandit-security-check-python-agents-api.yml @@ -0,0 +1,18 @@ +on: + pull_request: + branches: + - main + +jobs: + bandit_check: + name: bandit check security of python code in agents-api + runs-on: ubuntu-latest + + steps: + - uses: mdegis/bandit-action@v1.1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + path: "./agents-api/agents_api" + level: high + confidence: high + # exit_zero: true From bcd276412e6d7d17c7d3b5b4c89aa2920b27b3ab Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 30 Sep 2024 15:48:47 -0400 Subject: [PATCH 017/113] fix: Fix version in bandit-security-check-python-agents-api.yml (#539) - **Workflow Configuration**: - Adds `dev` branch to trigger `bandit-security-check-python-agents-api.yml` workflow. - Updates Bandit action version from `v1.1` to `v1.0.1` in the workflow. --- .github/workflows/bandit-security-check-python-agents-api.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/bandit-security-check-python-agents-api.yml b/.github/workflows/bandit-security-check-python-agents-api.yml index 9ae06e3ca..f2981efbc 100644 --- a/.github/workflows/bandit-security-check-python-agents-api.yml +++ b/.github/workflows/bandit-security-check-python-agents-api.yml @@ -2,6 +2,7 @@ on: pull_request: branches: - main + - dev jobs: bandit_check: @@ -9,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: mdegis/bandit-action@v1.1 + - uses: mdegis/bandit-action@v1.0.1 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} path: "./agents-api/agents_api" From fd7d740751471f6b1b910fdef1f03e94e30b8ffb Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Tue, 1 Oct 2024 06:42:57 +0530 Subject: [PATCH 018/113] Update README.md --- docs/README.md | 602 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 587 insertions(+), 15 deletions(-) diff --git a/docs/README.md b/docs/README.md index 475e4d290..6b030fc50 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,5 @@ --- -description: Get started with Julep +description: Introducing Julep layout: title: visible: true @@ -13,26 +13,598 @@ layout: visible: true --- -# Introduction +***** +> ### This docs site is currently under construction although this github README below should suffice for now. -Julep is a platform for developing stateful and functional LLM-powered applications. +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** -## Why Julep? +## Introduction -We've built a lot of AI apps and understand how difficult it is to evaluate hundreds of tools, techniques, and models, and then make them work well together. +Julep is an open-source platform for creating persistent AI agents with customizable workflows. It provides tools to develop, manage, and deploy AI-driven applications, focusing on flexibility and ease of use. -**The Problems** +With Julep, you can: +- Quickly develop AI agents that retain context and state across interactions +- Design and execute sophisticated workflows tailored to your AI agents +- Seamlessly integrate various tools and APIs into your AI workflows +- Effortlessly manage persistent sessions and user interactions -1. The barrier to making LLM apps with memory, knowledge & tools is too high. -2. Agentic behavior is hard to control when done through multi-agent frameworks. +Whether you're developing a chatbot, automating tasks, or building a complex AI assistant, Julep provides the flexibility and features you need to turn your ideas into reality swiftly and efficiently. + + + +

+Here's a quick python example: + + + +

+from julep import Julep, AsyncJulep
+
+# 🔑 Initialize the Julep client
+#     Or alternatively, use AsyncJulep for async operations
+client = Julep(api_key="your_api_key")
+
+##################
+## 🤖 Agent 🤖 ##
+##################
+
+# Create a research agent
+agent = client.agents.create(
+    name="Research Agent",
+    model="claude-3.5-sonnet",
+    about="You are a research agent designed to handle research inquiries.",
+)
+
+# 🔍 Add a web search tool to the agent
+client.agents.tools.create(
+    agent_id=agent.id,
+    name="web_search",  # Should be python valid variable name
+    description="Use this tool to research inquiries.",
+    integration={
+        "provider": "brave",
+        "method": "search",
+        "setup": {
+            "api_key": "your_brave_api_key",
+        },
+    },
+)
+
+#################
+## 💬 Chat 💬 ##
+#################
+
+# Start an interactive chat session with the agent
+session = client.sessions.create(
+    agent_id=agent.id,
+    context_overflow="adaptive",  # 🧠 Julep will dynamically compute the context window if needed
+)
+
+# 🔄 Chat loop
+while (user_input := input("You: ")) != "exit":
+    response = client.sessions.chat(
+        session_id=session.id,
+        message=user_input,
+    )
+
+    print("Agent: ", response.choices[0].message.content)
+
+
+#################
+## 📋 Task 📋 ##
+#################
+
+# Create a recurring research task for the agent
+task = client.tasks.create(
+    agent_id=agent.id,
+    name="Research Task",
+    description="Research the given topic every 24 hours.",
+    #
+    # 🛠️ Task specific tools
+    tools=[
+        {
+            "name": "send_email",
+            "description": "Send an email to the user with the results.",
+            "api_call": {
+                "method": "post",
+                "url": "https://api.sendgrid.com/v3/mail/send",
+                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
+            },
+        }
+    ],
+    #
+    # 🔢 Task main steps
+    main=[
+        #
+        # Step 1: Research the topic
+        {
+            # `_` (underscore) variable refers to the previous step's output
+            # Here, it points to the topic input from the user
+            "prompt": "Look up topic '{{_.topic}}' and summarize the results.",
+            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 Use the web search tool from the agent
+            "unwrap": True,
+        },
+        #
+        # Step 2: Send email with research results
+        {
+            "tool": "send_email",
+            "arguments": {
+                "subject": "Research Results",
+                "body": "'Here are the research results for today: ' + _.content",
+                "to": "inputs[0].email",  # Reference the email from the user's input
+            },
+        },
+        #
+        # Step 3: Wait for 24 hours before repeating
+        {"sleep": "24 * 60 * 60"},
+    ],
+)
+
+# 🚀 Start the recurring task
+client.executions.create(task_id=task.id, input={"topic": "Python"})
+
+# 🔁 This will run the task every 24 hours,
+#    research for the topic "Python", and
+#    send the results to the user's email
+
+
-{% embed url="https://youtu.be/LhQMBAehL_Q" %} ## Features -* **Statefulness By Design**: Manages context by default. Uses [CozoDB](https://cozodb.org/) to save & retrieve conversation history, OpenAPI specification tools & documents. -* **Support for Users & Agents**: Allows creating different user <--> agent interactions like `One Agent <-> Many Users`; etc. Read more: [Broken link](broken-reference "mention") -* **Use and switch between any LLMs anytime**: Switch and use different LLMs, providers, and models, self-hosted or otherwise. -* **90+ tools built-in**: Connect your AI app to 150+ third-party applications using [Composio](https://docs.composio.dev/framework/julep/) natively. -* **Production-ready**: Julep comes ready to be deployed to production using Docker Compose. Support for k8s coming soon! -* **GitHub Actions-like workflows for tasks**: Define agentic workflows to be executed asynchronously with one or more without worrying about timeouts or multiplying hallucinations. (coming soon!) +Julep simplifies the process of building persistent AI agents with customizable workflows. Key features include: + +- **Persistent AI Agents**: Create and manage AI agents that maintain context across interactions. +- **Customizable Workflows**: Design complex, multi-step AI workflows using Tasks. +- **Tool Integration**: Seamlessly integrate various tools and APIs into your AI workflows. +- **Document Management**: Efficiently manage and search through documents for your agents. +- **Session Management**: Handle persistent sessions for continuous interactions. +- **Flexible Execution**: Support for parallel processing, conditional logic, and error handling in workflows. + +## Installation + +To get started with Julep, install it using [npm](https://www.npmjs.com/package/@julep/sdk) or [pip](https://pypi.org/project/julep/): + +```bash +npm install @julep/sdk +``` + +or + +```bash +pip install julep +``` + +> [!TIP] +> ~~Get your API key [here](https://app.julep.ai/api-keys).~~ +> +> While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. + +## Quick Start Guide + +### Step 1: Import Julep + +First, import the Julep SDK into your project: + +```javascript +const Julep = require('@julep/sdk'); +``` + +or + +```python +from julep import AsyncJulep +``` + +### Step 2: Initialize the Agent + +Create a new agent with basic settings: + +```javascript +const julep = new Julep({ apiKey: 'your-api-key' }); + +const agent = await julep.agents.create({ + name: 'ResearchAssistant', + model: 'gpt-4-turbo', + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +}); +``` + +or + +```python +client = AsyncJulep(api_key="your_api_key") + +agent = await client.agents.create( + name="Storytelling Agent", + model="gpt-4-turbo", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +) +``` + +### Step 3: Chat with the Agent + +Start an interactive chat session with the agent: + +```javascript +const session = await julep.sessions.create({ + agentId: agent.id, +}); + +// Send messages to the agent +const response = await julep.sessions.chat({ + sessionId: session.id, + message: 'Hello, can you tell me a story?', +}); + +console.log(response); +``` + +or + +```python +session = await client.sessions.create(agent_id=agent.id) + +# Send messages to the agent +response = await client.sessions.chat( + session_id=session.id, + message="Hello, can you tell me a story?", +) + +print(response) +``` + + +### Step 4: Create a multi-step Task + +Let's define a multi-step task to create a story and generate a paneled comic strip based on an input idea: + +```python +# 🛠️ Add an image generation tool (DALL·E) to the agent +await client.agents.tools.create( + agent_id=agent.id, + name="image_generator", + description="Use this tool to generate images based on descriptions.", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_dalle_api_key", + }, + }, +) + +# 📋 Task +# Create a task that takes an idea and creates a story and a 4-panel comic strip +task = await client.tasks.create( + agent_id=agent.id, + name="Story and Comic Creator", + description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.", + main=[ + # Step 1: Generate a story and outline into 4 panels + { + "prompt": [ + { + "role": "system", + "content": "You are {{agent.name}}. {{agent.about}}" + }, + { + "role": "user", + "content": ( + "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. " + "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story." + ), + }, + ], + "unwrap": True, + }, + # Step 2: Extract the panel descriptions and story + { + "evaluate": { + "story": "_.split('1. ')[0].strip()", + "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", + } + }, + # Step 3: Generate images for each panel using the image generator tool + { + "foreach": { + "in": "_.panels", + "do": { + "tool": "image_generator", + "arguments": { + "description": "_", + }, + }, + }, + }, + # Step 4: Generate a catchy title for the story + { + "prompt": [ + { + "role": "system", + "content": "You are {{agent.name}}. {{agent.about}}" + }, + { + "role": "user", + "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}", + }, + ], + "unwrap": True, + }, + # Step 5: Return the story, the generated images, and the title + { + "return": { + "title": "outputs[3]", + "story": "outputs[1].story", + "comic_panels": "[output.image.url for output in outputs[2]]", + } + }, + ], +) +``` + +> [!TIP] +> node.js version of this is similar. + +### Step 5: Execute the Task + +```python +# 🚀 Execute the task with an input idea +execution = await client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} +) + +# 🎉 Watch as the story and comic panels are generated +await client.executions.stream(execution_id=execution.id) +``` + +This example demonstrates how to create an agent with a custom tool, define a complex task with multiple steps, and execute it to generate a creative output. + + + +> [!TIP] +> You can find another node.js example [here](example.ts) or python example [here](example.py). + +## Concepts + +Julep is built on several key technical components that work together to create powerful AI workflows: + +### Agents +AI-powered entities backed by large language models (LLMs) that execute tasks and interact with users. Agents are the core functional units of Julep. + +```mermaid +graph TD + Agent[Agent] --> LLM[Large Language Model] + Agent --> Tasks[Tasks] + Agent --> Users[Users] + Tasks --> Tools[Tools] +``` + +### Users +Entities that interact with agents. Users can be associated with sessions and have their own metadata, allowing for personalized interactions. + +```mermaid +graph LR + User[User] --> Sessions[Sessions] + Sessions --> Agents[Agents] + Sessions --> Metadata[Metadata] +``` + +### Sessions +Stateful interactions between agents and users. Sessions maintain context across multiple exchanges and can be configured for different behaviors, including context management and overflow handling. + +```mermaid +graph LR + Sessions[Sessions] --> Agents[Agents] + Sessions --> Users[Users] + Sessions --> ContextManagement[Context Management] + Sessions --> OverflowHandling[Overflow Handling] +``` + +### Tasks +Multi-step, programmatic workflows that agents can execute. Tasks define complex operations and can include various types of steps, such as prompts, tool calls, and conditional logic. + +```mermaid +graph TD + Tasks[Tasks] --> Steps[Workflow Steps] + Steps --> Prompt[Prompt] + Steps --> ToolCalls[Tool Calls] + Steps --> ConditionalLogic[Conditional Logic] +``` + +### Tools +Integrations that extend an agent's capabilities. Tools can be user-defined functions, system tools, or third-party API integrations. They allow agents to perform actions beyond text generation. + +```mermaid +graph LR + Tools[Tools] --> UserDefinedFunctions[User-Defined Functions] + Tools --> SystemTools[System Tools] + Tools --> ThirdPartyAPIs[Third-Party APIs] +``` + +### Documents +Text or data objects that can be associated with agents or users. Documents are vectorized and stored in a vector database, enabling semantic search and retrieval during agent interactions. + +```mermaid +graph LR + Documents[Documents] --> VectorDatabase[Vector Database] + Documents --> SemanticSearch[Semantic Search] + Documents --> AgentsOrUsers[Agents or Users] +``` + +### Executions +Instances of tasks that have been initiated with specific inputs. Executions have their own lifecycle and state machine, allowing for monitoring, management, and resumption of long-running processes. + +```mermaid +graph LR + Executions[Executions] --> Tasks[Tasks] + Executions --> Lifecycle[Lifecycle] + Executions --> Monitoring[Monitoring] + Executions --> Management[Management] + Executions --> Resumption[Resumption] +``` + +For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md). + +## Understanding Tasks + +Tasks are the core of Julep's workflow system. They allow you to define complex, multi-step AI workflows that your agents can execute. Here's a brief overview of task components: + +- **Name and Description**: Each task has a unique name and description for easy identification. +- **Main Steps**: The core of a task, defining the sequence of actions to be performed. +- **Tools**: Optional integrations that extend the capabilities of your agent during task execution. + +### Types of Workflow Steps + +Tasks in Julep can include various types of steps: + +1. **Prompt**: Send a message to the AI model and receive a response. + ```python + {"prompt": "Analyze the following data: {{data}}"} + ``` + +2. **Tool Call**: Execute an integrated tool or API. + ```python + {"tool": "web_search", "arguments": {"query": "Latest AI developments"}} + ``` + +3. **Evaluate**: Perform calculations or manipulate data. + ```python + {"evaluate": {"average_score": "sum(scores) / len(scores)"}} + ``` + +4. **Conditional Logic**: Execute steps based on conditions. + ```python + {"if": "score > 0.8", "then": [...], "else": [...]} + ``` + +5. **Loops**: Iterate over data or repeat steps. + ```python + {"foreach": {"in": "data_list", "do": [...]}} + ``` + +| Step Name | Description | Input | +|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------| +| **Prompt** | Send a message to the AI model and receive a response. | Prompt text or template | +| **Tool Call** | Execute an integrated tool or API. | Tool name and arguments | +| **Evaluate** | Perform calculations or manipulate data. | Expressions or variables to evaluate | +| **Wait for Input** | Pause workflow until input is received. | Any required user or system input | +| **Log** | Log a specified value or message. | Message or value to log | +| **Embed** | Embed text into a specific format or system. | Text or content to embed | +| **Search** | Perform a document search based on a query. | Search query | +| **Get** | Retrieve a value from a key-value store. | Key identifier | +| **Set** | Assign a value to a key in a key-value store. | Key and value to assign | +| **Parallel** | Run multiple steps in parallel. | List of steps to execute simultaneously | +| **Foreach** | Iterate over a collection and perform steps for each item. | Collection or list to iterate over | +| **MapReduce** | Map over a collection and reduce the results based on an expression. | Collection to map and reduce expressions | +| **If Else** | Conditional execution of steps based on a condition. | Condition to evaluate | +| **Switch** | Execute steps based on multiple conditions, similar to a switch-case statement. | Multiple conditions and corresponding steps | +| **Yield** | Run a subworkflow and await its completion. | Subworkflow identifier and input data | +| **Error** | Handle errors by specifying an error message. | Error message or handling instructions | +| **Sleep** | Pause the workflow for a specified duration. | Duration (seconds, minutes, etc.) | +| **Return** | Return a value from the workflow. | Value to return | + +For detailed information on each step type and advanced usage, please refer to our [Task Documentation](https://docs.julep.ai/tasks). + +## Advanced Features + +Julep offers a range of advanced features to enhance your AI workflows: + +### Adding Tools to Agents + +Extend your agent's capabilities by integrating external tools and APIs: + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "google", + "method": "search", + "setup": {"api_key": "your_google_api_key"}, + }, +) +``` + +### Managing Sessions and Users + +Julep provides robust session management for persistent interactions: + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id="user123", + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + message="Follow up on our previous conversation." +) +``` + +### Document Integration and Search + +Easily manage and search through documents for your agents: + +```python +# Upload a document +document = client.documents.create( + file="path/to/document.pdf", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.documents.search( + query="AI advancements", + filter={"category": "research_paper"} +) +``` + +For more advanced features and detailed usage, please refer to our [Advanced Features Documentation](https://docs.julep.ai/advanced-features). + +## SDK Reference + +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## API Reference + +Explore our comprehensive API documentation to learn more about agents, tasks, and executions: + +- [Agents API](https://api.julep.ai/api/docs#tag/agents) +- [Tasks API](https://api.julep.ai/api/docs#tag/tasks) +- [Executions API](https://api.julep.ai/api/docs#tag/executions) + +## Examples and Tutorials + +Discover example projects and tutorials to help you get started and build upon provided examples: + +- [Example Projects](https://github.com/julep-ai/julep/tree/main/examples) +- [Tutorials](https://docs.julep.ai/tutorials) + +## Contributing + +We welcome contributions to the project! Learn how to contribute and our code of conduct: + +- [Contributing Guidelines](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) +- [Code of Conduct](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) + +## Support and Community + +Join our community to get help, ask questions, and share your ideas: + +- [Discord](https://discord.com/invite/JTSBGRZrzj) +- [GitHub Discussions](https://github.com/julep-ai/julep/discussions) +- [Twitter](https://twitter.com/julep_ai) + +## License + +This project is licensed under the [Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE). + +## Acknowledgements + +We would like to express our gratitude to all contributors and the open-source community for their valuable resources and contributions. From dbaa0b016ab490939b157ec3f9ee96daa1c12974 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Tue, 1 Oct 2024 18:09:07 +0300 Subject: [PATCH 019/113] feat(integrations-service): Add new integrations & refactor integrations service (#540) Add new integrations for Brave, BrowserBase, and Spider, and refactor the integration service to support these changes. - **Integrations**: - Add new providers: `brave`, `browserbase`, and `spider` in `providers.py`. - Refactor existing providers: `wikipedia`, `weather`, `hacker_news`. - **Models**: - Add `BraveSearchSetup`, `BraveSearchArguments`, `BraveSearchOutput` in `brave.py`. - Add `BrowserBaseSetup`, `BrowserBaseLoadArguments`, `BrowserBaseLoadOutput` in `browserbase.py`. - Add `SpiderSetup`, `SpiderFetchArguments`, `SpiderFetchOutput` in `spider.py`. - Update `ExecutionRequest`, `ExecutionResponse` in `execution.py` to include new providers. - **Routers**: - Add `get_integration` in `get_integration.py`. - Add `get_integration_tool` in `get_integration_tool.py`. - Update `execute` in `execute.py` to handle new providers and methods. - **Utilities**: - Refactor `execute_integration` in `execute_integration.py` to dynamically load and execute provider methods. - Add integration logic for new providers in `integrations/utils/integrations/`. - **Misc**: - Update `pyproject.toml` to include new dependencies: `spider-client`, `browserbase`. - Update `scalars.tsp` and `models.tsp` to include new integration providers. --- agents-api/agents_api/autogen/Tools.py | 26 +- agents-api/agents_api/clients/integrations.py | 2 +- .../integrations/models/__init__.py | 31 +- .../integrations/models/base_models.py | 36 ++ .../integrations/models/brave.py | 19 + .../integrations/models/browserbase.py | 29 ++ .../integrations/models/execution.py | 50 +++ .../integrations/models/hacker_news.py | 16 +- .../integrations/models/request.py | 0 .../integrations/models/spider.py | 21 + .../integrations/models/weather.py | 18 +- .../integrations/models/wikipedia.py | 18 +- .../integrations/providers.py | 144 +++++++ .../integrations/routers/execution/execute.py | 32 +- .../routers/integrations/__init__.py | 1 + .../routers/integrations/get_integration.py | 23 + .../integrations/get_integration_tool.py | 44 +- .../routers/integrations/get_integrations.py | 103 ++--- .../integrations/utils/execute_integration.py | 57 ++- .../utils/integrations/__init__.py | 11 +- .../integrations/utils/integrations/brave.py | 19 + .../utils/integrations/browserbase.py | 27 ++ .../utils/integrations/hacker_news.py | 19 +- .../utils/integrations/request.py | 0 .../integrations/utils/integrations/spider.py | 28 ++ .../utils/integrations/weather.py | 13 +- .../utils/integrations/wikipedia.py | 15 +- integrations-service/poetry.lock | 405 ++++++++++-------- integrations-service/pyproject.toml | 3 + typespec/common/scalars.tsp | 7 +- typespec/tools/models.tsp | 2 +- 31 files changed, 847 insertions(+), 372 deletions(-) create mode 100644 integrations-service/integrations/models/base_models.py create mode 100644 integrations-service/integrations/models/brave.py create mode 100644 integrations-service/integrations/models/browserbase.py create mode 100644 integrations-service/integrations/models/execution.py create mode 100644 integrations-service/integrations/models/request.py create mode 100644 integrations-service/integrations/models/spider.py create mode 100644 integrations-service/integrations/providers.py create mode 100644 integrations-service/integrations/routers/integrations/get_integration.py create mode 100644 integrations-service/integrations/utils/integrations/brave.py create mode 100644 integrations-service/integrations/utils/integrations/browserbase.py create mode 100644 integrations-service/integrations/utils/integrations/request.py create mode 100644 integrations-service/integrations/utils/integrations/spider.py diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index c5a100cca..c2d4199a2 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -89,14 +89,18 @@ class IntegrationDef(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - provider: Literal[ - "dummy", - "dalle_image_generator", - "duckduckgo_search", - "hacker_news", - "weather", - "wikipedia", - ] + provider: ( + Literal[ + "dummy", + "hacker_news", + "weather", + "wikipedia", + "spider", + "brave", + "browserbase", + ] + | str + ) """ The provider of the integration """ @@ -129,12 +133,14 @@ class IntegrationDefUpdate(BaseModel): provider: ( Literal[ "dummy", - "dalle_image_generator", - "duckduckgo_search", "hacker_news", "weather", "wikipedia", + "spider", + "brave", + "browserbase", ] + | str | None ) = None """ diff --git a/agents-api/agents_api/clients/integrations.py b/agents-api/agents_api/clients/integrations.py index 489db1f54..5423fb664 100644 --- a/agents-api/agents_api/clients/integrations.py +++ b/agents-api/agents_api/clients/integrations.py @@ -19,7 +19,7 @@ async def run_integration_service( slug = f"{provider}/{method}" if method else provider url = f"{integration_service_url}/execute/{slug}" - setup = setup or {} + setup = setup or None async with AsyncClient() as client: response = await client.post( diff --git a/integrations-service/integrations/models/__init__.py b/integrations-service/integrations/models/__init__.py index 5efd3c797..9f7fb6992 100644 --- a/integrations-service/integrations/models/__init__.py +++ b/integrations-service/integrations/models/__init__.py @@ -1,17 +1,18 @@ -from .dalle_image_generator import ( - DalleImageGeneratorArguments, - DalleImageGeneratorSetup, +from .base_models import ( + BaseArguments, + BaseOutput, + BaseProvider, + BaseProviderMethod, + BaseSetup, + ProviderInfo, ) -from .duckduckgo_search import DuckDuckGoSearchExecutionArguments -from .hacker_news import HackerNewsExecutionArguments - -# TODO: Move these models somewhere else -from .models import ( - ExecuteIntegrationArguments, - ExecuteIntegrationSetup, - IntegrationDef, - IntegrationExecutionRequest, - IntegrationExecutionResponse, +from .brave import BraveSearchArguments, BraveSearchOutput, BraveSearchSetup +from .browserbase import ( + BrowserBaseLoadArguments, + BrowserBaseLoadOutput, + BrowserBaseSetup, ) -from .weather import WeatherExecutionArguments, WeatherExecutionSetup -from .wikipedia import WikipediaExecutionArguments +from .hacker_news import HackerNewsFetchArguments, HackerNewsFetchOutput +from .spider import SpiderFetchArguments, SpiderFetchOutput, SpiderSetup +from .weather import WeatherGetArguments, WeatherGetOutput, WeatherSetup +from .wikipedia import WikipediaSearchArguments, WikipediaSearchOutput diff --git a/integrations-service/integrations/models/base_models.py b/integrations-service/integrations/models/base_models.py new file mode 100644 index 000000000..72e250365 --- /dev/null +++ b/integrations-service/integrations/models/base_models.py @@ -0,0 +1,36 @@ +from typing import Annotated, Any, Optional + +from pydantic import BaseModel, Field, RootModel +from pydantic_core import Url + +IdentifierName = Annotated[str, Field(max_length=40, pattern="^[^\\W0-9]\\w*$")] + + +class BaseSetup(BaseModel): ... + + +class BaseArguments(BaseModel): ... + + +class BaseOutput(BaseModel): ... + + +class ProviderInfo(BaseModel): + url: Optional[Url] + docs: Optional[Url] + icon: Optional[Url] + friendly_name: str + + +class BaseProviderMethod(BaseModel): + method: IdentifierName + description: str + arguments: type[BaseArguments] + output: type[BaseOutput] + + +class BaseProvider(BaseModel): + provider: IdentifierName + setup: type[BaseSetup] | None + methods: list[BaseProviderMethod] + info: ProviderInfo diff --git a/integrations-service/integrations/models/brave.py b/integrations-service/integrations/models/brave.py new file mode 100644 index 000000000..bbf3ca077 --- /dev/null +++ b/integrations-service/integrations/models/brave.py @@ -0,0 +1,19 @@ +from pydantic import Field + +from .base_models import ( + BaseArguments, + BaseOutput, + BaseSetup, +) + + +class BraveSearchSetup(BaseSetup): + api_key: str = Field(..., description="The api key for Brave Search") + + +class BraveSearchArguments(BaseArguments): + query: str = Field(..., description="The search query for searching with Brave") + + +class BraveSearchOutput(BaseOutput): + result: str = Field(..., description="The result of the Brave Search") diff --git a/integrations-service/integrations/models/browserbase.py b/integrations-service/integrations/models/browserbase.py new file mode 100644 index 000000000..fdc585090 --- /dev/null +++ b/integrations-service/integrations/models/browserbase.py @@ -0,0 +1,29 @@ +from typing import List, Optional + +from langchain_core.documents import Document +from pydantic import Field +from pydantic_core import Url + +from .base_models import ( + BaseArguments, + BaseOutput, + BaseSetup, +) + + +class BrowserBaseSetup(BaseSetup): + api_key: str = Field(..., description="The api key for BrowserBase") + project_id: str = Field(..., description="The project id for BrowserBase") + session_id: Optional[str] = Field( + None, description="The session id for BrowserBase" + ) + + +class BrowserBaseLoadArguments(BaseArguments): + urls: List[Url] = Field(..., description="The urls for loading with BrowserBase") + + +class BrowserBaseLoadOutput(BaseOutput): + documents: List[Document] = Field( + ..., description="The documents loaded from the urls" + ) diff --git a/integrations-service/integrations/models/execution.py b/integrations-service/integrations/models/execution.py new file mode 100644 index 000000000..ff9290d6a --- /dev/null +++ b/integrations-service/integrations/models/execution.py @@ -0,0 +1,50 @@ +from typing import Optional, Union + +from pydantic import BaseModel + +from .brave import BraveSearchArguments, BraveSearchOutput, BraveSearchSetup +from .browserbase import ( + BrowserBaseLoadArguments, + BrowserBaseLoadOutput, + BrowserBaseSetup, +) +from .hacker_news import HackerNewsFetchArguments, HackerNewsFetchOutput +from .spider import SpiderFetchArguments, SpiderFetchOutput, SpiderSetup +from .weather import WeatherGetArguments, WeatherGetOutput, WeatherSetup +from .wikipedia import WikipediaSearchArguments, WikipediaSearchOutput + +ExecutionSetup = Union[ + SpiderSetup, + WeatherSetup, + BraveSearchSetup, + BrowserBaseSetup, +] + +ExecutionArguments = Union[ + SpiderFetchArguments, + WeatherGetArguments, + HackerNewsFetchArguments, + WikipediaSearchArguments, + BraveSearchArguments, + BrowserBaseLoadArguments, +] + +ExecutionResponse = Union[ + SpiderFetchOutput, + WeatherGetOutput, + HackerNewsFetchOutput, + WikipediaSearchOutput, + BraveSearchOutput, + BrowserBaseLoadOutput, +] + + +class ExecutionRequest(BaseModel): + setup: Optional[ExecutionSetup] + """ + The setup parameters the integration accepts (such as API keys) + """ + arguments: ExecutionArguments + """ + The arguments to pass to the integration + """ diff --git a/integrations-service/integrations/models/hacker_news.py b/integrations-service/integrations/models/hacker_news.py index 057ec83bd..1d0b92a23 100644 --- a/integrations-service/integrations/models/hacker_news.py +++ b/integrations-service/integrations/models/hacker_news.py @@ -1,5 +1,15 @@ -from pydantic import BaseModel, Field +from langchain_core.documents import Document +from pydantic import Field +from pydantic_core import Url +from .base_models import BaseArguments, BaseOutput -class HackerNewsExecutionArguments(BaseModel): - url: str = Field(..., description="The URL of the Hacker News thread to fetch") + +class HackerNewsFetchArguments(BaseArguments): + url: Url = Field(..., description="The URL of the Hacker News thread to fetch") + + +class HackerNewsFetchOutput(BaseOutput): + documents: list[Document] = Field( + ..., description="The documents returned from the Hacker News search" + ) diff --git a/integrations-service/integrations/models/request.py b/integrations-service/integrations/models/request.py new file mode 100644 index 000000000..e69de29bb diff --git a/integrations-service/integrations/models/spider.py b/integrations-service/integrations/models/spider.py new file mode 100644 index 000000000..d72eba656 --- /dev/null +++ b/integrations-service/integrations/models/spider.py @@ -0,0 +1,21 @@ +from langchain_core.documents import Document +from pydantic import Field +from pydantic_core import Url + +from .base_models import BaseArguments, BaseOutput, BaseSetup + + +class SpiderSetup(BaseSetup): + spider_api_key: str = Field(..., description="The request for which to fetch data") + + +class SpiderFetchArguments(BaseArguments): + url: Url = Field(..., description="The url for which to fetch data") + mode: str = Field("scrape", description="The type of crawlers") + params: dict | None = Field(None, description="The parameters for the Spider API") + + +class SpiderFetchOutput(BaseOutput): + documents: list[Document] = Field( + ..., description="The documents returned from the spider" + ) diff --git a/integrations-service/integrations/models/weather.py b/integrations-service/integrations/models/weather.py index c432e1e54..47cd0d8e3 100644 --- a/integrations-service/integrations/models/weather.py +++ b/integrations-service/integrations/models/weather.py @@ -1,13 +1,23 @@ -from pydantic import BaseModel, Field +from pydantic import Field +from .base_models import ( + BaseArguments, + BaseOutput, + BaseSetup, +) -class WeatherExecutionSetup(BaseModel): + +class WeatherSetup(BaseSetup): openweathermap_api_key: str = Field( - ..., description="The location for which to fetch weather data" + ..., description="The api key for OpenWeatherMap" ) -class WeatherExecutionArguments(BaseModel): +class WeatherGetArguments(BaseArguments): location: str = Field( ..., description="The location for which to fetch weather data" ) + + +class WeatherGetOutput(BaseOutput): + result: str = Field(..., description="The weather data for the specified location") diff --git a/integrations-service/integrations/models/wikipedia.py b/integrations-service/integrations/models/wikipedia.py index 8276d8484..8c8e4f623 100644 --- a/integrations-service/integrations/models/wikipedia.py +++ b/integrations-service/integrations/models/wikipedia.py @@ -1,6 +1,20 @@ -from pydantic import BaseModel, Field +from typing import Literal +from langchain_core.documents import Document +from pydantic import Field -class WikipediaExecutionArguments(BaseModel): +from .base_models import ( + BaseArguments, + BaseOutput, +) + + +class WikipediaSearchArguments(BaseArguments): query: str = Field(..., description="The search query string") load_max_docs: int = Field(2, description="Maximum number of documents to load") + + +class WikipediaSearchOutput(BaseOutput): + documents: list[Document] = Field( + ..., description="The documents returned from the Wikipedia search" + ) diff --git a/integrations-service/integrations/providers.py b/integrations-service/integrations/providers.py new file mode 100644 index 000000000..4bce7a2ba --- /dev/null +++ b/integrations-service/integrations/providers.py @@ -0,0 +1,144 @@ +from .models import ( + BaseProvider, + BaseProviderMethod, + BraveSearchArguments, + BraveSearchOutput, + BraveSearchSetup, + BrowserBaseLoadArguments, + BrowserBaseLoadOutput, + BrowserBaseSetup, + HackerNewsFetchArguments, + HackerNewsFetchOutput, + ProviderInfo, + SpiderFetchArguments, + SpiderFetchOutput, + SpiderSetup, + WeatherGetArguments, + WeatherGetOutput, + WeatherSetup, + WikipediaSearchArguments, + WikipediaSearchOutput, +) + +wikipedia = BaseProvider( + provider="wikipedia", + setup=None, + methods=[ + BaseProviderMethod( + method="search", + description="Search for a page on Wikipedia", + arguments=WikipediaSearchArguments, + output=WikipediaSearchOutput, + ), + ], + info=ProviderInfo( + url="https://www.wikipedia.org/", + docs="https://www.wikipedia.org/wiki/Main_Page", + icon="https://www.wikipedia.org/static/favicon/wikipedia.ico", + friendly_name="Wikipedia", + ), +) + +weather = BaseProvider( + provider="weather", + setup=WeatherSetup, + methods=[ + BaseProviderMethod( + method="get", + description="Get the current weather for a city", + arguments=WeatherGetArguments, + output=WeatherGetOutput, + ), + ], + info=ProviderInfo( + url="https://www.weatherapi.com/", + docs="https://www.weatherapi.com/docs/", + icon="https://www.weatherapi.com/favicon.ico", + friendly_name="Weather API", + ), +) + +hacker_news = BaseProvider( + provider="hacker_news", + setup=None, + methods=[ + BaseProviderMethod( + method="fetch", + description="Get the top stories from Hacker News", + arguments=HackerNewsFetchArguments, + output=HackerNewsFetchOutput, + ), + ], + info=ProviderInfo( + url="https://news.ycombinator.com/", + docs="https://news.ycombinator.com/newsguidelines.html", + icon="https://news.ycombinator.com/favicon.ico", + friendly_name="Hacker News", + ), +) + +spider = BaseProvider( + provider="spider", + setup=SpiderSetup, + methods=[ + BaseProviderMethod( + method="crawl", + description="Crawl a website and extract data", + arguments=SpiderFetchArguments, + output=SpiderFetchOutput, + ), + ], + info=ProviderInfo( + url="https://spider.com/", + docs="https://spider.com/docs/", + icon="https://spider.com/favicon.ico", + friendly_name="Spider", + ), +) + +brave = BaseProvider( + provider="brave", + setup=BraveSearchSetup, + methods=[ + BaseProviderMethod( + method="search", + description="Search with Brave", + arguments=BraveSearchArguments, + output=BraveSearchOutput, + ), + ], + info=ProviderInfo( + url="https://brave.com/", + docs="https://brave.com/docs/", + icon="https://brave.com/favicon.ico", + friendly_name="Brave Search", + ), +) + +browserbase = BaseProvider( + provider="browserbase", + setup=BrowserBaseSetup, + methods=[ + BaseProviderMethod( + method="load", + description="Load documents from the provided urls", + arguments=BrowserBaseLoadArguments, + output=BrowserBaseLoadOutput, + ), + ], + info=ProviderInfo( + url="https://browserbase.com/", + docs="https://browserbase.com/docs/", + icon="https://browserbase.com/favicon.ico", + friendly_name="BrowserBase", + ), +) + +providers = { + "wikipedia": wikipedia, + "weather": weather, + "hacker_news": hacker_news, + "spider": spider, + "brave": brave, + "browserbase": browserbase, +} diff --git a/integrations-service/integrations/routers/execution/execute.py b/integrations-service/integrations/routers/execution/execute.py index 9baf63795..df4bf913a 100644 --- a/integrations-service/integrations/routers/execution/execute.py +++ b/integrations-service/integrations/routers/execution/execute.py @@ -1,19 +1,33 @@ -from fastapi import Body, HTTPException, Path +from fastapi import HTTPException -from ...models import IntegrationExecutionRequest, IntegrationExecutionResponse +from ...models.base_models import IdentifierName +from ...models.execution import ExecutionRequest, ExecutionResponse from ...utils.execute_integration import execute_integration from .router import router @router.post("/execute/{provider}", tags=["execution"]) async def execute( - provider: str = Path(..., description="The integration provider"), - request: IntegrationExecutionRequest = Body( - ..., description="The integration execution request" - ), -) -> IntegrationExecutionResponse: + provider: IdentifierName, + data: ExecutionRequest, +) -> ExecutionResponse: try: - result = await execute_integration(provider, request.setup, request.arguments) - return IntegrationExecutionResponse(result=result) + return await execute_integration( + provider=provider, arguments=data.arguments, setup=data.setup + ) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + + +@router.post("/execute/{provider}/{method}", tags=["execution"]) +def execute( + provider: IdentifierName, + method: IdentifierName, + data: ExecutionRequest, +) -> ExecutionResponse: + try: + return execute_integration( + provider=provider, arguments=data.arguments, setup=data.setup, method=method + ) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) diff --git a/integrations-service/integrations/routers/integrations/__init__.py b/integrations-service/integrations/routers/integrations/__init__.py index 01645a176..26eac0aaf 100644 --- a/integrations-service/integrations/routers/integrations/__init__.py +++ b/integrations-service/integrations/routers/integrations/__init__.py @@ -1,2 +1,3 @@ +from .get_integration import get_integration from .get_integration_tool import get_integration_tool from .get_integrations import get_integrations diff --git a/integrations-service/integrations/routers/integrations/get_integration.py b/integrations-service/integrations/routers/integrations/get_integration.py new file mode 100644 index 000000000..2a9b34595 --- /dev/null +++ b/integrations-service/integrations/routers/integrations/get_integration.py @@ -0,0 +1,23 @@ +from typing import List + +from ...providers import providers +from .router import router + + +@router.get("/integrations/{provider}", tags=["integration"]) +async def get_integration(provider: str) -> dict: + integration = providers[provider] + return { + "provider": integration.provider, + "setup": integration.setup.model_json_schema() if integration.setup else None, + "methods": [ + { + "method": m.method, + "description": m.description, + "arguments": m.arguments.model_json_schema(), + "output": m.output.model_json_schema(), + } + for m in integration.methods + ], + "info": integration.info.model_dump_json(), + } diff --git a/integrations-service/integrations/routers/integrations/get_integration_tool.py b/integrations-service/integrations/routers/integrations/get_integration_tool.py index 8392c52d2..42e3c1bc8 100644 --- a/integrations-service/integrations/routers/integrations/get_integration_tool.py +++ b/integrations-service/integrations/routers/integrations/get_integration_tool.py @@ -2,26 +2,24 @@ from fastapi import HTTPException -from ...models.models import IntegrationDef -from .get_integrations import get_integrations +from ...models.base_models import BaseProvider, BaseProviderMethod from .router import router -def convert_to_openai_tool(integration: IntegrationDef) -> dict: +def convert_to_openai_tool( + provider: BaseProvider, method: Optional[BaseProviderMethod] = None +) -> dict: + method = method or provider.methods[0] + name = f"{provider.provider}_{method.method}" + description = method.description + arguments = method.arguments.model_json_schema() + return { "type": "function", "function": { - "name": integration.provider, - "description": integration.description, - "parameters": { - "type": "object", - "properties": integration.arguments, - "required": [ - k - for k, v in integration.arguments.items() - if v.get("required", False) - ], - }, + "name": name, + "description": description, + "parameters": arguments, }, } @@ -29,12 +27,18 @@ def convert_to_openai_tool(integration: IntegrationDef) -> dict: @router.get("/integrations/{provider}/tool", tags=["integration_tool"]) @router.get("/integrations/{provider}/{method}/tool", tags=["integration_tool"]) async def get_integration_tool(provider: str, method: Optional[str] = None): - integrations = await get_integrations() + from ...providers import providers + + provider: BaseProvider | None = providers.get(provider, None) + + if not provider: + raise HTTPException(status_code=404, detail="Integration not found") - for integration in integrations: - if integration.provider == provider and ( - method is None or integration.method == method - ): - return convert_to_openai_tool(integration) + if method: + for m in provider.methods: + if m.method == method: + return convert_to_openai_tool(provider, m) + else: + return convert_to_openai_tool(provider) raise HTTPException(status_code=404, detail="Integration not found") diff --git a/integrations-service/integrations/routers/integrations/get_integrations.py b/integrations-service/integrations/routers/integrations/get_integrations.py index ff47340c0..b3b3530c7 100644 --- a/integrations-service/integrations/routers/integrations/get_integrations.py +++ b/integrations-service/integrations/routers/integrations/get_integrations.py @@ -1,82 +1,31 @@ -import importlib -import inspect -import os -from typing import Any, List +from typing import List -from pydantic import BaseModel - -from ...models.models import IntegrationDef -from ...utils import integrations +from ...providers import providers from .router import router -def create_integration_def(module: Any) -> IntegrationDef: - module_parts = module.__name__.split(".") - if len(module_parts) > 4: # Nested integration - provider = module_parts[-2] - method = module_parts[-1] - else: # Top-level integration - provider = module_parts[-1] - method = None - - # Find the first function in the module - function_name = next( - name - for name, obj in inspect.getmembers(module) - if inspect.isfunction(obj) and not name.startswith("_") - ) - function = getattr(module, function_name) - signature = inspect.signature(function) - - # Get the Pydantic model for the parameters - params_model = next(iter(signature.parameters.values())).annotation - - # Check if the params_model is a Pydantic model - if issubclass(params_model, BaseModel): - arguments = {} - for field_name, field in params_model.model_fields.items(): - field_type = field.annotation - arguments[field_name] = { - "type": field_type.__name__.lower(), - "description": field.description, - } - else: - # Fallback to a dictionary if it's not a Pydantic model - arguments = { - param.name: {"type": str(param.annotation.__name__).lower()} - for param in signature.parameters.values() - if param.name != "parameters" - } - - return IntegrationDef( - provider=provider, - method=method, - description=function.__doc__.strip() if function.__doc__ else None, - arguments=arguments, - ) - - @router.get("/integrations", tags=["integrations"]) -async def get_integrations() -> List[IntegrationDef]: - integration_defs = [] - integrations_dir = os.path.dirname(integrations.__file__) - - for item in os.listdir(integrations_dir): - item_path = os.path.join(integrations_dir, item) - - if os.path.isdir(item_path): - # This is a toolkit - for file in os.listdir(item_path): - if file.endswith(".py") and not file.startswith("__"): - module = importlib.import_module( - f"...utils.integrations.{item}.{file[:-3]}", package=__package__ - ) - integration_defs.append(create_integration_def(module)) - elif item.endswith(".py") and not item.startswith("__"): - # This is a single-file tool - module = importlib.import_module( - f"...utils.integrations.{item[:-3]}", package=__package__ - ) - integration_defs.append(create_integration_def(module)) - - return integration_defs +async def get_integrations() -> List[dict]: + integrations = [ + { + "provider": p.provider, + "setup": p.setup.model_json_schema() if p.setup else None, + "methods": [ + { + "method": m.method, + "description": m.description, + "arguments": m.arguments.model_json_schema(), + "output": m.output.model_json_schema(), + } + for m in p.methods + ], + "info": { + "url": p.info.url, + "docs": p.info.docs, + "icon": p.info.icon, + "friendly_name": p.info.friendly_name, + }, + } + for p in providers.values() + ] + return integrations diff --git a/integrations-service/integrations/utils/execute_integration.py b/integrations-service/integrations/utils/execute_integration.py index a6b05ae90..fdc6d23d0 100644 --- a/integrations-service/integrations/utils/execute_integration.py +++ b/integrations-service/integrations/utils/execute_integration.py @@ -1,26 +1,37 @@ -from ..models import ExecuteIntegrationArguments, ExecuteIntegrationSetup -from .integrations.dalle_image_generator import dalle_image_generator -from .integrations.duckduckgo_search import duckduckgo_search -from .integrations.hacker_news import hacker_news -from .integrations.weather import weather -from .integrations.wikipedia import wikipedia +import importlib + +from ..models.base_models import BaseProvider, IdentifierName +from ..models.execution import ExecutionArguments, ExecutionResponse, ExecutionSetup +from ..providers import providers async def execute_integration( - provider: str, - setup: ExecuteIntegrationSetup | None, - arguments: ExecuteIntegrationArguments, -) -> str: - match provider: - case "duckduckgo_search": - return await duckduckgo_search(arguments=arguments) - case "dalle_image_generator": - return await dalle_image_generator(setup=setup, arguments=arguments) - case "wikipedia": - return await wikipedia(arguments=arguments) - case "weather": - return await weather(setup=setup, arguments=arguments) - case "hacker_news": - return await hacker_news(arguments=arguments) - case _: - raise ValueError(f"Unknown integration: {provider}") + provider: IdentifierName, + arguments: ExecutionArguments, + method: IdentifierName | None = None, + setup: ExecutionSetup | None = None, +) -> ExecutionResponse: + if provider not in providers: + raise ValueError(f"Unknown provider: {provider}") + provider: BaseProvider = providers[provider] + if method is None: + method = provider.methods[0].method + if method not in [method.method for method in provider.methods]: + raise ValueError(f"Unknown method: {method} for provider: {provider}") + + provider_module = importlib.import_module( + f"integrations.utils.integrations.{provider.provider}", package="integrations" + ) + execution_function = getattr(provider_module, method) + + if setup: + setup_class = provider.setup + if setup_class: + setup = setup_class(**setup.model_dump()) + arguments_class = next(m for m in provider.methods if m.method == method).arguments + parsed_arguments = arguments_class(**arguments.model_dump()) + + if setup: + return await execution_function(setup=setup, arguments=parsed_arguments) + else: + return execution_function(arguments=parsed_arguments) diff --git a/integrations-service/integrations/utils/integrations/__init__.py b/integrations-service/integrations/utils/integrations/__init__.py index 5047b57bd..dc123fd4c 100644 --- a/integrations-service/integrations/utils/integrations/__init__.py +++ b/integrations-service/integrations/utils/integrations/__init__.py @@ -1,5 +1,6 @@ -from .dalle_image_generator import dalle_image_generator -from .duckduckgo_search import duckduckgo_search -from .hacker_news import hacker_news -from .weather import weather -from .wikipedia import wikipedia +from .brave import search +from .browserbase import load +from .hacker_news import fetch +from .spider import crawl +from .weather import get +from .wikipedia import search diff --git a/integrations-service/integrations/utils/integrations/brave.py b/integrations-service/integrations/utils/integrations/brave.py new file mode 100644 index 000000000..10bfe8084 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/brave.py @@ -0,0 +1,19 @@ +from langchain_community.tools import BraveSearch + +from ...models import BraveSearchArguments, BraveSearchOutput, BraveSearchSetup + + +async def search( + setup: BraveSearchSetup, arguments: BraveSearchArguments +) -> BraveSearchOutput: + """ + Searches Brave Search with the provided query. + """ + + assert isinstance(setup, BraveSearchSetup), "Invalid setup" + assert isinstance(arguments, BraveSearchArguments), "Invalid arguments" + + tool = BraveSearch.from_api_key(api_key=setup.api_key, search_kwargs={"count": 3}) + + result = tool.run(arguments.query) + return BraveSearchOutput(result=result) diff --git a/integrations-service/integrations/utils/integrations/browserbase.py b/integrations-service/integrations/utils/integrations/browserbase.py new file mode 100644 index 000000000..7cc672662 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/browserbase.py @@ -0,0 +1,27 @@ +from langchain_community.document_loaders import BrowserbaseLoader + +from ...models import BrowserBaseLoadArguments, BrowserBaseLoadOutput, BrowserBaseSetup + + +async def load( + setup: BrowserBaseSetup, arguments: BrowserBaseLoadArguments +) -> BrowserBaseLoadOutput: + """ + Loads documents from the provided urls using BrowserBase. + """ + + assert isinstance(setup, BrowserBaseSetup), "Invalid setup" + assert isinstance(arguments, BrowserBaseLoadArguments), "Invalid arguments" + + urls = [str(url) for url in arguments.urls] + + loader = BrowserbaseLoader( + api_key=setup.api_key, + project_id=setup.project_id, + session_id=setup.session_id, + urls=urls, + text_content=False, + ) + + documents = loader.load() + return BrowserBaseLoadOutput(documents=documents) diff --git a/integrations-service/integrations/utils/integrations/hacker_news.py b/integrations-service/integrations/utils/integrations/hacker_news.py index 522b64e58..526024c72 100644 --- a/integrations-service/integrations/utils/integrations/hacker_news.py +++ b/integrations-service/integrations/utils/integrations/hacker_news.py @@ -1,31 +1,22 @@ from langchain_community.document_loaders import HNLoader -from ...models import HackerNewsExecutionArguments +from ...models import HackerNewsFetchArguments, HackerNewsFetchOutput -async def hacker_news(arguments: HackerNewsExecutionArguments) -> str: +async def fetch(arguments: HackerNewsFetchArguments) -> HackerNewsFetchOutput: """ Fetches and formats content from a Hacker News thread using the provided URL. """ - assert isinstance(arguments, HackerNewsExecutionArguments), "Invalid arguments" + assert isinstance(arguments, HackerNewsFetchArguments), "Invalid arguments" url = arguments.url if not url: raise ValueError("URL parameter is required for Hacker News search") - loader = HNLoader(url) + loader = HNLoader(str(url)) documents = loader.load() if not documents: raise ValueError("No data found for the given URL") - # data is a list of documents, - result = "\n\n".join( - [ - f"Title: {doc.metadata['title']}\n" - f"Source: {doc.metadata['source']}\n" - f"Content: {doc.page_content}..." - for doc in documents - ] - ) - return result + return HackerNewsFetchOutput(documents=documents) diff --git a/integrations-service/integrations/utils/integrations/request.py b/integrations-service/integrations/utils/integrations/request.py new file mode 100644 index 000000000..e69de29bb diff --git a/integrations-service/integrations/utils/integrations/spider.py b/integrations-service/integrations/utils/integrations/spider.py new file mode 100644 index 000000000..a355e2347 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/spider.py @@ -0,0 +1,28 @@ +from langchain_community.document_loaders import SpiderLoader + +from ...models import SpiderFetchArguments, SpiderFetchOutput, SpiderSetup + + +async def crawl(setup: SpiderSetup, arguments: SpiderFetchArguments) -> SpiderFetchOutput: + """ + Fetches data from a specified URL. + """ + + assert isinstance(setup, SpiderSetup), "Invalid setup" + assert isinstance(arguments, SpiderFetchArguments), "Invalid arguments" + + url = arguments.url + + if not url: + raise ValueError("URL parameter is required for spider") + + spider_loader = SpiderLoader( + api_key=setup.spider_api_key, + url=str(url), + mode=arguments.mode, + params=arguments.params, + ) + + documents = spider_loader.load() + + return SpiderFetchOutput(documents=documents) diff --git a/integrations-service/integrations/utils/integrations/weather.py b/integrations-service/integrations/utils/integrations/weather.py index 2bf00d295..e9393bc09 100644 --- a/integrations-service/integrations/utils/integrations/weather.py +++ b/integrations-service/integrations/utils/integrations/weather.py @@ -1,17 +1,15 @@ from langchain_community.utilities import OpenWeatherMapAPIWrapper -from ...models import WeatherExecutionArguments, WeatherExecutionSetup +from ...models import WeatherGetArguments, WeatherGetOutput, WeatherSetup -async def weather( - setup: WeatherExecutionSetup, arguments: WeatherExecutionArguments -) -> str: +async def get(setup: WeatherSetup, arguments: WeatherGetArguments) -> WeatherGetOutput: """ Fetches weather data for a specified location using OpenWeatherMap API. """ - assert isinstance(setup, WeatherExecutionSetup), "Invalid setup" - assert isinstance(arguments, WeatherExecutionArguments), "Invalid arguments" + assert isinstance(setup, WeatherSetup), "Invalid setup" + assert isinstance(arguments, WeatherGetArguments), "Invalid arguments" location = arguments.location @@ -20,5 +18,6 @@ async def weather( raise ValueError("Location parameter is required for weather data") weather = OpenWeatherMapAPIWrapper(openweathermap_api_key=openweathermap_api_key) + result = weather.run(location) + return WeatherGetOutput(result=result) - return weather.run(location) diff --git a/integrations-service/integrations/utils/integrations/wikipedia.py b/integrations-service/integrations/utils/integrations/wikipedia.py index 9e04d2871..aa53b5515 100644 --- a/integrations-service/integrations/utils/integrations/wikipedia.py +++ b/integrations-service/integrations/utils/integrations/wikipedia.py @@ -1,9 +1,9 @@ from langchain_community.document_loaders import WikipediaLoader -from ...models import WikipediaExecutionArguments +from ...models import WikipediaSearchArguments, WikipediaSearchOutput -async def wikipedia(arguments: WikipediaExecutionArguments) -> str: +def search(arguments: WikipediaSearchArguments) -> WikipediaSearchOutput: """ Searches Wikipedia for a given query and returns formatted results. """ @@ -17,13 +17,4 @@ async def wikipedia(arguments: WikipediaExecutionArguments) -> str: loader = WikipediaLoader(query=query, load_max_docs=load_max_docs) documents = loader.load() - # Format the results as string - result = "\n\n".join( - [ - f"Title: {doc.metadata['title']}\n" - f"Summary: {doc.metadata['summary']}\n" - f"Content: {doc.page_content}..." - for doc in documents - ] - ) - return result + return WikipediaSearchOutput(documents=documents) diff --git a/integrations-service/poetry.lock b/integrations-service/poetry.lock index 1dea3755d..e56fd28cd 100644 --- a/integrations-service/poetry.lock +++ b/integrations-service/poetry.lock @@ -13,102 +13,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.7" +version = "3.10.8" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df23cb35bec54b73fba371c7c904994433651458acf8bfb7c84464fef5834c0a"}, - {file = "aiohttp-3.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33a6d023b207ad8227e607814c0020b42c53e01a66004fc0f2555e1a4941282"}, - {file = "aiohttp-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d23df9f01c8945d03cffcdd9ba9bfd88aa21ac567a39d0ac4d0c80499ed0d23"}, - {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ddf2c8c9ec6bb3f5c057e5c95605adb8e3f1e2d999e8801736f448aff29280e"}, - {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d09e40e2ae6723af487ffde019055d0b6ce4eae0749fcfe9de624b61f1af6ec"}, - {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc1f4e0f4b1ae9289b4d0cc3bf5d6d55176c38ef1d41484550f3f9a0a78bedae"}, - {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636e3efb0bb024817cefa1ef86d678d1a73eb210ae162aff4234214060011ff5"}, - {file = "aiohttp-3.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bab2544f09cd1db154c105e03b1c941032fd7237da5da184595771999ca90daa"}, - {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:431852e77cd72f60a0278f8cf557c8e568cd856f755a4b6c5232c7d8c6343d2e"}, - {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6bae913cbb183cd34863905088ef26a17c75332bd6bdd451ee8bf158c987cf19"}, - {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:278cd430ba93a157ad1faf490fdd6051801085ffa31a27762133472555e56888"}, - {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e083e29b6db8e34a507cd678f89eab3ae5f307486ea6010c6473436d3769628d"}, - {file = "aiohttp-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:150deb28d5302cfec89fc31ea4bce774df06f5c03d95519f7588ca6517a472d7"}, - {file = "aiohttp-3.10.7-cp310-cp310-win32.whl", hash = "sha256:e19337d6552af197ebb8c886daea0b938ae34eff776c1fa914ad433f6db3970f"}, - {file = "aiohttp-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:bff7ef30cb6fc186ea6dda9e19d6105b1c213e3a3f759b5a23c271c778027260"}, - {file = "aiohttp-3.10.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1378164474a3866f7684a95efede1bee4016cd104bc10bf885e492c4459b715a"}, - {file = "aiohttp-3.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:87d0e52b2905dbc1aeffcbf0611fa82e27874764332c11b984293a4b91cc8e9f"}, - {file = "aiohttp-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2783754bfcee0b13b8e55932b418cf8984c17099fd1b37341d4696447d0c328"}, - {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d26881d98274ef0dbd4f069f383e5e90eb6e42e957289db14c47186386832ce"}, - {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e152296b2c50417445eacdb2353d3c10e702f6593aa774277510fb7761304302"}, - {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf1cd9bfd598899396bdb8a4dc5234144a77e482e7489972b7956cf66e272872"}, - {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871c2bf68ecc55056e5e3b0ae5929a1149f41c4255bbf99b1f858005f63360d1"}, - {file = "aiohttp-3.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd8a0a0ef895e4c3f1afd31c2a6f89d68a94baacdbe2eb9bf90ac54b997cf99b"}, - {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:99c11c5d632fa2222cc5805105841f6f3c40df116368fde40fbd71f8b14ea692"}, - {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8fbf91559400fe1a98d84af36f5a66aa59c359ac3cb113b17d304ced6a4601b4"}, - {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:73f151a1e21369a84d56b91a209590c23270c847463029fdcbda710516217644"}, - {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:80531f6f4fff5a1f7e495afbc4aff5c4230b605f26d56c40ecad27a269665608"}, - {file = "aiohttp-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:164068b338c52dfe44f3490c70ef7b33c0e73d441c89f599ae2d93f7dcf3e395"}, - {file = "aiohttp-3.10.7-cp311-cp311-win32.whl", hash = "sha256:a84fe27904dbb43a236532d6d841d6132200b7bb53ba73d0300b0b586ceab6cc"}, - {file = "aiohttp-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:beda1abd7b23d489a5b66a46eba5a9e0db58e4ad91d68697409eeabda343fb9d"}, - {file = "aiohttp-3.10.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68120c12c98bfc0e024ef1279be5f41327a54a5094710adc970ecc9724b91871"}, - {file = "aiohttp-3.10.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e1a9b4026b6fe41adde784e308b0ad0d6a8b5cc9062f9c349125fd57149bc8a9"}, - {file = "aiohttp-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85d8a1d716516ef92c769eadb020600d27223899018ef8d07c09c117001cc7d5"}, - {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87652147515031dafc1b37c9c3c42fbe9e2697af6264ec26080a6fe603cc5196"}, - {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c6140d6cbf8eebbcf1528364ce0b26d0a95788111659cfc008fba3a12fc874f"}, - {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:342600665e74eea20b3286045ebeb0aa2f9cececf2eb0acc6f6817205b112b29"}, - {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b7794b3d23451e355b4a87959943125afff8dd31d8059651c2734de12f9e7f2"}, - {file = "aiohttp-3.10.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d8d12d6a192f7b9f8a335cad8634a4f081d8319b75dd42257a1a3e557848d00"}, - {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b5d8c94fd23f41007799ec657e18661f9f8c5b566a1e4fe944e3514e505a6b49"}, - {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a1fe407bec2f14a3d79ec92aa767b930857a6782589ea87ac76fd8081dea3dab"}, - {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7ed4435dcf507ef2de5b4be64276933eb19c78e5c7d00ca376fcd9a67d0139a0"}, - {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c161f9e353f291d23069a8f67180fd52c76d72d4671f4f53602ea9ac29f47d50"}, - {file = "aiohttp-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:caf083bf26b1e286ab1929dbd8d8cab6230160576a0ed5e3bfb3487bb19474c2"}, - {file = "aiohttp-3.10.7-cp312-cp312-win32.whl", hash = "sha256:4296dd120e7e9728625eef1091039aff1a454c7147913d47839876c94b202226"}, - {file = "aiohttp-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:10d19997f2f8d49d53b76163b71e263bb7b23f48041d0d4050a43445a0052c35"}, - {file = "aiohttp-3.10.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:582536d3d7f95a6d4d072d2326dd03eeb1549c1cc86d02c9bcec71899f4c66f2"}, - {file = "aiohttp-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:365eff442a47b13e0e12c37240a6f75940ebee0b7943af43c84d5b43643fc80c"}, - {file = "aiohttp-3.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2e0083e6f9f9cb0a0bedd694782e7fb8a54eb4de40e1743d9bb526f1c1eea88"}, - {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da5a03cbe746f182f7b61e119dde24d388cf77965fea320bc8aba61b75039d06"}, - {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b210484fccff00cafa9bd8abedea8749b6d975df8c8e21c82d92bb25403db85"}, - {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b75cfa1e5fc7c87fc5f9de7124bb039b898791bb87207d2107bed5e3509670f"}, - {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b4aa816cd3ab876f96ce8c6986648392137cbd6feddbf4189322515f34e1f6"}, - {file = "aiohttp-3.10.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3915944c87c9bf488db4ca1ae6edca40b5bc77c4c2cf2f49b69886bc47b97db1"}, - {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cd658aeaa65fb99fcc3b93882bb33cbd600501d40473488aec163a981d7b05ee"}, - {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:aeea07c89a5a53463c70957feb85d4b846982c0f054b521fc44f52862e7871cf"}, - {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f8aaa0bc8e39352684982b378ba3f7e32e78a746da433aaeceb7e93d7fdf9ce3"}, - {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f25a79ac4ac0bd94cf283d3e86e6f3ec78fc39e2de6949b902c342148b7b5f6"}, - {file = "aiohttp-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fc3538efae4e4df222a563559f8766234f49e845e8dbb2dd477eb8f3fd97242"}, - {file = "aiohttp-3.10.7-cp313-cp313-win32.whl", hash = "sha256:eea89c47ae8d592f7563f4355132fe844b5e2f8660292deacc292253bef291cd"}, - {file = "aiohttp-3.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:7ce1b54feaaf264e28a4474e13635d302a59aafb720b18c3c2885b8f35ce5040"}, - {file = "aiohttp-3.10.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7a372f9ea521741667cec2ef4a64419448030411af2e844dfa8dbbb8074baea6"}, - {file = "aiohttp-3.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:feff2170b23921a526f31d78c8f76bbb9cde825e78035286d8571ce0c81901ab"}, - {file = "aiohttp-3.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa42c4e78925a438a6f7df0d9b165d29cdc0a44fc5ce838d6c293a0161a2bd9a"}, - {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ced77f4dd0c4f0107ee96f8df162b984470ac9f94ef93dd44dba62838fd85cde"}, - {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13085c0129a906b001d87dd43e247155f6c76820d98147c079b746e8a0665b17"}, - {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92100555f86b314ed840ed61d937fc30ca39ad453c9aa9020414a3cce955d9b"}, - {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77bc82d7b10f377957ba8e99bb1b13d946e9e9038fe89ba0888ad0b12e60c9c0"}, - {file = "aiohttp-3.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6052d92b47b8cf3736b1f01ac8f83cf02f188ef7542848055a5e227db0e16cb"}, - {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82fa5fb983922b03f2b08d1140550c68b50313305115639e19b13489c284c30c"}, - {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0246659d9a54a23a83f11842bdd58f335a1370aa66b376eeae16b7cf29009dde"}, - {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:befc2f0794bc4bbbb1f8d0e245d32ee13331205b58f54910789e9e78d2a6fbf5"}, - {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9cd67e5c84cb75a471b2e35f3fb0da52e6d359d1794d3465a87052fb240e64b5"}, - {file = "aiohttp-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:af10344fb1ee195b2cd5840b61d8c8121b16d3b3baa2da5a86cf4001a7e5bd98"}, - {file = "aiohttp-3.10.7-cp38-cp38-win32.whl", hash = "sha256:81d3fc1b187656b6b465ed4ed4c9858f16ff2d9864da6225d80b8018abd7739b"}, - {file = "aiohttp-3.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:b6fb89edeadfd69df75f8cea97c3533805a9960cc56034ad296abe9b18771842"}, - {file = "aiohttp-3.10.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:318824b98a2bdf84e9a21d413737a3c4f27bbad0a9ce16141488f631dbffb9b2"}, - {file = "aiohttp-3.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63c9de949e05a5f729aecba6bf4b3d5403846caf546ea5020f8b9bf315bd8f12"}, - {file = "aiohttp-3.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0245e1a71f3503b01d2c304529779a70277ccc0fe9847b48d437363de6e4336e"}, - {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14dbfb208ffe3388e0770fd23bf9114cc933c10bb1dba35b538f3c9d685334d8"}, - {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f6b014f2176d2774b759b8e2951af4a613385ebcc08841cb5c0ca6d5dee74ee"}, - {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcfabf9338fed009fd9e11bf496a927ea67b1ce15d34847cb0a98aa6f042b989"}, - {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:171f1f5364a0ef5873480e6fddc3870ee37f1dfe216fa67507bbd4c91306f110"}, - {file = "aiohttp-3.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87e243b1df27ff685ab08228b7a938c0530beb60ad3dea7554da1554d46c9ad4"}, - {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fee4d2246b091b7e252cd5bcdbd4362fa21c3cc6a445fef54de793731546ab24"}, - {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bfa8c8af8c92e3d6c1eff02cf5127f62c1e7564e7b0f1a9767035f81a2e6bb20"}, - {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f44f09b67a458400215d9efedb9cfb5e3256dbeb2cc2da68e4592b7b36bac0c9"}, - {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b5f8270946777d6971c27479cb6e7f54578be960928a8922cb59130e856d8484"}, - {file = "aiohttp-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e8ccaa99871303323bd2cda120043039729497642da5c6f53e066b19f73d9df8"}, - {file = "aiohttp-3.10.7-cp39-cp39-win32.whl", hash = "sha256:ce7c12bfbb1579e81cdf2e7db4338f8c768da2493aa0db60a858a542d551563c"}, - {file = "aiohttp-3.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:189979c7e9d8f40236534760daf5b41d2026d5ebabdf913e771d9b6bfbc992af"}, - {file = "aiohttp-3.10.7.tar.gz", hash = "sha256:18c72a69ba20713f26fa40932cac17437b0c1d25edff2e27437a204c12275bd9"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, + {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, + {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, + {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, + {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, + {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, + {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, + {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, + {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, + {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, + {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, + {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, + {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, ] [package.dependencies] @@ -217,6 +217,22 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] +[[package]] +name = "browserbase" +version = "0.3.0" +description = "Browserbase Python SDK" +optional = false +python-versions = ">=3.8" +files = [ + {file = "browserbase-0.3.0-py3-none-any.whl", hash = "sha256:16fe6f0b1fc55aca050bbabf76cd17d83ee1a798d9bba274b09421ca120b5ec3"}, + {file = "browserbase-0.3.0.tar.gz", hash = "sha256:2ec31641fab0a9ec3b2f23ed0244f01e3b35423806c1c6665d68706133958b07"}, +] + +[package.dependencies] +httpx = ">=0.27.0" +playwright = ">=1.43.0" +pydantic = ">=2.7.1" + [[package]] name = "certifi" version = "2024.8.30" @@ -530,84 +546,69 @@ files = [ [[package]] name = "greenlet" -version = "3.1.1" +version = "3.0.3" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, - {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, - {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, - {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, - {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, - {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, - {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, - {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, - {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, - {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, - {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, - {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, - {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, - {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, - {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, - {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, - {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] @@ -1436,6 +1437,26 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] +[[package]] +name = "playwright" +version = "1.47.0" +description = "A high-level API to automate web browsers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "playwright-1.47.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:f205df24edb925db1a4ab62f1ab0da06f14bb69e382efecfb0deedc4c7f4b8cd"}, + {file = "playwright-1.47.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fc820faf6885f69a52ba4ec94124e575d3c4a4003bf29200029b4a4f2b2d0ab"}, + {file = "playwright-1.47.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:8e212dc472ff19c7d46ed7e900191c7a786ce697556ac3f1615986ec3aa00341"}, + {file = "playwright-1.47.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:a1935672531963e4b2a321de5aa59b982fb92463ee6e1032dd7326378e462955"}, + {file = "playwright-1.47.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0a1b61473d6f7f39c5d77d4800b3cbefecb03344c90b98f3fbcae63294ad249"}, + {file = "playwright-1.47.0-py3-none-win32.whl", hash = "sha256:1b977ed81f6bba5582617684a21adab9bad5676d90a357ebf892db7bdf4a9974"}, + {file = "playwright-1.47.0-py3-none-win_amd64.whl", hash = "sha256:0ec1056042d2e86088795a503347407570bffa32cbe20748e5d4c93dba085280"}, +] + +[package.dependencies] +greenlet = "3.0.3" +pyee = "12.0.0" + [[package]] name = "pluggy" version = "1.5.0" @@ -1653,6 +1674,23 @@ dev = ["chardet", "parameterized", "ruff"] release = ["zest.releaser[recommended]"] tests = ["chardet", "parameterized", "pytest", "pytest-cov", "pytest-xdist[psutil]", "ruff", "tox"] +[[package]] +name = "pyee" +version = "12.0.0" +description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyee-12.0.0-py3-none-any.whl", hash = "sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990"}, + {file = "pyee-12.0.0.tar.gz", hash = "sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145"}, +] + +[package.dependencies] +typing-extensions = "*" + +[package.extras] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] + [[package]] name = "pyowm" version = "3.3.0" @@ -1905,6 +1943,26 @@ files = [ {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, ] +[[package]] +name = "setuptools" +version = "75.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] + [[package]] name = "six" version = "1.16.0" @@ -1938,6 +1996,19 @@ files = [ {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] +[[package]] +name = "spider-client" +version = "0.0.70" +description = "Python SDK for Spider Cloud API" +optional = false +python-versions = "*" +files = [ + {file = "spider-client-0.0.70.tar.gz", hash = "sha256:3c46cb3cfe1ba4dc904bf18f1c727af7ab1f6ba04464e5bf149304aa92cc769c"}, +] + +[package.dependencies] +requests = "*" + [[package]] name = "sqlalchemy" version = "2.0.35" @@ -2322,4 +2393,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "fb83027193b7fc52de26ae1132f39b58898e639003467e9498b0c0598ed00667" +content-hash = "09de1366659448cf284d8db6f8b7ed615e75f1aa44c1684868905e1c86780ac4" diff --git a/integrations-service/pyproject.toml b/integrations-service/pyproject.toml index c477ac3a6..584efa480 100644 --- a/integrations-service/pyproject.toml +++ b/integrations-service/pyproject.toml @@ -17,6 +17,9 @@ tweepy = "^4.14.0" wikipedia = "^1.4.0" fire = "^0.6.0" pyowm = "^3.3.0" +spider-client = "^0.0.70" +browserbase = "^0.3.0" +setuptools = "^75.1.0" [tool.poe.tasks] format = "ruff format" diff --git a/typespec/common/scalars.tsp b/typespec/common/scalars.tsp index 0bb735586..76ccef2d3 100644 --- a/typespec/common/scalars.tsp +++ b/typespec/common/scalars.tsp @@ -57,11 +57,14 @@ scalar JinjaTemplate extends string; /** Integration provider name */ alias integrationProvider = ( | "dummy" - | "dalle_image_generator" - | "duckduckgo_search" | "hacker_news" | "weather" | "wikipedia" + | "spider" + | "brave" + | "browserbase" + // | "dalle_image_generator" + // | "duckduckgo_search" // | "twitter" // | "webpage" // | "requests" diff --git a/typespec/tools/models.tsp b/typespec/tools/models.tsp index b7478ee24..be0fb4f68 100644 --- a/typespec/tools/models.tsp +++ b/typespec/tools/models.tsp @@ -45,7 +45,7 @@ model FunctionDef { /** Integration definition */ model IntegrationDef { /** The provider of the integration */ - provider: integrationProvider; + provider: integrationProvider | string; /** The specific method of the integration to call */ method?: string; From f092a49e467252bda43a8cce7e099d6623a1644f Mon Sep 17 00:00:00 2001 From: ijindal1 <84316654+ijindal1@users.noreply.github.com> Date: Tue, 1 Oct 2024 08:57:48 -0700 Subject: [PATCH 020/113] Update README.md Updated the main image 1-line description --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71d87b6b3..37a3651be 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ The **Quick Start Guide Focused README** is the most promising for optimizing th English | [中文翻译](/README-CN.md)
- julep + julep

From 50a95ca3deeec537f5797bd534690d0eada4d43c Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Tue, 1 Oct 2024 22:14:11 +0300 Subject: [PATCH 021/113] fix(agents-api): Fix updating task execution (#542) > [!IMPORTANT] > Improves task execution updates by encoding task tokens with metadata and enhancing error handling in `raise_complete_async.py` and `update_execution.py`. > > - **Behavior**: > - In `raise_complete_async.py`, task tokens are now base64 encoded and include metadata with activity, run, and workflow IDs. > - In `update_execution.py`, added error handling for stopping and resuming executions, using metadata for async activity handle retrieval. > - **Database Queries**: > - In `get_paused_execution_token.py`, query updated to include `metadata` and sort by `created_at` with a limit of 1. > - **Error Handling**: > - Added try-except blocks in `update_execution.py` to handle exceptions when stopping or resuming executions. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for f3de5274bf994fd43c1e9bceee13440256101806. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: Diwank Singh Tomer --- .../task_steps/raise_complete_async.py | 19 ++++++---- .../execution/get_paused_execution_token.py | 5 ++- .../routers/tasks/update_execution.py | 35 ++++++++++++++----- 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/agents-api/agents_api/activities/task_steps/raise_complete_async.py b/agents-api/agents_api/activities/task_steps/raise_complete_async.py index 3944c914f..a73df3f8d 100644 --- a/agents-api/agents_api/activities/task_steps/raise_complete_async.py +++ b/agents-api/agents_api/activities/task_steps/raise_complete_async.py @@ -1,3 +1,4 @@ +import base64 from temporalio import activity from ...autogen.openapi_model import CreateTransitionRequest @@ -10,21 +11,27 @@ @activity.defn async def raise_complete_async(context: StepContext, output: StepOutcome) -> None: - # TODO: Create a transtition to "wait" and save the captured_token to the transition + + activity_info = activity.info() + + captured_token = base64.b64encode(activity_info.task_token).decode('ascii') + activity_id = activity_info.activity_id + workflow_run_id = activity_info.workflow_run_id + workflow_id = activity_info.workflow_id - captured_token = activity.info().task_token - captured_token = captured_token.decode("latin-1") transition_info = CreateTransitionRequest( current=context.cursor, type="wait", next=None, output=output, task_token=captured_token, + metadata={ + "x-activity-id": activity_id, + "x-run-id": workflow_run_id, + "x-workflow-id": workflow_id, + }, ) await original_transition_step(context, transition_info) - # await transition(context, output=output, type="wait", next=None, task_token=captured_token) - - print("transition to wait called") activity.raise_complete_async() diff --git a/agents-api/agents_api/models/execution/get_paused_execution_token.py b/agents-api/agents_api/models/execution/get_paused_execution_token.py index d8b0945c1..b4c9f9081 100644 --- a/agents-api/agents_api/models/execution/get_paused_execution_token.py +++ b/agents-api/agents_api/models/execution/get_paused_execution_token.py @@ -49,7 +49,7 @@ def get_paused_execution_token( """ get_query = """ - ?[task_token, max(created_at)] := + ?[task_token, created_at, metadata] := execution_id = to_uuid($execution_id), *executions { execution_id, @@ -59,9 +59,12 @@ def get_paused_execution_token( created_at, task_token, type, + metadata, }, type = "wait" + :sort -created_at + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/routers/tasks/update_execution.py b/agents-api/agents_api/routers/tasks/update_execution.py index 3f6b30e8c..a5ca30aab 100644 --- a/agents-api/agents_api/routers/tasks/update_execution.py +++ b/agents-api/agents_api/routers/tasks/update_execution.py @@ -1,3 +1,4 @@ +import base64 from typing import Annotated from uuid import UUID @@ -29,19 +30,35 @@ async def update_execution( match data: case StopExecutionRequest(): - wf_handle = temporal_client.get_workflow_handle_for( - *get_temporal_workflow_data(execution_id=execution_id) - ) - await wf_handle.cancel() + try: + wf_handle = temporal_client.get_workflow_handle_for( + *get_temporal_workflow_data(execution_id=execution_id) + ) + await wf_handle.cancel() + except Exception as e: + raise HTTPException(status_code=500, detail="Failed to stop execution") case ResumeExecutionRequest(): token_data = get_paused_execution_token( developer_id=x_developer_id, execution_id=execution_id ) - act_handle = temporal_client.get_async_activity_handle( - task_token=str.encode(token_data["task_token"], encoding="latin-1") - ) - await act_handle.complete(data.input) - print("Resumed execution successfully") + activity_id = token_data["metadata"].get("x-activity-id", None) + run_id = token_data["metadata"].get("x-run-id", None) + workflow_id = token_data["metadata"].get("x-workflow-id", None) + if activity_id is None or run_id is None or workflow_id is None: + act_handle = temporal_client.get_async_activity_handle( + task_token=base64.b64decode(token_data["task_token"].encode('ascii')), + ) + + else: + act_handle = temporal_client.get_async_activity_handle( + activity_id=activity_id, + workflow_id=workflow_id, + run_id=run_id, + ) + try: + await act_handle.complete(data.input) + except Exception as e: + raise HTTPException(status_code=500, detail="Failed to resume execution") case _: raise HTTPException(status_code=400, detail="Invalid request data") From 990ea1a0656f4edac0fc443205bc72bbe1ad8fe0 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Wed, 2 Oct 2024 20:05:05 +0300 Subject: [PATCH 022/113] fix(agents-api): Fix JobStatus name in get job endpoint (#544) > [!IMPORTANT] > Fixes `name` attribute in `get_job_status` in `routers.py` and updates string encoding and exception syntax in other files. > > - **Behavior**: > - Fixes `name` attribute in `get_job_status` function in `routers.py` to use `job_description.workflow_type` instead of `handle.id`. > - **Formatting**: > - Adjusts string encoding in `raise_complete_async.py` and `update_execution.py` to use double quotes for `ascii`. > - Updates exception raising syntax in `update_execution.py` for consistency. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for bfc84903d60c79b36497e21a1411df3133a4f099. It will automatically update as commits are pushed. --- .../task_steps/raise_complete_async.py | 4 +- agents-api/agents_api/routers/jobs/routers.py | 2 +- .../routers/tasks/update_execution.py | 8 +- agents-api/notebooks/03-summarise.ipynb | 4 +- agents-api/notebooks/RecSum-experiments.ipynb | 84 +++++++++++-------- 5 files changed, 60 insertions(+), 42 deletions(-) diff --git a/agents-api/agents_api/activities/task_steps/raise_complete_async.py b/agents-api/agents_api/activities/task_steps/raise_complete_async.py index a73df3f8d..54fd8a32c 100644 --- a/agents-api/agents_api/activities/task_steps/raise_complete_async.py +++ b/agents-api/agents_api/activities/task_steps/raise_complete_async.py @@ -1,4 +1,5 @@ import base64 + from temporalio import activity from ...autogen.openapi_model import CreateTransitionRequest @@ -11,10 +12,9 @@ @activity.defn async def raise_complete_async(context: StepContext, output: StepOutcome) -> None: - activity_info = activity.info() - captured_token = base64.b64encode(activity_info.task_token).decode('ascii') + captured_token = base64.b64encode(activity_info.task_token).decode("ascii") activity_id = activity_info.activity_id workflow_run_id = activity_info.workflow_run_id workflow_id = activity_info.workflow_id diff --git a/agents-api/agents_api/routers/jobs/routers.py b/agents-api/agents_api/routers/jobs/routers.py index fe1b25fa3..8bff6c7cc 100644 --- a/agents-api/agents_api/routers/jobs/routers.py +++ b/agents-api/agents_api/routers/jobs/routers.py @@ -50,7 +50,7 @@ async def get_job_status(job_id: UUID) -> JobStatus: state = map_job_status(job_description.status) return JobStatus( - name=handle.id, + name=job_description.workflow_type, reason=f"Execution status: {state}", created_at=job_description.start_time, updated_at=job_description.execution_time, diff --git a/agents-api/agents_api/routers/tasks/update_execution.py b/agents-api/agents_api/routers/tasks/update_execution.py index a5ca30aab..968b6bdfb 100644 --- a/agents-api/agents_api/routers/tasks/update_execution.py +++ b/agents-api/agents_api/routers/tasks/update_execution.py @@ -47,7 +47,9 @@ async def update_execution( workflow_id = token_data["metadata"].get("x-workflow-id", None) if activity_id is None or run_id is None or workflow_id is None: act_handle = temporal_client.get_async_activity_handle( - task_token=base64.b64decode(token_data["task_token"].encode('ascii')), + task_token=base64.b64decode( + token_data["task_token"].encode("ascii") + ), ) else: @@ -59,6 +61,8 @@ async def update_execution( try: await act_handle.complete(data.input) except Exception as e: - raise HTTPException(status_code=500, detail="Failed to resume execution") + raise HTTPException( + status_code=500, detail="Failed to resume execution" + ) case _: raise HTTPException(status_code=400, detail="Invalid request data") diff --git a/agents-api/notebooks/03-summarise.ipynb b/agents-api/notebooks/03-summarise.ipynb index a934fd1b9..98e6f5e0a 100644 --- a/agents-api/notebooks/03-summarise.ipynb +++ b/agents-api/notebooks/03-summarise.ipynb @@ -766,7 +766,9 @@ " messages.append(user(start_message))\n", "\n", " print(\"Starting chatml generation\")\n", - " trim_result = generate(messages, model=\"gpt-4-turbo\", temperature=0.1, stop=[\" Date: Wed, 2 Oct 2024 14:00:05 -0400 Subject: [PATCH 023/113] feat: Added temporal codec server route & cookbooks. Updated the CONTRIBUTING.md file (#543) Added temporal payload decoding route, updated setup instructions in `CONTRIBUTING.md`, and modified Docker and FastAPI configurations. - **New Features**: - Added `/temporal/decode` route in `router.py` for decoding temporal payloads using `PydanticEncodingPayloadConverter`. - **Documentation**: - Updated `CONTRIBUTING.md` with setup instructions, including environment setup, Docker volume creation, and running the project in single or multi-tenant mode. - **Configuration**: - Added `internal.router` to `web.py` to include the new internal routes. - Updated `docker-compose.yml` to expose port `8080` for `agents-api` and `agents-api-multi-tenant` services. --- CONTRIBUTING.md | 110 +++-- agents-api/.DS_Store | Bin 6148 -> 6148 bytes .../agents_api/routers/internal/__init__.py | 1 + .../agents_api/routers/internal/router.py | 28 ++ agents-api/agents_api/web.py | 2 + agents-api/docker-compose.yml | 6 +- .../01-Website_Crawler_using_Spider.ipynb | 322 ++++++++++++++ ...02-Sarcastic_News_Headline_Generator.ipynb | 359 +++++++++++++++ .../03-SmartResearcher_With_WebSearch.ipynb | 397 +++++++++++++++++ ...ripPlanner_With_Weather_And_WikiInfo.ipynb | 420 ++++++++++++++++++ 10 files changed, 1601 insertions(+), 44 deletions(-) create mode 100644 agents-api/agents_api/routers/internal/__init__.py create mode 100644 agents-api/agents_api/routers/internal/router.py create mode 100644 cookbooks/01-Website_Crawler_using_Spider.ipynb create mode 100644 cookbooks/02-Sarcastic_News_Headline_Generator.ipynb create mode 100644 cookbooks/03-SmartResearcher_With_WebSearch.ipynb create mode 100644 cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a9c4f24d9..e60c31973 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,44 +30,72 @@ Improvements to documentation are always appreciated! If you see areas that coul We'd love to hear your feedback and ideas for the project! Feel free to submit an issue or contact the maintainers directly to share your thoughts. Your input is very valuable in shaping the future direction of the project. -## Building Docker Images with Buildx Bake - -We use Docker Buildx Bake to build our Docker images. This allows us to build multiple images concurrently and efficiently. Follow these steps to build the Docker images: - -1. Ensure you have Docker and Docker Buildx installed on your system. - -2. Navigate to the root directory of the project where the `docker-bake.hcl` file is located. - -3. To build all services, run: - ``` - docker buildx bake --file docker-bake.hcl - ``` - -4. To build a specific service, use: - ``` - docker buildx bake --file docker-bake.hcl - ``` - Replace `` with one of the following: - - agents-api - - agents-api-worker - - cozo-migrate - - memory-store - - integrations - - gateway - - embedding-service-cpu - - embedding-service-gpu - -5. To set a custom tag for the images, use: - ``` - docker buildx bake --file docker-bake.hcl --set *.tags=myorg/myimage:v1.0 - ``` - Replace `myorg/myimage:v1.0` with your desired image name and tag. - -6. By default, the images are built with the "latest" tag. To specify a different tag, you can set the TAG variable: - ``` - docker buildx bake --file docker-bake.hcl --set TAG=v1.2.3 - ``` - -Note: The `docker-bake.hcl` file defines the build contexts, Dockerfiles, and tags for each service. If you need to modify the build process for a specific service, update the corresponding target in the `docker-bake.hcl` file. - -Thank you for your interest in contributing to this project! \ No newline at end of file +### Setup Instructions + +##### 1. Clone the Repository +Clone the repository from your preferred source: + +```bash +git clone +``` + +##### 2. Navigate to the Root Directory +Change to the root directory of the project: + +```bash +cd +``` + +##### 3. Set Up Environment Variables +- Create a `.env` file in the root directory. +- Refer to the `.env.example` file for a list of required variables. +- Ensure that all necessary variables are set in the `.env` file. + +##### 4. Create a Docker Volume for Backup +Create a Docker volume named `cozo_backup`: + +```bash +docker volume create cozo_backup +``` + +##### 5. Run the Project using Docker Compose +You can run the project in two different modes: **Single Tenant** or **Multi-Tenant**. Choose one of the following commands based on your requirement: + +###### Single-Tenant Mode +Run the project in single-tenant mode: + +```bash +docker compose --env-file .env --profile temporal-ui --profile single-tenant --profile embedding-cpu --profile self-hosted-db up --force-recreate --build --watch +``` + +> **Note:** In single-tenant mode, you can interact with the SDK directly without the need for the API KEY. + +###### Multi-Tenant Mode +Run the project in multi-tenant mode: + +```bash +docker compose --env-file .env --profile temporal-ui --profile multi-tenant --profile embedding-cpu --profile self-hosted-db up --force-recreate --build --watch +``` + +> **Note:** In multi-tenant mode, you need to generate a JWT token locally that act as an API KEY to interact with the SDK. + +##### 6. Generate a JWT Token (Only for Multi-Tenant Mode) + +To generate a JWT token, `jwt-cli` is required. Kindly install the same before proceeding with the next steps. + +Use the following command and replace `JWT_SHARED_KEY` with the corresponding key from your `.env` file to generate a JWT token: + +```bash +jwt encode --secret JWT_SHARED_KEY --alg HS512 --exp=$(date -j -v +10d +%s) --sub '00000000-0000-0000-0000-000000000000' '{}' +``` + +This command generates a JWT token that will be valid for 10 days. + +##### 7. Access and Interact +- **Temporal UI**: You can access the Temporal UI through the specified port in your `.env` file. +- **API Interactions**: Depending on the chosen mode, interact with the setup using the provided endpoints. + +##### Troubleshooting +- Ensure that all required Docker images are available. +- Check for missing environment variables in the `.env` file. +- Use the `docker compose logs` command to view detailed logs for debugging. \ No newline at end of file diff --git a/agents-api/.DS_Store b/agents-api/.DS_Store index f34bf5fc6ab49ff1afc9cc40f9c76332bc3f65db..04526ed473706adce6fc097c8f456c9f5425d70f 100644 GIT binary patch delta 161 zcmZoMXfc@JFUrioz`)4BAi%&-!cfc*&ydJaz>vB5BlB`bE07cyP#~Qll_3vVI;p(4 zASow52`IlKsURn_xWvHV8Y2@k3o9Et2RjEh$7CJmFkKE#4$gQ1iRx-219Ke(V?)DQ z9ffL3BLf`;6JxX5T22m8Wqs?Q`0SkAy!@`o8<^!8yEp%2;$xlIAh?;G<1aq|A2TM9 delta 85 zcmZoMXfc@JFU-Qgz`)4BAi%&-mQ-F`kd%|3wD}?PN=AN=1S^9cLm5LVLmorf dict: + body = json_format.Parse(await req.body(), Payloads()) + payloads = body.payloads + + decoded_payloads = [] + + for p in payloads: + data = converter.from_payload(p) + + if hasattr(data, "model_dump"): + data = data.model_dump() + + decoded_payloads.append({"data": data, "metadata": p.metadata}) + + return {"payloads": decoded_payloads} diff --git a/agents-api/agents_api/web.py b/agents-api/agents_api/web.py index fc730fe82..048887f68 100644 --- a/agents-api/agents_api/web.py +++ b/agents-api/agents_api/web.py @@ -24,6 +24,7 @@ from .routers import ( agents, docs, + internal, jobs, sessions, tasks, @@ -122,6 +123,7 @@ async def scalar_html(): app.include_router(jobs.router, dependencies=[Depends(get_api_key)]) app.include_router(docs.router, dependencies=[Depends(get_api_key)]) app.include_router(tasks.router, dependencies=[Depends(get_api_key)]) +app.include_router(internal.router) # TODO: CORS should be enabled only for JWT auth # diff --git a/agents-api/docker-compose.yml b/agents-api/docker-compose.yml index cc2f2b262..e086affbf 100644 --- a/agents-api/docker-compose.yml +++ b/agents-api/docker-compose.yml @@ -34,6 +34,9 @@ x--base-agents-api: &base-agents-api context: . dockerfile: Dockerfile + ports: + - "8080:8080" + develop: watch: - action: sync+restart @@ -54,9 +57,6 @@ services: - '' # Acts as a default profile. See: https://stackoverflow.com/questions/75758174/how-to-make-profile-default-for-docker-compose - single-tenant - ports: - - "8080:8080" - agents-api-multi-tenant: <<: *base-agents-api profiles: diff --git a/cookbooks/01-Website_Crawler_using_Spider.ipynb b/cookbooks/01-Website_Crawler_using_Spider.ipynb new file mode 100644 index 000000000..251e699f4 --- /dev/null +++ b/cookbooks/01-Website_Crawler_using_Spider.ipynb @@ -0,0 +1,322 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + " \"julep\"\n", + "
\n", + "\n", + "## Task Definition: Spider Crawler Integration without Agents\n", + "\n", + "### Overview\n", + "\n", + "This task is designed to generate a simple Spider Crawler and integrate it with the workflow to scrape data from the web.\n", + "\n", + "### Task Flow\n", + "\n", + "1. **Input**: The user provides a URL to crawl.\n", + "\n", + "2. **Spider Tool Integration**: \n", + " - Create a spider tool that can crawl the web and extract data from the given URL.\n", + "\n", + "3. **Output**: The final output is the extracted data from the given URL.\n", + "\n", + "This task leverages the Spider Crawler tool to extract data from the given URL." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Implementation\n", + "\n", + "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", + "\n", + "\n", + " \"Open\n", + "\n", + "\n", + "### Additional Information\n", + "\n", + "For more details about the task or if you have any questions, please don't hesitate to contact the author:\n", + "\n", + "**Author:** Julep AI \n", + "**Contact:** [hey@julep.ai](mailto:hey@julep.ai) or Discord" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Installing the Julep Client" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install julep -U --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### NOTE:\n", + "\n", + "- UUIDs are generated for both the agent and task to uniquely identify them within the system.\n", + "- Once created, these UUIDs should remain unchanged for simplicity.\n", + "- Altering a UUID will result in the system treating it as a new agent or task.\n", + "- If a UUID is changed, the original agent or task will continue to exist in the system alongside the new one." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Global UUID is generated for agent and task\n", + "import uuid\n", + "\n", + "AGENT_UUID = uuid.uuid4()\n", + "TASK_UUID = uuid.uuid4() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Julep Client with the API Key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from julep import Client\n", + "\n", + "api_key = \"\" # Your API key here\n", + "\n", + "# Create a client\n", + "client = Client(api_key=api_key, environment=\"dev\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an \"agent\"\n", + "\n", + "Agent is the object to which LLM settings, like model, temperature along with tools are scoped to.\n", + "\n", + "To learn more about the agent, please refer to the [documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#agent)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the agent\n", + "name = \"Jarvis\"\n", + "about = \"The original AI conscious the Iron Man.\"\n", + "default_settings = {\n", + " \"temperature\": 0.7,\n", + " \"top_p\": 1,\n", + " \"min_p\": 0.01,\n", + " \"presence_penalty\": 0,\n", + " \"frequency_penalty\": 0,\n", + " \"length_penalty\": 1.0,\n", + " \"max_tokens\": 150,\n", + "}\n", + "\n", + "\n", + "# Create the agent\n", + "agent = client.agents.create_or_update(\n", + " agent_id=AGENT_UUID,\n", + " name=name,\n", + " about=about,\n", + " model=\"gpt-4o\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining a Task\n", + "\n", + "Tasks in Julep are Github Actions style workflows that define long-running, multi-step actions. \n", + "You can use them to conduct complex actions by defining them step-by-step. They have access to all Julep integrations.\n", + "\n", + "To learn more about tasks, visit [Julep documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#task)." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "import yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo search tool.\n", + "\n", + "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# defining the task definition\n", + "task_def = yaml.safe_load(\"\"\"\n", + "name: Agent Crawler\n", + "\n", + "tools:\n", + "- name: spider_crawler\n", + " type: integration\n", + " integration:\n", + " provider: spider\n", + " setup:\n", + " spider_api_key: \"your_spider_api_key\"\n", + "\n", + "main:\n", + "- tool: spider_crawler\n", + " arguments:\n", + " url: '\"https://spider.cloud\"'\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# creating the task object\n", + "task = client.tasks.create_or_update(\n", + " task_id=TASK_UUID,\n", + " agent_id=AGENT_UUID,\n", + " **task_def\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an Execution\n", + "\n", + "An execution is a single run of a task. It is a way to run a task with a specific set of inputs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creates a execution worflow for the Task defined in the yaml file." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# creating an execution object\n", + "execution = client.executions.create(\n", + " task_id=TASK_UUID,\n", + " input={}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# getting the execution details\n", + "execution = client.executions.get(execution.id)\n", + "#printing the output\n", + "execution.output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Retrieves and lists all the steps of a defined task that have been executed up to that point in time. Unlike streaming, this function does not continuously monitor the execution; it only provides a snapshot of the steps completed so far without displaying real-time updates as the task progresses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.list(execution_id=execution.id).items" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Continuously monitor and stream the steps of a defined task. It retrieves and displays the transitions or execution steps of the task identified by execution.id in real-time, showing each step sequentially until the task is either completed or an error causes it to terminate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.stream(execution_id=execution.id)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ai", + "language": "python", + "name": "python3" + }, + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb b/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb new file mode 100644 index 000000000..618d95df9 --- /dev/null +++ b/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb @@ -0,0 +1,359 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " \"julep\"\n", + "
\n", + "\n", + "## Task Definition: Sarcastic News Headline Generator using Brave Search Integration\n", + "\n", + "### Overview\n", + "\n", + "This task generates a sarcastic news headline on a user-provided topic. It utilizes web search to gather context and information about the topic, then uses this data to create a headline with a sarcastic tone. \n", + "\n", + "### Task Flow\n", + "\n", + "1. **Input**: \n", + " - User provides a topic for the sarcastic news headline (e.g., \"technology\" or \"politics\").\n", + "\n", + "2. **Web Search using Bravesearch Integration**: \n", + " - Conducts a search to find information about the topic, focusing on humorous or quirky content.\n", + " - Gathers relevant context and amusing details for headline generation.\n", + "\n", + "3. **Headline Creation**: \n", + " - Generates a sarcastic news headline based on the topic and gathered information.\n", + " - Combines factual or common perceptions with humor and sarcasm.\n", + " \n", + "4. **Output**: \n", + " - Produces a sarcastic, witty headline on the given topic.\n", + " - Can be used for entertainment or as a creative writing prompt.\n", + "\n", + "### Key Features\n", + "\n", + "- Leverages web search to enhance contextual relevance of sarcastic content.\n", + "- Combines real-world information with humorous twists for engaging headlines.\n", + "- Adaptable to various topics, allowing for diverse and creative outputs.\n", + "\n", + "```plaintext\n", + "+----------+ +------------+ +------------+ +-----------+\n", + "| User | | Brave | | Agent | | Sarcastic |\n", + "| Input | --> | Search | --> | Processing | --> | Headline |\n", + "| (Topic) | | | | | | Output |\n", + "+----------+ +------------+ +------------+ +-----------+\n", + " | | | |\n", + " | | | |\n", + " v v v v\n", + " \"politics\" Find funny Generate witty \"Area Man Still\n", + " content headline Believes in Democracy\"\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", + "\n", + "\n", + " \"Open\n", + "\n", + "\n", + "### Additional Information\n", + "\n", + "For more details about the task or if you have any questions, please don't hesitate to contact the author:\n", + "\n", + "**Author:** Julep AI \n", + "**Contact:** [hey@julep.ai](mailto:hey@julep.ai) or Discord" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Installing the Julep Client" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install julep -U --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### NOTE:\n", + "\n", + "- UUIDs are generated for both the agent and task to uniquely identify them within the system.\n", + "- Once created, these UUIDs should remain unchanged for simplicity.\n", + "- Altering a UUID will result in the system treating it as a new agent or task.\n", + "- If a UUID is changed, the original agent or task will continue to exist in the system alongside the new one." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Global UUID is generated for agent and task\n", + "import uuid\n", + "\n", + "AGENT_UUID = uuid.uuid4()\n", + "TASK_UUID = uuid.uuid4() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Julep Client with the API Key" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from julep import Client\n", + "\n", + "api_key = \"\" # Your API key here\n", + "\n", + "# Create a client\n", + "client = Client(api_key=api_key, environment=\"dev\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an \"agent\"\n", + "\n", + "\n", + "Agent is the object to which LLM settings, like model, temperature along with tools are scoped to.\n", + "\n", + "To learn more about the agent, please refer to the [documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#agent)." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the agent\n", + "name = \"Jarvis\"\n", + "about = \"The original AI conscious the Iron Man.\"\n", + "default_settings = {\n", + " \"temperature\": 0.7,\n", + " \"top_p\": 1,\n", + " \"min_p\": 0.01,\n", + " \"presence_penalty\": 0,\n", + " \"frequency_penalty\": 0,\n", + " \"length_penalty\": 1.0,\n", + " \"max_tokens\": 150,\n", + "}\n", + "\n", + "\n", + "# Create the agent\n", + "agent = client.agents.create_or_update(\n", + " agent_id=AGENT_UUID,\n", + " name=name,\n", + " about=about,\n", + " model=\"gpt-4o\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining a Task\n", + "\n", + "Tasks in Julep are Github Actions style workflows that define long-running, multi-step actions. \n", + "You can use them to conduct complex actions by defining them step-by-step. They have access to all Julep integrations.\n", + "\n", + "To learn more about tasks, visit [Julep documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#task)." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "import yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo search tool.\n", + "\n", + "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# defining the task definition\n", + "task_def = yaml.safe_load(\"\"\"\n", + "name: Sarcasm Headline Generator\n", + "\n", + "tools:\n", + "- name: brave_search\n", + " type: integration\n", + " integration:\n", + " provider: brave\n", + " setup:\n", + " api_key: \"YOU_API_KEY\"\n", + "\n", + "main:\n", + "- tool: brave_search\n", + " arguments:\n", + " query: \"_.topic + ' funny'\"\n", + "\n", + "- prompt:\n", + " - role: system\n", + " content: >-\n", + " write a sarcastic news headline on the topic of {{inputs[0].topic}}.\n", + " Here's some more info on this: {{_}}\n", + " unwrap: true\n", + "\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# creating the task object\n", + "task = client.tasks.create_or_update(\n", + " task_id=TASK_UUID,\n", + " agent_id=AGENT_UUID,\n", + " **task_def\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an Execution\n", + "\n", + "An execution is a single run of a task. It is a way to run a task with a specific set of inputs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creates a execution worflow for the Task defined in the yaml file." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# creating an execution object\n", + "execution = client.executions.create(\n", + " task_id=TASK_UUID,\n", + " input={\n", + " \"topic\": \"elon musk\"\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# getting the execution details\n", + "execution = client.executions.get(execution.id)\n", + "#printing the output\n", + "execution.output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Retrieves and lists all the steps of a defined task that have been executed up to that point in time. Unlike streaming, this function does not continuously monitor the execution; it only provides a snapshot of the steps completed so far without displaying real-time updates as the task progresses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.list(execution_id=execution.id).items" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Continuously monitor and stream the steps of a defined task. It retrieves and displays the transitions or execution steps of the task identified by execution.id in real-time, showing each step sequentially until the task is either completed or an error causes it to terminate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.stream(execution_id=execution.id)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ai", + "language": "python", + "name": "python3" + }, + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/cookbooks/03-SmartResearcher_With_WebSearch.ipynb b/cookbooks/03-SmartResearcher_With_WebSearch.ipynb new file mode 100644 index 000000000..b32d0f95b --- /dev/null +++ b/cookbooks/03-SmartResearcher_With_WebSearch.ipynb @@ -0,0 +1,397 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " \"julep\"\n", + "
\n", + "\n", + "## Task: Research Assistant with Web Search Integration\n", + "\n", + "### Overview\n", + "\n", + "This task is designed to conduct comprehensive research on multiple user-provided topics. It leverages web search capabilities to gather up-to-date information and generates relevant keywords for each topic, streamlining the research process through efficient tool integration and parallel processing.\n", + "\n", + "### Task Flow\n", + "\n", + "1. **User Input**\n", + " - User provides a list of research topics\n", + " - Each topic is processed individually\n", + "\n", + "2. **Web Search and Information Gathering**\n", + " - Utilizes BraveWeb to conduct searches for each topic\n", + " - Retrieves latest news and relevant information\n", + "\n", + "3. **Intelligent Analysis**\n", + " - System analyzes search results (HTML snippets)\n", + " - Generates Wikipedia keywords related to each topic\n", + " - AI assistant identifies most relevant keywords based on search content\n", + "\n", + "4. **Parallel Processing**\n", + " - Implements concurrent topic processing\n", + " - Enhances efficiency and reduces overall research time\n", + "\n", + "### Key Features\n", + "\n", + "- **Multi-topic Research**: Handles multiple research topics simultaneously\n", + "- **Up-to-date Information**: Utilizes web search to access current data\n", + "- **Keyword Generation**: Provides relevant Wikipedia keywords for each topic\n", + "- **AI-assisted Analysis**: Employs AI to identify and prioritize key information\n", + "- **Efficient Processing**: Leverages parallel processing for faster results\n", + "\n", + "### Output\n", + "\n", + "- Comprehensive list of relevant Wikipedia keywords for each input topic\n", + "- Curated, up-to-date information gathered from web searches\n", + "\n", + "This workflow provides a robust, efficient approach to in-depth topic exploration, combining the power of web search, AI analysis, and parallel processing.\n", + "\n", + "```plaintext\n", + "\n", + "+----------------+ +--------------------------+ +-----------------+ +------------------------+ +-------------------------+\n", + "| User Input | | Web Search & Information | | Intelligent | | Parallel Processing | | Output Stage |\n", + "|(List of Topics)| --> | Gathering (BraveWeb) | --> | Analysis | --> | (Concurrent Execution) | --> | Summarized Research |\n", + "| | | | | | | | | (Final Report) |\n", + "+----------------+ +--------------------------+ +-----------------+ +------------------------+ +-------------------------+\n", + " | | | | |\n", + " | | | | |\n", + " v v v v v\n", + " Topic 1, Topic 2, ... Retrieve HTML snippets Extract Wikipedia Process multiple Compile summary and \n", + " Each topic processed from search results keywords from HTML topics concurrently present most relevant \n", + " individually. for each topic. snippets, analyze for faster results. findings per topic.\n", + " relevance.\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Implementation\n", + "\n", + "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", + "\n", + "\n", + " \"Open\n", + "\n", + "\n", + "### Additional Information\n", + "\n", + "For more details about the task or if you have any questions, please don't hesitate to contact the author:\n", + "\n", + "**Author:** Julep AI \n", + "**Contact:** [hey@julep.ai](mailto:hey@julep.ai) or Discord" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Installing the Julep Client" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install julep -U --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### NOTE:\n", + "\n", + "- UUIDs are generated for both the agent and task to uniquely identify them within the system.\n", + "- Once created, these UUIDs should remain unchanged for simplicity.\n", + "- Altering a UUID will result in the system treating it as a new agent or task.\n", + "- If a UUID is changed, the original agent or task will continue to exist in the system alongside the new one." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Global UUID is generated for agent and task\n", + "import uuid\n", + "\n", + "AGENT_UUID = uuid.uuid4()\n", + "TASK_UUID = uuid.uuid4()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Julep Client with the API Key" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from julep import Client\n", + "\n", + "api_key = \"\" # Your API key here\n", + "\n", + "# Create a client\n", + "client = Client(api_key=api_key, environment=\"dev\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an \"agent\"\n", + "\n", + "\n", + "Agent is the object to which LLM settings, like model, temperature along with tools are scoped to.\n", + "\n", + "To learn more about the agent, please refer to the [documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#agent)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the agent\n", + "name = \"Jarvis\"\n", + "about = \"The original AI conscious the Iron Man.\"\n", + "default_settings = {\n", + " \"temperature\": 0.7,\n", + " \"top_p\": 1,\n", + " \"min_p\": 0.01,\n", + " \"presence_penalty\": 0,\n", + " \"frequency_penalty\": 0,\n", + " \"length_penalty\": 1.0,\n", + " \"max_tokens\": 150,\n", + "}\n", + "\n", + "\n", + "# Create the agent\n", + "agent = client.agents.create_or_update(\n", + " agent_id=AGENT_UUID,\n", + " name=name,\n", + " about=about,\n", + " model=\"gpt-4o\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining a Task\n", + "\n", + "Tasks in Julep are Github Actions style workflows that define long-running, multi-step actions. \n", + "You can use them to conduct complex actions by defining them step-by-step. They have access to all Julep integrations.\n", + "\n", + "To learn more about tasks, visit [Julep documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#task)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo and Wikipedia tool.\n", + "\n", + "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "task_def= yaml.safe_load(\"\"\"\n", + "name: Research Assistant to find Wikipedia Keywords\n", + "\n", + "input_schema:\n", + " type: object\n", + " properties:\n", + " topics:\n", + " type: array\n", + " items:\n", + " type: string\n", + " description: The topics to search for.\n", + "\n", + "tools:\n", + "- name: brave_search\n", + " type: integration\n", + " integration:\n", + " provider: brave\n", + " setup:\n", + " api_key: \"YOUR_API_KEY\"\n", + "\n", + "main:\n", + "- over: _.topics\n", + " map:\n", + " tool: brave_search\n", + " arguments:\n", + " query: \"'the latest news about ' + _\"\n", + "\n", + "- over: _\n", + " parallelism: 2\n", + " map:\n", + " prompt:\n", + " - role: system\n", + " content: >-\n", + " You are a research assistant.\n", + " I need you to do in-depth research on topics trending in the news currently.\n", + " Based on the following latest html news snippet, come up with a list of wikipedia keywords to search:\n", + " \"{{_}}\"\n", + " Your response should be a list of keywords, separated by commas. Do not add any other text.\n", + " Example: `KEYWORDS: keyword1, keyword2, keyword3`\n", + "\n", + " unwrap: true\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# creating the task object\n", + "task = client.tasks.create_or_update(\n", + " task_id=TASK_UUID,\n", + " agent_id=AGENT_UUID,\n", + " **task_def\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an Execution\n", + "\n", + "An execution is a single run of a task. It is a way to run a task with a specific set of inputs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creates a execution worflow for the Task defined in the yaml file." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "execution= client.executions.create(\n", + " task_id=task.id,\n", + " input={\n", + " \"topics\": [\"Burger King Cup on the Ground Behind a Wendy’s\",\"Forbidden Chemical X\",\"Finger Bracelets\",\"Amusing Notions\"]\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "execution.id" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# getting the execution details\n", + "execution = client.executions.get(execution.id)\n", + "#printing the outpu\n", + "execution.output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Retrieves and lists all the steps of a defined task that have been executed up to that point in time. Unlike streaming, this function does not continuously monitor the execution; it only provides a snapshot of the steps completed so far without displaying real-time updates as the task progresses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.list(execution_id=execution.id).items" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Continuously monitor and stream the steps of a defined task. It retrieves and displays the transitions or execution steps of the task identified by execution.id in real-time, showing each step sequentially until the task is either completed or an error causes it to terminate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.stream(execution_id=execution.id)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ai", + "language": "python", + "name": "python3" + }, + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb new file mode 100644 index 000000000..cfc95f3c2 --- /dev/null +++ b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb @@ -0,0 +1,420 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "div align=\"center\">\n", + " \"julep\"\n", + "\n", + "\n", + "## Task: Travel Itinerary Assistant with Weather and Wikipedia Integrations\n", + "\n", + "### Overview\n", + "\n", + "The Travel Itinerary Assistant helps users plan a travel itinerary that takes into account current weather conditions and local tourist attractions. By integrating data from Wikipedia for tourist attractions and using a weather API for real-time weather updates, the tool provides a comprehensive travel plan tailored to each location. The generated itinerary suggests appropriate activities based on the weather, enhancing the overall travel experience.\n", + "\n", + "### Task Flow\n", + "\n", + "1. **User Input**\n", + " - User provides a list of desired travel locations.\n", + " - Each location is processed individually to gather the required data.\n", + "\n", + "2. **Weather Data Retrieval**\n", + " - Fetch current weather data for each location using a weather API.\n", + " - Extract relevant weather details, such as temperature, weather condition, and recommendations.\n", + "\n", + "3. **Tourist Attractions Lookup**\n", + " - Use Wikipedia to search for the top tourist attractions for each location.\n", + " - The query format used is: `\" tourist attractions\"`.\n", + " - Retrieve and compile a list of popular tourist spots and landmarks.\n", + "\n", + "4. **Data Evaluation and Integration**\n", + " - Combine weather data and tourist attractions into a unified list for each location.\n", + " - Format the data into a structured tuple: `(location, weather, attractions)`.\n", + "\n", + "5. **Itinerary Generation**\n", + " - Create a detailed travel itinerary based on:\n", + " - Current weather conditions (e.g., sunny, rainy, cloudy).\n", + " - Top tourist attractions for each location.\n", + " - Suggested activities categorized as indoor or outdoor based on weather.\n", + "\n", + "### Key Features\n", + "\n", + "- **Multi-location Travel Planning**: Handles multiple destinations simultaneously, offering a consolidated travel plan.\n", + "- **Real-time Weather Data**: Leverages weather APIs to provide up-to-date weather conditions.\n", + "- **Tourist Attraction Discovery**: Integrates Wikipedia to find and recommend popular attractions.\n", + "- **Intelligent Itinerary Suggestions**: Suggests indoor or outdoor activities based on the weather.\n", + "- **Comprehensive Itinerary Output**: Combines weather and tourist data into a user-friendly travel plan.\n", + "\n", + "### Output\n", + "\n", + "- A detailed travel itinerary for each location\n", + "- Curated, up-to-date information gathered from weather searches and Wikipedia\n", + "\n", + "```plaintext\n", + "\n", + "+----------------+ +--------------------------+ +--------------------------+ +------------------------------+ +-------------------------+\n", + "| User Input | | Weather Data Retrieval | | Tourist Attractions | | Data Evaluation & Integration| | Itinerary Generation |\n", + "| (List of | --> | (Weather API) | --> | Lookup (Wikipedia) | --> | (Combine Weather & | --> | (Generate Suggested |\n", + "| Locations) | | | | | | Attractions Data) | | Activities/Plan) |\n", + "+----------------+ +--------------------------+ +--------------------------+ +------------------------------+ +-------------------------+\n", + " | | | | |\n", + " | | | | |\n", + " v v v v v\n", + "Location 1, Location 2, ... Fetch weather for each Search Wikipedia for Combine weather data and Create itinerary with\n", + "Each location processed location individually, \" tourist tourist attractions into suggested activities\n", + "individually for extracting temp., attractions\", retrieve a structured tuple: based on weather and\n", + "weather data. conditions, & top spots. (location, weather, attractions.\n", + " recommendations. attractions).\n", + "```\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", + "\n", + "\n", + " \"Open\n", + "\n", + "\n", + "### Additional Information\n", + "\n", + "For more details about the task or if you have any questions, please don't hesitate to contact the author:\n", + "\n", + "**Author:** Julep AI \n", + "**Contact:** [hey@julep.ai](mailto:hey@julep.ai) or Discord" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Installing the Julep Client" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install julep -U --quiet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### NOTE:\n", + "\n", + "- UUIDs are generated for both the agent and task to uniquely identify them within the system.\n", + "- Once created, these UUIDs should remain unchanged for simplicity.\n", + "- Altering a UUID will result in the system treating it as a new agent or task.\n", + "- If a UUID is changed, the original agent or task will continue to exist in the system alongside the new one." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Global UUID is generated for agent and task\n", + "import uuid\n", + "\n", + "AGENT_UUID = uuid.uuid4()\n", + "TASK_UUID = uuid.uuid4() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Julep Client with the API Key" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "from julep import Client\n", + "\n", + "api_key = \"\" # Your API key here\n", + "\n", + "# Create a client\n", + "client = Client(api_key=api_key, environment=\"dev\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an \"agent\"\n", + "\n", + "\n", + "Agent is the object to which LLM settings, like model, temperature along with tools are scoped to.\n", + "\n", + "To learn more about the agent, please refer to the [documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#agent)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining the agent\n", + "name = \"Jarvis\"\n", + "about = \"The original AI conscious the Iron Man.\"\n", + "default_settings = {\n", + " \"temperature\": 0.7,\n", + " \"top_p\": 1,\n", + " \"min_p\": 0.01,\n", + " \"presence_penalty\": 0,\n", + " \"frequency_penalty\": 0,\n", + " \"length_penalty\": 1.0,\n", + " \"max_tokens\": 150,\n", + "}\n", + "\n", + "# Create the agent\n", + "agent = client.agents.create_or_update(\n", + " agent_id=AGENT_UUID,\n", + " name=name,\n", + " about=about,\n", + " model=\"gpt-4o\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining a Task\n", + "\n", + "Tasks in Julep are Github Actions style workflows that define long-running, multi-step actions. \n", + "You can use them to conduct complex actions by defining them step-by-step. They have access to all Julep integrations.\n", + "\n", + "To learn more about tasks, visit [Julep documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md#task)." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "import yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo and Wikipedia tool.\n", + "\n", + "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "task_def = yaml.safe_load(\"\"\"\n", + "name: Tourist Plan With Weather And Attractions\n", + "\n", + "input_schema:\n", + " type: object\n", + " properties:\n", + " locations:\n", + " type: array\n", + " items:\n", + " type: string\n", + " description: The locations to search for.\n", + "\n", + "tools:\n", + "- name: wikipedia\n", + " type: integration\n", + " integration:\n", + " provider: wikipedia\n", + "\n", + "- name: weather\n", + " type: integration\n", + " integration:\n", + " provider: weather\n", + " setup:\n", + " openweathermap_api_key: \"YOUR_API_KEY\"\n", + "\n", + "main:\n", + "- over: inputs[0].locations\n", + " map:\n", + " tool: weather\n", + " arguments:\n", + " location: _\n", + "\n", + "- over: inputs[0].locations\n", + " map:\n", + " tool: wikipedia\n", + " arguments:\n", + " query: \"_ + ' tourist attractions'\"\n", + "\n", + "- evaluate:\n", + " zipped: \"list(zip(inputs[0].locations, [output['result'] for output in outputs[0]], [output['documents'][0]['page_content'] for output in outputs[1]]))\" # [(location, weather, attractions)]\n", + "\n", + "\n", + "- over: _['zipped']\n", + " parallelism: 3\n", + " map:\n", + " prompt:\n", + " - role: system\n", + " content: >-\n", + " You are a travel assistant. Your task is to create a detailed itinerary for visiting tourist attractions in \"{{_[0]}}\" based on the weather conditions and the top tourist attractions provided.\n", + " \n", + " Current weather condition at \"{{_[0]}}\":\n", + " \"{{_[1]}}\"\n", + "\n", + " Top tourist attractions in \"{{_[0]}}\":\n", + " \"{{_[2]}}\"\n", + "\n", + " Suggest outdoor or indoor activities based on the above information.\n", + " unwrap: true\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# creating the task object\n", + "task = client.tasks.create_or_update(\n", + " task_id=TASK_UUID,\n", + " agent_id=AGENT_UUID,\n", + " **task_def\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating an Execution\n", + "\n", + "An execution is a single run of a task. It is a way to run a task with a specific set of inputs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creates a execution worflow for the Task defined in the yaml file." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "execution = client.executions.create(\n", + " task_id=task.id,\n", + " input={\n", + " \"locations\": [\"New York\", \"London\", \"Paris\", \"Tokyo\", \"Sydney\"]\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "execution.id" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# getting the execution details\n", + "execution = client.executions.get(execution.id)\n", + "#printing the output\n", + "execution.output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Retrieves and lists all the steps of a defined task that have been executed up to that point in time. Unlike streaming, this function does not continuously monitor the execution; it only provides a snapshot of the steps completed so far without displaying real-time updates as the task progresses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.list(execution_id=execution.id).items" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Continuously monitor and stream the steps of a defined task. It retrieves and displays the transitions or execution steps of the task identified by execution.id in real-time, showing each step sequentially until the task is either completed or an error causes it to terminate." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "client.executions.transitions.stream(execution_id=execution.id)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ai", + "language": "python", + "name": "python3" + }, + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9c38645da61226ba8a3fdbab39b78a6eb9aa1f21 Mon Sep 17 00:00:00 2001 From: Vedant Sahai Date: Wed, 2 Oct 2024 15:06:29 -0400 Subject: [PATCH 024/113] doc: Added Readme for cookbooks and updated the Colab links (#550) > [!IMPORTANT] > Add `README.md` to `cookbooks` with Jupyter notebook overview and Colab links. > > - **Documentation**: > - Adds `README.md` to `cookbooks` directory. > - Provides an overview of Jupyter notebooks for AI tasks. > - Includes Colab links for each notebook: `01-Website_Crawler_using_Spider.ipynb`, `02-Sarcastic_News_Headline_Generator.ipynb`, `03-SmartResearcher_With_WebSearch.ipynb`, `04-TripPlanner_With_Weather_And_WikiInfo.ipynb`. > - Contact information and contribution guidelines included. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for a1ad58e6c8b460962b4b76ee428f9e7934f1be25. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: Diwank Singh Tomer --- .../01-Website_Crawler_using_Spider.ipynb | 4 +-- ...02-Sarcastic_News_Headline_Generator.ipynb | 2 +- .../03-SmartResearcher_With_WebSearch.ipynb | 2 +- ...ripPlanner_With_Weather_And_WikiInfo.ipynb | 2 +- cookbooks/README.md | 29 +++++++++++++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 cookbooks/README.md diff --git a/cookbooks/01-Website_Crawler_using_Spider.ipynb b/cookbooks/01-Website_Crawler_using_Spider.ipynb index 251e699f4..36a77d525 100644 --- a/cookbooks/01-Website_Crawler_using_Spider.ipynb +++ b/cookbooks/01-Website_Crawler_using_Spider.ipynb @@ -30,11 +30,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Implementation\n", + "## Implementation\n", "\n", "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", "\n", - "\n", + "\n", " \"Open\n", "\n", "\n", diff --git a/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb b/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb index 618d95df9..fded810a1 100644 --- a/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb +++ b/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb @@ -60,7 +60,7 @@ "\n", "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", "\n", - "\n", + "\n", " \"Open\n", "\n", "\n", diff --git a/cookbooks/03-SmartResearcher_With_WebSearch.ipynb b/cookbooks/03-SmartResearcher_With_WebSearch.ipynb index b32d0f95b..c01b54652 100644 --- a/cookbooks/03-SmartResearcher_With_WebSearch.ipynb +++ b/cookbooks/03-SmartResearcher_With_WebSearch.ipynb @@ -73,7 +73,7 @@ "\n", "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", "\n", - "\n", + "\n", " \"Open\n", "\n", "\n", diff --git a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb index cfc95f3c2..d7fc39840 100644 --- a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb +++ b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb @@ -80,7 +80,7 @@ "\n", "To recreate the notebook and see the code implementation for this task, you can access the Google Colab notebook using the link below:\n", "\n", - "\n", + "\n", " \"Open\n", "\n", "\n", diff --git a/cookbooks/README.md b/cookbooks/README.md new file mode 100644 index 000000000..2b89ca22a --- /dev/null +++ b/cookbooks/README.md @@ -0,0 +1,29 @@ +
+ julep +
+ +# Julep AI - Notebook Overview + +Welcome to the **Julep AI Notebook Collection**! This directory contains a set of Jupyter notebooks designed for a variety of AI and automation tasks. + +Each notebook explores a unique use case, ranging from web crawling to running complex workflows using AI Agents. + +Below is a quick overview of the notebooks, their purpose, and a link to run each of them on Google Colab. + +| **Notebook Name** | **Colab Link** | **Description** | +|------------------------------------------------- |---------------------------------------------------------------------------- |--------------------------------------------------------------------| +| `01-Website_Crawler_using_Spider.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) | Implements a web crawler using a spider to extract website content. | +| `02-Sarcastic_News_Headline_Generator.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb) | Generates sarcastic news headlines using a Brave Search Tool. | +| `03-SmartResearcher_With_WebSearch.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) | Searches and aggregates web information for research purposes using Brave Search. | +| `04-TripPlanner_With_Weather_And_WikiInfo.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) | Plans trips using weather data and Wikipedia information. | + +### Additional Information + +For more details about the task or if you have any questions, please don't hesitate to contact the author: + +**Author:** Julep AI +**Contact:** [hey@julep.ai](mailto:hey@julep.ai) or Discord + +--- + +If you have feedback or would like to contribute to the notebooks, feel free to open an issue(s) in the [repository](https://github.com/julep-ai/julep). From 4d12e8bae1948459cc21fc95f4d41ac5eac0db45 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Wed, 2 Oct 2024 16:23:11 -0400 Subject: [PATCH 025/113] doc: Add ideas to implement in cookbooks/README.md Signed-off-by: Diwank Singh Tomer --- cookbooks/README.md | 150 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 139 insertions(+), 11 deletions(-) diff --git a/cookbooks/README.md b/cookbooks/README.md index 2b89ca22a..e7a6bfa89 100644 --- a/cookbooks/README.md +++ b/cookbooks/README.md @@ -4,26 +4,154 @@ # Julep AI - Notebook Overview -Welcome to the **Julep AI Notebook Collection**! This directory contains a set of Jupyter notebooks designed for a variety of AI and automation tasks. +Welcome to the **Julep AI Notebook Collection**! This directory contains a set of Jupyter notebooks designed to showcase various AI and automation tasks using Julep's features. -Each notebook explores a unique use case, ranging from web crawling to running complex workflows using AI Agents. +Each notebook explores a unique use case, demonstrating different aspects of Julep's capabilities. Below is a quick overview of the notebooks, their purpose, and a link to run each of them on Google Colab. -Below is a quick overview of the notebooks, their purpose, and a link to run each of them on Google Colab. +| **Notebook Name** | **Colab Link** | **Description** | **Implemented** | +|------------------------------------------------- |---------------------------------------------------------------------------- |--------------------------------------------------------------------|-----------------| +| `01-Website_Crawler_using_Spider.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) | Implements a web crawler using a spider to extract website content. | Yes | +| `02-Sarcastic_News_Headline_Generator.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb) | Generates sarcastic news headlines using a Brave Search Tool. | Yes | +| `03-SmartResearcher_With_WebSearch.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) | Searches and aggregates web information for research purposes using Brave Search. | Yes | +| `04-TripPlanner_With_Weather_And_WikiInfo.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) | Plans trips using weather data and Wikipedia information. | Yes | +| `05-Basic_Agent_Creation_and_Interaction.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/05-Basic_Agent_Creation_and_Interaction.ipynb) | Demonstrates how to create a basic agent and interact with it. | No | +| `06-Designing_Multi-Step_Tasks.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/06-Designing_Multi-Step_Tasks.ipynb) | Explores creating tasks with various step types. | No | +| `07-Integrating_External_Tools_and_APIs.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/07-Integrating_External_Tools_and_APIs.ipynb) | Shows how to integrate and use external tools and APIs. | No | +| `08-Managing_Persistent_Sessions.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/08-Managing_Persistent_Sessions.ipynb) | Covers creating and managing persistent sessions with context. | No | +| `09-User_Management_and_Personalization.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/09-User_Management_and_Personalization.ipynb) | Demonstrates user management and personalized interactions. | No | +| `10-Document_Management_and_Search.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/10-Document_Management_and_Search.ipynb) | Explores document upload, management, and search capabilities. | No | +| `11-Advanced_Chat_Interactions.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/11-Advanced_Chat_Interactions.ipynb) | Covers advanced chat features and context handling. | No | +| `12-Monitoring_Task_Executions.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/12-Monitoring_Task_Executions.ipynb) | Shows how to monitor and manage task executions. | No | +| `13-Error_Handling_and_Recovery.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/13-Error_Handling_and_Recovery.ipynb) | Demonstrates implementing error handling and recovery in tasks. | No | +| `14-API_Versioning_and_Configurations.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/14-API_Versioning_and_Configurations.ipynb) | Explores API versioning and server configuration options. | No | -| **Notebook Name** | **Colab Link** | **Description** | -|------------------------------------------------- |---------------------------------------------------------------------------- |--------------------------------------------------------------------| -| `01-Website_Crawler_using_Spider.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) | Implements a web crawler using a spider to extract website content. | -| `02-Sarcastic_News_Headline_Generator.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb) | Generates sarcastic news headlines using a Brave Search Tool. | -| `03-SmartResearcher_With_WebSearch.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) | Searches and aggregates web information for research purposes using Brave Search. | -| `04-TripPlanner_With_Weather_And_WikiInfo.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) | Plans trips using weather data and Wikipedia information. | +## Potential Cookbooks for Contributors + +We welcome contributions to expand our cookbook collection. Here are some ideas for new cookbooks that showcase various Julep features and use cases: + +| **Potential Cookbook Name** | **Description** | **Key Features** | +|---------------------------- |----------------- |------------------| +| Automated Research Assistant | Conducts research on given topics using web search and summarization | Web search, Tool integration, Multi-step tasks | +| Customer Support Chatbot | Interacts with users, analyzes sentiment, and routes complex issues | Chat functionality, Sentiment analysis, Conditional logic | +| Daily News Aggregator | Collects and summarizes news articles, emails summaries to subscribers | Scheduled tasks, Email integration, Content summarization | +| Social Media Monitoring System | Monitors social platforms for keywords and sends alerts | API integration, Real-time monitoring, Alert system | +| Weather-Based Notification Service | Checks weather forecasts and notifies users of severe conditions | Weather API integration, Conditional alerts, Scheduling | +| Automated Financial Report Generator | Gathers financial data and generates reports for stakeholders | Data aggregation, Report generation, Scheduling | +| Task Management and Reminder System | Manages user tasks, sets reminders, and sends notifications | User management, Scheduling, Notifications | +| Interactive Story Generator | Creates stories based on user input with corresponding images | Natural language processing, Image generation, User interaction | +| Automated Meeting Scheduler | Finds optimal meeting times and manages calendar entries | Calendar integration, Conflict resolution, Invitations | +| Email Categorization and Response | Categorizes incoming emails and sends automated responses | Email processing, Content categorization, Automated responses | +| E-commerce Order Processing | Handles order placements, inventory, and shipment tracking | Workflow automation, Inventory management, Notifications | +| Content Moderation System | Reviews and classifies user-generated content | Content analysis, Classification, Moderation actions | +| Personalized Learning Assistant | Provides tailored learning materials and tracks progress | Personalization, Progress tracking, Content recommendation | +| Automated Backup and Recovery | Regularly backs up data and initiates recovery procedures | Scheduled tasks, Error handling, Data management | +| Smart Home Automation Workflow | Manages smart home devices based on user commands and conditions | IoT integration, Conditional logic, User interaction | +| Inventory Management System | Tracks inventory levels and automates reordering | Stock management, Predictive analysis, Automated ordering | +| Event-Driven Notification System | Triggers notifications based on specific events or thresholds | Event monitoring, Conditional alerts, Multi-channel notifications | +| Data Cleaning and Transformation | Cleans and transforms raw data for analysis | Data processing, ETL operations, Quality assurance | +| Project Management Assistant | Breaks down projects into tasks and tracks progress | Task decomposition, Progress monitoring, Reporting | +| Parallel Data Processing Pipeline | Processes large datasets in parallel and aggregates results | Parallel execution, Data aggregation, Scalable processing | +| Dynamic Content Recommendation | Analyzes user behavior and recommends personalized content | User profiling, Content analysis, Personalized recommendations | +| Compliance Monitoring System | Monitors activities for regulatory compliance and generates reports | Rule-based monitoring, Violation detection, Compliance reporting | +| Intelligent Resume Screening | Evaluates resumes based on criteria and forwards qualified candidates | Document analysis, Candidate scoring, Automated screening | +| Automated Code Review Pipeline | Reviews code commits, runs tests, and manages deployments | Code analysis, Automated testing, Deployment management | +| Personal Finance Tracker | Tracks expenses, analyzes patterns, and provides financial advice | Financial data analysis, Pattern recognition, Personalized advice | +| Automated Content Publishing | Schedules and publishes content across various platforms | Content management, Multi-platform publishing, Scheduling | +| AI-Powered Personal Assistant | Manages personal tasks, schedules, and provides information | Task management, Scheduling, Information retrieval | +| Bug Tracking and Reporting | Monitors repositories, categorizes issues, and assigns to developers | Issue tracking, Categorization, Automated assignment | +| Multi-Stage Data Validation | Validates data through multiple stages with different rules | Data validation, Multi-step processing, Error handling | +| Document Summarization and Archiving | Summarizes documents and archives them for easy retrieval | Text summarization, Document classification, Archiving | +| Real-Time Stock Market Analyzer | Analyzes market data and alerts users about significant changes | Real-time data processing, Financial analysis, Alert system | +| Webinar Management System | Schedules webinars, manages participants, and handles follow-ups | Event scheduling, Participant management, Automated follow-ups | +| Smart Content Filtering | Filters and recommends content based on user preferences | Content analysis, User profiling, Recommendation system | +| Automated Translation Workflow | Translates content into multiple languages and localizes it | Language translation, Localization, Content management | +| AI-Driven Survey Analysis | Analyzes survey responses and generates insight reports | Survey processing, Sentiment analysis, Report generation | +| Compliance Documentation Generator | Creates compliance documents based on regulatory standards | Document generation, Compliance checking, Template management | +| Task Prioritization and Allocation | Prioritizes tasks and allocates them to team members | Task analysis, Resource allocation, Team management | +| Webinar Feedback Analyzer | Collects and analyzes feedback from webinar participants | Feedback collection, Sentiment analysis, Improvement suggestions | +| Health and Fitness Tracker | Tracks health metrics and provides personalized fitness recommendations | Health data analysis, Personalized recommendations, Progress tracking | +| Incident Response System | Detects incidents, initiates response workflows, and notifies personnel | Incident detection, Workflow automation, Alert system | +| Content Optimization Workflow | Analyzes content performance and optimizes for better engagement | Performance analysis, Content optimization, A/B testing | +| Legal Document Processor | Extracts key information from legal documents and ensures compliance | Document analysis, Information extraction, Compliance checking | +| Job Application Tracker | Tracks job applications and provides application improvement suggestions | Application tracking, Status updates, Improvement recommendations | +| Content Rescheduling System | Monitors content performance and reschedules for better visibility | Performance monitoring, Content scheduling, Optimization | +| AI-Powered Investment Advisor | Analyzes financial data and suggests investment opportunities | Financial analysis, Risk assessment, Investment recommendations | +| Intelligent Document Version Control | Manages document versions and notifies users about updates | Version control, Change tracking, Notification system | +| Marketing Campaign Manager | Creates, schedules, and optimizes marketing campaigns | Campaign planning, Performance tracking, Optimization strategies | +| Competitive Analysis Workflow | Gathers data on competitors and generates analysis reports | Data collection, Comparative analysis, Report generation | +| Health Monitoring and Alerting | Monitors health metrics and alerts users and healthcare providers | Health data analysis, Anomaly detection, Alert system | +| Travel Itinerary Planner | Plans travel itineraries based on preferences and conditions | Trip planning, Preference matching, Dynamic scheduling | +| AI-Powered Personal Diary | Helps maintain a diary and provides insights into emotions and growth | Natural language processing, Sentiment analysis, Personal growth tracking | +| Language Learning Tutor | Provides exercises and personalized feedback for language learners | Language processing, Progress tracking, Personalized lessons | +| Knowledge Base Maintenance | Updates and maintains a knowledge base with new information | Information extraction, Knowledge management, Consistency checking | +| Feedback Loop for Improvement | Collects user feedback, analyzes it, and implements improvements | Feedback analysis, Improvement tracking, Stakeholder notifications | +| Grant Application Processor | Reviews grant applications, evaluates eligibility, and notifies applicants | Application processing, Eligibility checking, Automated notifications | +| AI-Powered Resume Builder | Assists in building resumes and provides improvement suggestions | Resume analysis, Content generation, Personalized recommendations | +| Vendor Management System | Manages vendor information, monitors performance, and handles communications | Vendor tracking, Performance monitoring, Communication automation | +| Meeting Minutes Recorder | Records meetings, transcribes audio, and distributes summaries | Audio transcription, Summary generation, Automated distribution | +| Personal Shopping Assistant | Finds products based on preferences and notifies about deals | Product matching, Price comparison, Deal notifications | +| Environmental Monitoring Reporter | Monitors environmental data and generates reports for stakeholders | Data monitoring, Anomaly detection, Report generation | +| Data Sync and Integration Workflow | Syncs data between platforms and handles conflicts | Data synchronization, Conflict resolution, Integration management | +| Competitive Pricing Strategy | Analyzes competitor pricing and adjusts prices dynamically | Price analysis, Dynamic pricing, Market monitoring | +| User Onboarding Workflow | Manages the user onboarding process and sets up accounts | User registration, Account setup, Welcome communications | +| Content Curation and Distribution | Curates content based on interests and tracks engagement | Content curation, Distribution scheduling, Engagement tracking | + +We encourage contributors to choose from these ideas or propose their own to showcase Julep's capabilities in solving real-world problems. + +## Julep Features Demonstrated + +These notebooks showcase various features of Julep. Here's an overview of the key features you can explore: + +1. **Agent Management** + - Creating and updating agents + - Configuring agent settings (name, model, about) + +2. **Task Definition and Execution** + - Creating multi-step tasks + - Executing tasks with specific inputs + - Various step types (Prompt, Tool Call, Evaluate, Conditional Logic, Loops, etc.) + +3. **Tool Integration** + - Adding custom tools to agents + - Integrating external APIs (e.g., web search, image generation) + +4. **Session Management** + - Creating and managing persistent sessions + - Handling context overflow + +5. **User Management** + - Creating and managing users + - Associating users with sessions + +6. **Document Management** + - Uploading and managing documents + - Document search functionality + +7. **Chat Functionality** + - Interacting with agents through chat sessions + +8. **Execution Monitoring** + - Streaming execution progress + - Monitoring task lifecycle + +9. **API Versioning** + - Support for different API versions + +10. **Authentication** + - API Key authentication + +11. **Server Configuration** + - Configurable server environments + +We encourage contributors to create new notebooks that demonstrate these features in various combinations and use cases. ### Additional Information -For more details about the task or if you have any questions, please don't hesitate to contact the author: +For more details about the tasks or if you have any questions, please don't hesitate to contact the author: **Author:** Julep AI **Contact:** [hey@julep.ai](mailto:hey@julep.ai) or Discord --- -If you have feedback or would like to contribute to the notebooks, feel free to open an issue(s) in the [repository](https://github.com/julep-ai/julep). +If you have feedback or would like to contribute to the notebooks, feel free to open an issue(s) in the [repository](https://github.com/julep-ai/julep). \ No newline at end of file From 0abe269b00ccbd74bbeed09c05925a0518a525a3 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Wed, 2 Oct 2024 17:21:27 -0400 Subject: [PATCH 026/113] doc: Update README.md to add a callout for hacktoberfest people Signed-off-by: Diwank Singh Tomer --- README-CN.md | 29 +++++++++++- README.md | 124 +++++++++++---------------------------------------- 2 files changed, 54 insertions(+), 99 deletions(-) diff --git a/README-CN.md b/README-CN.md index 22bd8cb81..8dca6dcbb 100644 --- a/README-CN.md +++ b/README-CN.md @@ -26,6 +26,30 @@ GitHub 许可证

+***** + +## 🌟 诚邀贡献者! + +我们很高兴欢迎新的贡献者加入 Julep 项目!我们创建了几个"适合新手的问题"来帮助您入门。以下是您可以贡献的方式: + +1. 查看我们的 [CONTRIBUTING.md](CONTRIBUTING.md) 文件,了解如何贡献的指南。 +2. 浏览我们的[适合新手的问题](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22),找到一个您感兴趣的任务。 +3. 如果您有任何问题或需要帮助,请随时在我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 频道上联系我们。 + +您的贡献,无论大小,对我们都很宝贵。让我们一起创造令人惊叹的东西吧!🚀 + +### 🎉 DevFest.AI 2024年10月 + +激动人心的消息!我们将在整个2024年10月参与 DevFest.AI 活动!🗓️ + +- 在此活动期间为 Julep 做出贡献,有机会赢得超棒的 Julep 周边和礼品!🎁 +- 加入来自世界各地的开发者,为 AI 仓库做出贡献并参与精彩的活动。 +- 非常感谢 DevFest.AI 组织这个fantastic的活动! + +> [!TIP] +> 准备好加入这场盛会了吗?**[发推文开始参与](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)**,让我们开始编码吧!🖥️ + +![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) ***** @@ -50,6 +74,9 @@ 请继续关注我们即将发布的稳定版本的更多更新!📢 + +***** + ## 简介 Julep 是一个开源平台,用于创建具有可定制工作流的持久 AI 代理。它提供了开发、管理和部署 AI 驱动应用程序的工具,注重灵活性和易用性。 @@ -634,4 +661,4 @@ results = client.documents.search( ## 致谢 -我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 +我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 \ No newline at end of file diff --git a/README.md b/README.md index 37a3651be..af87426b1 100644 --- a/README.md +++ b/README.md @@ -7,104 +7,6 @@ The **Quick Start Guide Focused README** is the most promising for optimizing the time to first workflow. It allows developers to get hands-on experience quickly, which is essential for engagement and understanding. -* * * - -**Outline for the README:** - -1. **Title and Badges** - * Julep Logo or Title - * Build status, npm version, license badges -2. **Introduction** - * _Briefly explain what Julep is and its purpose._ - * Emphasize how it simplifies building persistent AI agents with workflows. -3. **Features** - * _Highlight key features with a focus on "tasks" (AI workflows)._ - * Mention support for persistent sessions, tool integration, and document management. -4. **Installation** - * _Provide npm installation command:_ - - bash - - Copy code - - `npm install julep` - -5. **Quick Start Guide** - * **Step 1: Import Julep** - * _Show how to import Julep into a project._ - - javascript - - Copy code - - `const Julep = require('julep');` - - * **Step 2: Initialize the Agent** - * _Guide on creating a new agent with basic settings._ - - javascript - - Copy code - - `const agent = new Julep.Agent({  name: 'MyAgent',  model: 'gpt-4-turbo', });` - - * **Step 3: Chat with the Agent** - * _Provide a simple example of a chat with the agent._ - - javascript - - Copy code - - `const response = await client.sessions.chat({  session_id: session.id,  message: 'Hello, how are you?' });` - - * **Step 4: Define a Task (Workflow)** - * _Provide a simple example of a task definition._ - - javascript - - Copy code - - `const task = {  name: 'GreetingTask',  main: [    {      prompt: 'Say hello to the user.',    },  ], }; agent.addTask(task);` - - * **Step 5: Execute the Task** - * _Show how to run the task and handle the output._ - - javascript - - Copy code - - `agent.executeTask('GreetingTask').then((output) => {  console.log(output); });` - -6. **Understanding Tasks** - * _Explain what tasks are and how they function within Julep._ - * Describe different types of workflow steps. - * Prompt, Tool Call, Evaluate, etc. - * _Note:_ Link to detailed documentation for each step type. -7. **Advanced Features** - * _Briefly mention other capabilities:_ - * Adding tools to agents. - * Managing sessions and users. - * Document integration and search. -8. **API Reference** - * _Link to full API documentation._ - * Mention key endpoints for agents, tasks, and executions. -9. **Examples and Tutorials** - * _Provide links to example projects or further tutorials._ - * Encourage users to explore and build upon provided examples. -10. **Contributing** - * _Instructions for contributing to the project._ - * Link to contribution guidelines and code of conduct. -11. **Support and Community** - * _Information on how to get help._ - * Links to community forums, chat groups, or issue trackers. -12. **License** - * _State the project's license._ - * Provide a link to the LICENSE file. -13. **Acknowledgements** - * _Credit to contributors and used resources._ - -* * * - **Notes:** * **Code Examples:** Ensure all code snippets are easy to understand and copy-paste ready. @@ -144,6 +46,31 @@ The **Quick Start Guide Focused README** is the most promising for optimizing th ***** +## 🌟 Call for Contributors! + +We're excited to welcome new contributors to the Julep project! We've created several "good first issues" to help you get started. Here's how you can contribute: + +1. Check out our [CONTRIBUTING.md](CONTRIBUTING.md) file for guidelines on how to contribute. +2. Browse our [good first issues](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to find a task that interests you. +3. If you have any questions or need help, don't hesitate to reach out on our [Discord](https://discord.com/invite/JTSBGRZrzj) channel. + +Your contributions, big or small, are valuable to us. Let's build something amazing together! 🚀 + +### 🎉 DevFest.AI October 2024 + +Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓️ + +- Contribute to Julep during this event and get a chance to win awesome Julep merch and swag! 🎁 +- Join developers from around the world in contributing to AI repositories and participating in amazing events. +- A big thank you to DevFest.AI for organizing this fantastic initiative! + +> [!TIP] +> Ready to join the fun? **[Tweet to start participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️ + +![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) + +***** + ## 🎉🚀 **Exciting News: Julep 1.0 Alpha Release!** 🚀🎉 We're thrilled to announce the **alpha** release of Julep 1.0! 🥳 @@ -165,6 +92,7 @@ We're thrilled to announce the **alpha** release of Julep 1.0! 🥳 Stay tuned for more updates as we approach our stable release! 📢 +***** ## Introduction From 46ed8facb35c1b17978bbb21bdf20246c19d3bf0 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Thu, 3 Oct 2024 00:47:50 +0300 Subject: [PATCH 027/113] feat(agents-api): Add static checking for Jinja templates & Python expressions in task creation | Add validation for subworkflows (#570) Closes #535 > [!IMPORTANT] > Add static validation for Python expressions and Jinja templates in task creation and validate subworkflows in `openapi_model.py` and `steps.tsp`. > > - **Validation**: > - Add `validate_python_expression()` and `validate_jinja_template()` in `openapi_model.py`. > - Integrate validation into `EvaluateStep`, `ToolCallStep`, `PromptStep`, `SetStep`, `LogStep`, `ReturnStep`, `YieldStep`, `IfElseWorkflowStep`, and `MapReduceStep` in `openapi_model.py`. > - **Models**: > - Update `CreateTaskRequest` in `openapi_model.py` to validate subworkflows using `WorkflowType`. > - Add `YieldStep` to `MappableWorkflowStep` and `NonConditionalWorkflowStep` in `steps.tsp`. > - **Misc**: > - Reorder `YieldStep` in `Tasks.py` to maintain consistency. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 9952ad5700812126c0aa7f1bfa26467e88b60aab. It will automatically update as commits are pushed. --------- Co-authored-by: Diwank Singh Tomer --- agents-api/agents_api/autogen/Tasks.py | 26 ++- .../agents_api/autogen/openapi_model.py | 216 +++++++++++++++++- typespec/tasks/steps.tsp | 3 +- 3 files changed, 233 insertions(+), 12 deletions(-) diff --git a/agents-api/agents_api/autogen/Tasks.py b/agents-api/agents_api/autogen/Tasks.py index 48dba4ad7..9dd531c47 100644 --- a/agents-api/agents_api/autogen/Tasks.py +++ b/agents-api/agents_api/autogen/Tasks.py @@ -35,10 +35,10 @@ class CaseThen(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep ) """ @@ -63,10 +63,10 @@ class CaseThenUpdateItem(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep ) """ @@ -130,10 +130,10 @@ class CreateTaskRequest(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep | IfElseWorkflowStep | SwitchStep @@ -227,6 +227,7 @@ class ForeachDo(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep ) """ The steps to run for each iteration @@ -251,6 +252,7 @@ class ForeachDoUpdateItem(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep ) """ The steps to run for each iteration @@ -324,10 +326,10 @@ class IfElseWorkflowStep(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep ) """ @@ -342,10 +344,10 @@ class IfElseWorkflowStep(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep | None, Field(None, alias="else"), @@ -376,10 +378,10 @@ class IfElseWorkflowStepUpdateItem(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep ) """ @@ -394,10 +396,10 @@ class IfElseWorkflowStepUpdateItem(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep | None, Field(None, alias="else"), @@ -462,6 +464,7 @@ class Main(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep ) """ The steps to run for each iteration @@ -503,6 +506,7 @@ class MainModel(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep ) """ The steps to run for each iteration @@ -543,6 +547,7 @@ class ParallelStep(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep ], Field(max_length=100), ] @@ -569,6 +574,7 @@ class ParallelStepUpdateItem(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep ], Field(max_length=100), ] @@ -596,10 +602,10 @@ class PatchTaskRequest(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep | IfElseWorkflowStepUpdateItem | SwitchStepUpdateItem @@ -874,10 +880,10 @@ class Task(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep | IfElseWorkflowStep | SwitchStep @@ -1009,10 +1015,10 @@ class UpdateTaskRequest(BaseModel): | LogStep | EmbedStep | SearchStep + | YieldStep | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep | IfElseWorkflowStep | SwitchStep diff --git a/agents-api/agents_api/autogen/openapi_model.py b/agents-api/agents_api/autogen/openapi_model.py index 5c5a8c86f..48811eb20 100644 --- a/agents-api/agents_api/autogen/openapi_model.py +++ b/agents-api/agents_api/autogen/openapi_model.py @@ -1,10 +1,12 @@ # ruff: noqa: F401, F403, F405 +import ast from typing import Annotated, Any, Generic, Literal, Self, Type, TypeVar, get_args from uuid import UUID +import jinja2 from litellm.utils import _select_tokenizer as select_tokenizer from litellm.utils import token_counter -from pydantic import AwareDatetime, Field +from pydantic import AwareDatetime, Field, field_validator, model_validator, validator from ..common.utils.datetime import utcnow from .Agents import * @@ -152,6 +154,179 @@ def from_model_input( ) +# Patch Task Workflow Steps +# -------------------------------------- + + +def validate_python_expression(expr: str) -> tuple[bool, str]: + try: + ast.parse(expr) + return True, "" + except SyntaxError as e: + return False, f"SyntaxError in '{expr}': {str(e)}" + + +def validate_jinja_template(template: str) -> tuple[bool, str]: + env = jinja2.Environment() + try: + parsed_template = env.parse(template) + for node in parsed_template.body: + if isinstance(node, jinja2.nodes.Output): + for child in node.nodes: + if isinstance(child, jinja2.nodes.Name): + # Check if the variable is a valid Python expression + is_valid, error = validate_python_expression(child.name) + if not is_valid: + return ( + False, + f"Invalid Python expression in Jinja template '{template}': {error}", + ) + return True, "" + except jinja2.exceptions.TemplateSyntaxError as e: + return False, f"TemplateSyntaxError in '{template}': {str(e)}" + + +_EvaluateStep = EvaluateStep + + +class EvaluateStep(_EvaluateStep): + @field_validator("evaluate") + def validate_evaluate_expressions(cls, v): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError(f"Invalid Python expression in key '{key}': {error}") + return v + + +_ToolCallStep = ToolCallStep + + +class ToolCallStep(_ToolCallStep): + @field_validator("arguments") + def validate_arguments(cls, v): + if isinstance(v, dict): + for key, expr in v.items(): + if isinstance(expr, str): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError( + f"Invalid Python expression in arguments key '{key}': {error}" + ) + return v + + +_PromptStep = PromptStep + + +class PromptStep(_PromptStep): + @field_validator("prompt") + def validate_prompt(cls, v): + if isinstance(v, str): + is_valid, error = validate_jinja_template(v) + if not is_valid: + raise ValueError(f"Invalid Jinja template in prompt: {error}") + elif isinstance(v, list): + for item in v: + if "content" in item: + is_valid, error = validate_jinja_template(item["content"]) + if not is_valid: + raise ValueError( + f"Invalid Jinja template in prompt content: {error}" + ) + return v + + +_SetStep = SetStep + + +class SetStep(_SetStep): + @field_validator("set") + def validate_set_expressions(cls, v): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError( + f"Invalid Python expression in set key '{key}': {error}" + ) + return v + + +_LogStep = LogStep + + +class LogStep(_LogStep): + @field_validator("log") + def validate_log_template(cls, v): + is_valid, error = validate_jinja_template(v) + if not is_valid: + raise ValueError(f"Invalid Jinja template in log: {error}") + return v + + +_ReturnStep = ReturnStep + + +class ReturnStep(_ReturnStep): + @field_validator("return_") + def validate_return_expressions(cls, v): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError( + f"Invalid Python expression in return key '{key}': {error}" + ) + return v + + +_YieldStep = YieldStep + + +class YieldStep(_YieldStep): + @field_validator("arguments") + def validate_yield_arguments(cls, v): + if isinstance(v, dict): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError( + f"Invalid Python expression in yield arguments key '{key}': {error}" + ) + return v + + +_IfElseWorkflowStep = IfElseWorkflowStep + + +class IfElseWorkflowStep(_IfElseWorkflowStep): + @field_validator("if_") + def validate_if_expression(cls, v): + is_valid, error = validate_python_expression(v) + if not is_valid: + raise ValueError(f"Invalid Python expression in if condition: {error}") + return v + + +_MapReduceStep = MapReduceStep + + +class MapReduceStep(_MapReduceStep): + @field_validator("over") + def validate_over_expression(cls, v): + is_valid, error = validate_python_expression(v) + if not is_valid: + raise ValueError(f"Invalid Python expression in over: {error}") + return v + + @field_validator("reduce") + def validate_reduce_expression(cls, v): + if v is not None: + is_valid, error = validate_python_expression(v) + if not is_valid: + raise ValueError(f"Invalid Python expression in reduce: {error}") + return v + + # Workflow related models # ----------------------- @@ -228,6 +403,29 @@ class Task(_Task): # Patch some models to allow extra fields # -------------------------------------- +WorkflowType = RootModel[ + list[ + EvaluateStep + | ToolCallStep + | PromptStep + | GetStep + | SetStep + | LogStep + | EmbedStep + | SearchStep + | ReturnStep + | SleepStep + | ErrorWorkflowStep + | YieldStep + | WaitForInputStep + | IfElseWorkflowStep + | SwitchStep + | ForeachStep + | ParallelStep + | MapReduceStep + ] +] + _CreateTaskRequest = CreateTaskRequest @@ -240,6 +438,22 @@ class CreateTaskRequest(_CreateTaskRequest): } ) + @model_validator(mode="after") + def validate_subworkflows(self) -> Self: + subworkflows = { + k: v + for k, v in self.model_dump().items() + if k not in _CreateTaskRequest.model_fields + } + + for workflow_name, workflow_definition in subworkflows.items(): + try: + WorkflowType.model_validate(workflow_definition) + setattr(self, workflow_name, WorkflowType(workflow_definition)) + except Exception as e: + raise ValueError(f"Invalid subworkflow '{workflow_name}': {str(e)}") + return self + CreateOrUpdateTaskRequest = CreateTaskRequest diff --git a/typespec/tasks/steps.tsp b/typespec/tasks/steps.tsp index 3495def1b..2267ae320 100644 --- a/typespec/tasks/steps.tsp +++ b/typespec/tasks/steps.tsp @@ -49,7 +49,8 @@ alias MappableWorkflowStep = | SetStep | LogStep | EmbedStep - | SearchStep; + | SearchStep + | YieldStep; alias NonConditionalWorkflowStep = | MappableWorkflowStep From 866a4eb6c1f2ee85954f6efed6ba0a746ea67058 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Wed, 2 Oct 2024 18:11:00 -0400 Subject: [PATCH 028/113] doc: Add code reading instructions to CONTRIBUTING.md (#556) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Adds detailed code reading and contributing instructions to `CONTRIBUTING.md`, covering project architecture, setup, and contribution guidelines. > > - **Documentation**: > - Adds detailed code reading instructions to `CONTRIBUTING.md`. > - Includes sections on project overview, system architecture, API specifications, core API implementation, database and storage, workflow management, testing, and additional services. > - Provides a step-by-step guide for setting up the development environment and contributing to the project. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 4bb3e8ce3e613a87541d88734368762251a012e4. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- CONTRIBUTING.md | 114 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e60c31973..a7cda8b06 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,115 @@ To contribute code changes: Please ensure your code follows the existing style and passes all tests. +## Project Overview and Architecture + +### Key Components + +1. **agents-api**: The core API service for Julep. +2. **typespec**: API specifications and contracts. +3. **integrations-service**: Handles external integrations. +4. **embedding-service**: Manages text embeddings. +5. **memory-store**: Handles persistent storage. +6. **llm-proxy**: Proxy for language model interactions. +7. **scheduler**: Manages task scheduling. +8. **gateway**: API gateway and routing. +9. **monitoring**: System monitoring and metrics. + +### Technology Stack + +- **FastAPI**: Web framework for building APIs +- **TypeSpec**: API specification language +- **Cozo**: Database system +- **Temporal**: Workflow engine +- **Docker**: Containerization + +### Relationships Between Components + +The `agents-api` serves as the central component, interacting with most other services: +- It uses `typespec` definitions for API contracts. +- Communicates with `integrations-service` for external tool interactions. +- Utilizes `embedding-service` for text processing. +- Stores data in `memory-store`. +- Interacts with language models through `llm-proxy`. +- Uses `scheduler` for task management. +- All API requests pass through the `gateway`. +- `monitoring` observes the entire system. + +## Understanding the Codebase + +To get a comprehensive understanding of Julep, we recommend exploring the codebase in the following order: + +1. **Project Overview** + - Read `README.md` in the root directory + - Explore `docs/` for detailed documentation + +2. **System Architecture** + - Examine `docker-compose.yml` in the root directory + - Review `deploy/` directory for different deployment configurations + +3. **API Specifications** + - Learn about TypeSpec: https://typespec.io/docs/ + - Explore `typespec/` directory: + - Start with `common/` folder + - Review `main.tsp` + - Examine each module sequentially + +4. **Core API Implementation** + - Learn about FastAPI: https://fastapi.tiangolo.com/ + - Explore `agents-api/` directory: + - Review `README.md` for an overview + - Examine `routers/` for API endpoints + - Look into `models/` for data models + +5. **Database and Storage** + - Learn about Cozo: https://docs.cozodb.org/en/latest/tutorial.html + - Review `agents-api/README.md` for database schema + - Explore `agents-api/models/` for database queries + +6. **Workflow Management** + - Learn about Temporal: https://docs.temporal.io/develop/python + - Explore `agents-api/activities/` for individual workflow steps + - Review `agents-api/workflows/task_execution/` for main workflow logic + +7. **Testing** + - Examine `agents-api/tests/` for test cases + +8. **Additional Services** + - Explore other service directories (`integrations-service/`, `embedding-service/`, etc.) to understand their specific roles and implementations + +## Contributing Guidelines + +1. **Set Up Development Environment** + - Clone the repository + - Install Docker and Docker Compose + - Set up necessary API keys and environment variables + +2. **Choose an Area to Contribute** + - Check the issue tracker for open issues + - Look for "good first issue" labels for newcomers + +3. **Make Changes** + - Create a new branch for your changes + - Write clean, well-documented code + - Ensure your changes adhere to the project's coding standards + +4. **Test Your Changes** + - Run existing tests + - Add new tests for new functionality + - Ensure all tests pass before submitting your changes + +5. **Submit a Pull Request** + - Provide a clear description of your changes + - Reference any related issues + - Be prepared to respond to feedback and make adjustments + +6. **Code Review** + - Address any comments or suggestions from reviewers + - Make necessary changes and push updates to your branch + +7. **Merge** + - Once approved, your changes will be merged into the main branch + ### Documentation Improvements Improvements to documentation are always appreciated! If you see areas that could be clarified or expanded, feel free to make the changes and submit a pull request. @@ -98,4 +207,7 @@ This command generates a JWT token that will be valid for 10 days. ##### Troubleshooting - Ensure that all required Docker images are available. - Check for missing environment variables in the `.env` file. -- Use the `docker compose logs` command to view detailed logs for debugging. \ No newline at end of file +- Use the `docker compose logs` command to view detailed logs for debugging. + + +Remember, contributions aren't limited to code. Documentation improvements, bug reports, and feature suggestions are also valuable contributions to the project. From 2d62857458a254c48252993693cf04973d1e58d5 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Wed, 2 Oct 2024 21:58:49 -0400 Subject: [PATCH 029/113] fix(agents-api): Switch to monkeypatching because everything is shit (#573) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Refactor validation logic using monkeypatching and add new models and custom types in `openapi_model.py`. > > - **Validation Refactor**: > - Switch from subclassing to monkeypatching for validation functions in `EvaluateStep`, `ToolCallStep`, `PromptStep`, `SetStep`, `LogStep`, `ReturnStep`, `YieldStep`, `IfElseWorkflowStep`, and `MapReduceStep`. > - Add validators for Python expressions and Jinja templates. > - **Model Changes**: > - Add `CreateTransitionRequest` and `CreateEntryRequest` classes. > - Define custom types `ChatMLContent`, `ChatMLRole`, `ChatMLSource`, `ExecutionStatus`, and `TransitionType`. > - **Misc**: > - Allow extra fields in `CreateTaskRequest`, `PatchTaskRequest`, and `UpdateTaskRequest` using `ConfigDict`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 8c03d93701a454327d6b458177e0626ae165d2a0. It will automatically update as commits are pushed. Signed-off-by: Diwank Singh Tomer --- .../agents_api/autogen/openapi_model.py | 339 +++++++++++------- 1 file changed, 214 insertions(+), 125 deletions(-) diff --git a/agents-api/agents_api/autogen/openapi_model.py b/agents-api/agents_api/autogen/openapi_model.py index 48811eb20..bff2221eb 100644 --- a/agents-api/agents_api/autogen/openapi_model.py +++ b/agents-api/agents_api/autogen/openapi_model.py @@ -6,7 +6,14 @@ import jinja2 from litellm.utils import _select_tokenizer as select_tokenizer from litellm.utils import token_counter -from pydantic import AwareDatetime, Field, field_validator, model_validator, validator +from pydantic import ( + AwareDatetime, + Field, + computed_field, + field_validator, + model_validator, + validator, +) from ..common.utils.datetime import utcnow from .Agents import * @@ -155,7 +162,7 @@ def from_model_input( # Patch Task Workflow Steps -# -------------------------------------- +# ------------------------- def validate_python_expression(expr: str) -> tuple[bool, str]: @@ -186,145 +193,255 @@ def validate_jinja_template(template: str) -> tuple[bool, str]: return False, f"TemplateSyntaxError in '{template}': {str(e)}" -_EvaluateStep = EvaluateStep +@field_validator("evaluate") +def validate_evaluate_expressions(cls, v): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError(f"Invalid Python expression in key '{key}': {error}") + return v + + +EvaluateStep.validate_evaluate_expressions = validate_evaluate_expressions -class EvaluateStep(_EvaluateStep): - @field_validator("evaluate") - def validate_evaluate_expressions(cls, v): +@field_validator("arguments") +def validate_arguments(cls, v): + if isinstance(v, dict): for key, expr in v.items(): - is_valid, error = validate_python_expression(expr) - if not is_valid: - raise ValueError(f"Invalid Python expression in key '{key}': {error}") - return v + if isinstance(expr, str): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError( + f"Invalid Python expression in arguments key '{key}': {error}" + ) + return v -_ToolCallStep = ToolCallStep +ToolCallStep.validate_arguments = validate_arguments -class ToolCallStep(_ToolCallStep): - @field_validator("arguments") - def validate_arguments(cls, v): - if isinstance(v, dict): - for key, expr in v.items(): - if isinstance(expr, str): - is_valid, error = validate_python_expression(expr) - if not is_valid: - raise ValueError( - f"Invalid Python expression in arguments key '{key}': {error}" - ) - return v +# Add the new validator function +@field_validator("prompt") +def validate_prompt(cls, v): + if isinstance(v, str): + is_valid, error = validate_jinja_template(v) + if not is_valid: + raise ValueError(f"Invalid Jinja template in prompt: {error}") + elif isinstance(v, list): + for item in v: + if "content" in item: + is_valid, error = validate_jinja_template(item["content"]) + if not is_valid: + raise ValueError( + f"Invalid Jinja template in prompt content: {error}" + ) + return v -_PromptStep = PromptStep +# Patch the original PromptStep class to add the new validator +PromptStep.validate_prompt = validate_prompt -class PromptStep(_PromptStep): - @field_validator("prompt") - def validate_prompt(cls, v): - if isinstance(v, str): - is_valid, error = validate_jinja_template(v) - if not is_valid: - raise ValueError(f"Invalid Jinja template in prompt: {error}") - elif isinstance(v, list): - for item in v: - if "content" in item: - is_valid, error = validate_jinja_template(item["content"]) - if not is_valid: - raise ValueError( - f"Invalid Jinja template in prompt content: {error}" - ) - return v +@field_validator("set") +def validate_set_expressions(cls, v): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) + if not is_valid: + raise ValueError(f"Invalid Python expression in set key '{key}': {error}") + return v -_SetStep = SetStep +SetStep.validate_set_expressions = validate_set_expressions -class SetStep(_SetStep): - @field_validator("set") - def validate_set_expressions(cls, v): - for key, expr in v.items(): - is_valid, error = validate_python_expression(expr) - if not is_valid: - raise ValueError( - f"Invalid Python expression in set key '{key}': {error}" - ) - return v +@field_validator("log") +def validate_log_template(cls, v): + is_valid, error = validate_jinja_template(v) + if not is_valid: + raise ValueError(f"Invalid Jinja template in log: {error}") + return v -_LogStep = LogStep +LogStep.validate_log_template = validate_log_template -class LogStep(_LogStep): - @field_validator("log") - def validate_log_template(cls, v): - is_valid, error = validate_jinja_template(v) +@field_validator("return_") +def validate_return_expressions(cls, v): + for key, expr in v.items(): + is_valid, error = validate_python_expression(expr) if not is_valid: - raise ValueError(f"Invalid Jinja template in log: {error}") - return v + raise ValueError( + f"Invalid Python expression in return key '{key}': {error}" + ) + return v -_ReturnStep = ReturnStep +ReturnStep.validate_return_expressions = validate_return_expressions -class ReturnStep(_ReturnStep): - @field_validator("return_") - def validate_return_expressions(cls, v): +@field_validator("arguments") +def validate_yield_arguments(cls, v): + if isinstance(v, dict): for key, expr in v.items(): is_valid, error = validate_python_expression(expr) if not is_valid: raise ValueError( - f"Invalid Python expression in return key '{key}': {error}" + f"Invalid Python expression in yield arguments key '{key}': {error}" ) - return v + return v -_YieldStep = YieldStep +YieldStep.validate_yield_arguments = validate_yield_arguments -class YieldStep(_YieldStep): - @field_validator("arguments") - def validate_yield_arguments(cls, v): - if isinstance(v, dict): - for key, expr in v.items(): - is_valid, error = validate_python_expression(expr) - if not is_valid: - raise ValueError( - f"Invalid Python expression in yield arguments key '{key}': {error}" - ) - return v +@field_validator("if_") +def validate_if_expression(cls, v): + is_valid, error = validate_python_expression(v) + if not is_valid: + raise ValueError(f"Invalid Python expression in if condition: {error}") + return v + +IfElseWorkflowStep.validate_if_expression = validate_if_expression -_IfElseWorkflowStep = IfElseWorkflowStep +@field_validator("over") +def validate_over_expression(cls, v): + is_valid, error = validate_python_expression(v) + if not is_valid: + raise ValueError(f"Invalid Python expression in over: {error}") + return v -class IfElseWorkflowStep(_IfElseWorkflowStep): - @field_validator("if_") - def validate_if_expression(cls, v): + +@field_validator("reduce") +def validate_reduce_expression(cls, v): + if v is not None: is_valid, error = validate_python_expression(v) if not is_valid: - raise ValueError(f"Invalid Python expression in if condition: {error}") - return v + raise ValueError(f"Invalid Python expression in reduce: {error}") + return v -_MapReduceStep = MapReduceStep +MapReduceStep.validate_over_expression = validate_over_expression +MapReduceStep.validate_reduce_expression = validate_reduce_expression -class MapReduceStep(_MapReduceStep): - @field_validator("over") - def validate_over_expression(cls, v): - is_valid, error = validate_python_expression(v) - if not is_valid: - raise ValueError(f"Invalid Python expression in over: {error}") - return v +# Patch workflow +# -------------- - @field_validator("reduce") - def validate_reduce_expression(cls, v): - if v is not None: - is_valid, error = validate_python_expression(v) - if not is_valid: - raise ValueError(f"Invalid Python expression in reduce: {error}") - return v +_CreateTaskRequest = CreateTaskRequest + +CreateTaskRequest.model_config = ConfigDict( + **{ + **_CreateTaskRequest.model_config, + "extra": "allow", + } +) + + +@model_validator(mode="after") +def validate_subworkflows(self): + subworkflows = { + k: v + for k, v in self.model_dump().items() + if k not in _CreateTaskRequest.model_fields + } + + for workflow_name, workflow_definition in subworkflows.items(): + try: + WorkflowType.model_validate(workflow_definition) + setattr(self, workflow_name, WorkflowType(workflow_definition)) + except Exception as e: + raise ValueError(f"Invalid subworkflow '{workflow_name}': {str(e)}") + return self + + +CreateTaskRequest.validate_subworkflows = validate_subworkflows + + +# Custom types (not generated correctly) +# -------------------------------------- + +ChatMLContent = ( + list[ChatMLTextContentPart | ChatMLImageContentPart] + | Tool + | ChosenToolCall + | str + | ToolResponse + | list[ + list[ChatMLTextContentPart | ChatMLImageContentPart] + | Tool + | ChosenToolCall + | str + | ToolResponse + ] +) + +# Extract ChatMLRole +ChatMLRole = BaseEntry.model_fields["role"].annotation + +# Extract ChatMLSource +ChatMLSource = BaseEntry.model_fields["source"].annotation + +# Extract ExecutionStatus +ExecutionStatus = Execution.model_fields["status"].annotation + +# Extract TransitionType +TransitionType = Transition.model_fields["type"].annotation + +# Assertions to ensure consistency (optional, but recommended for runtime checks) +assert ChatMLRole == BaseEntry.model_fields["role"].annotation +assert ChatMLSource == BaseEntry.model_fields["source"].annotation +assert ExecutionStatus == Execution.model_fields["status"].annotation +assert TransitionType == Transition.model_fields["type"].annotation + + +# Create models +# ------------- + + +class CreateTransitionRequest(Transition): + # The following fields are optional in this + + id: UUID | None = None + execution_id: UUID | None = None + created_at: AwareDatetime | None = None + updated_at: AwareDatetime | None = None + metadata: dict[str, Any] | None = None + task_token: str | None = None + + +class CreateEntryRequest(BaseEntry): + timestamp: Annotated[ + float, Field(ge=0.0, default_factory=lambda: utcnow().timestamp()) + ] + + @classmethod + def from_model_input( + cls: Type[Self], + model: str, + *, + role: ChatMLRole, + content: ChatMLContent, + name: str | None = None, + source: ChatMLSource, + **kwargs: dict, + ) -> Self: + tokenizer: dict = select_tokenizer(model=model) + token_count = token_counter( + model=model, messages=[{"role": role, "content": content, "name": name}] + ) + + return cls( + role=role, + content=content, + name=name, + source=source, + tokenizer=tokenizer["type"], + token_count=token_count, + **kwargs, + ) # Workflow related models @@ -427,34 +544,6 @@ class Task(_Task): ] -_CreateTaskRequest = CreateTaskRequest - - -class CreateTaskRequest(_CreateTaskRequest): - model_config = ConfigDict( - **{ - **_CreateTaskRequest.model_config, - "extra": "allow", - } - ) - - @model_validator(mode="after") - def validate_subworkflows(self) -> Self: - subworkflows = { - k: v - for k, v in self.model_dump().items() - if k not in _CreateTaskRequest.model_fields - } - - for workflow_name, workflow_definition in subworkflows.items(): - try: - WorkflowType.model_validate(workflow_definition) - setattr(self, workflow_name, WorkflowType(workflow_definition)) - except Exception as e: - raise ValueError(f"Invalid subworkflow '{workflow_name}': {str(e)}") - return self - - CreateOrUpdateTaskRequest = CreateTaskRequest _PatchTaskRequest = PatchTaskRequest From 85e992990636123ace3788323f182c53e58c4efd Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Thu, 3 Oct 2024 17:21:50 +0300 Subject: [PATCH 030/113] feat(agents-api): Add embeddings to doc get/list response (#578) --- agents-api/agents_api/autogen/Docs.py | 7 +++++++ agents-api/agents_api/models/docs/get_doc.py | 4 +++- agents-api/agents_api/models/docs/list_docs.py | 4 +++- cozo.db | Bin 0 -> 12288 bytes typespec/docs/models.tsp | 4 ++++ 5 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 cozo.db diff --git a/agents-api/agents_api/autogen/Docs.py b/agents-api/agents_api/autogen/Docs.py index a7023ddfc..0c1524e48 100644 --- a/agents-api/agents_api/autogen/Docs.py +++ b/agents-api/agents_api/autogen/Docs.py @@ -57,6 +57,13 @@ class Doc(BaseModel): """ Contents of the document """ + embeddings: Annotated[ + list[float] | list[list[float]] | None, + Field(None, json_schema_extra={"readOnly": True}), + ] + """ + Embeddings for the document + """ class DocOwner(BaseModel): diff --git a/agents-api/agents_api/models/docs/get_doc.py b/agents-api/agents_api/models/docs/get_doc.py index 84cd181ec..4b3996c27 100644 --- a/agents-api/agents_api/models/docs/get_doc.py +++ b/agents-api/agents_api/models/docs/get_doc.py @@ -37,6 +37,7 @@ one=True, transform=lambda d: { "content": [s[1] for s in sorted(d["snippet_data"], key=lambda x: x[0])], + "embeddings": [s[2] for s in sorted(d["snippet_data"], key=lambda x: x[0])], **d, }, ) @@ -68,8 +69,9 @@ def get_doc( doc_id, index, content, + embedding, }, - snippet_data = [index, content] + snippet_data = [index, content, embedding] ?[ id, diff --git a/agents-api/agents_api/models/docs/list_docs.py b/agents-api/agents_api/models/docs/list_docs.py index afdf06c2d..3c095c2db 100644 --- a/agents-api/agents_api/models/docs/list_docs.py +++ b/agents-api/agents_api/models/docs/list_docs.py @@ -34,6 +34,7 @@ Doc, transform=lambda d: { "content": [s[1] for s in sorted(d["snippet_data"], key=lambda x: x[0])], + "embeddings": [s[2] for s in sorted(d["snippet_data"], key=lambda x: x[0])], **d, }, ) @@ -67,8 +68,9 @@ def list_docs( doc_id: id, index, content, + embedding, }}, - snippet_data = [index, content] + snippet_data = [index, content, embedding] ?[ owner_type, diff --git a/cozo.db b/cozo.db new file mode 100644 index 0000000000000000000000000000000000000000..b1bc4a7a55dbc3c8ce20447660fa024c727354b6 GIT binary patch literal 12288 zcmeI1&ubGw6vt(OKmZ5; z0U!VbfB+Bx0zd!=00AHX1pY??u5x5-bW~|v;p8@>mVeKeBQ;gZWz3vzX0nBxEf00e*l5C8%|00;m9AOHmZfWX5gb;x`)o@5Ni zZI|m*wnHM?F_(DTq(Va}e|_BYh)Z855lMj5R~=jFx|9=}aMEmv)-PIl5Qo1Mza=AW zOgMIy&JyO>4zG8;Dr2(k-0azOo>Upf73wwCGeN-W%~e0>7}s$j zUp8ALtVB=t2wfq}6bz#jD=T}HwotC!Ec}om{YB$e>|buIPx)TN8*4Sf8f(R>+gQtc z{GIxFpU}$sKHKVgzK3OTPj`wFWgjf4UFM-Ea8SFkA-NDJOH_t^)eW}Nyh24!!BP(2Z2iJj5>WRxozbqF95y+TBv2x literal 0 HcmV?d00001 diff --git a/typespec/docs/models.tsp b/typespec/docs/models.tsp index ee283fe02..f01b379c6 100644 --- a/typespec/docs/models.tsp +++ b/typespec/docs/models.tsp @@ -23,6 +23,10 @@ model Doc { /** Contents of the document */ content: string | string[]; + + /** Embeddings for the document */ + @visibility("read") + embeddings?: float32[] | float32[][]; } /** Payload for creating a doc */ From 3ad19260b4bb8da6b839243d3393030dcba405e3 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Thu, 3 Oct 2024 21:01:59 +0300 Subject: [PATCH 031/113] Delete cozo.db This was uploaded by mistake --- cozo.db | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 cozo.db diff --git a/cozo.db b/cozo.db deleted file mode 100644 index b1bc4a7a55dbc3c8ce20447660fa024c727354b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI1&ubGw6vt(OKmZ5; z0U!VbfB+Bx0zd!=00AHX1pY??u5x5-bW~|v;p8@>mVeKeBQ;gZWz3vzX0nBxEf00e*l5C8%|00;m9AOHmZfWX5gb;x`)o@5Ni zZI|m*wnHM?F_(DTq(Va}e|_BYh)Z855lMj5R~=jFx|9=}aMEmv)-PIl5Qo1Mza=AW zOgMIy&JyO>4zG8;Dr2(k-0azOo>Upf73wwCGeN-W%~e0>7}s$j zUp8ALtVB=t2wfq}6bz#jD=T}HwotC!Ec}om{YB$e>|buIPx)TN8*4Sf8f(R>+gQtc z{GIxFpU}$sKHKVgzK3OTPj`wFWgjf4UFM-Ea8SFkA-NDJOH_t^)eW}Nyh24!!BP(2Z2iJj5>WRxozbqF95y+TBv2x From 4992615da5d702956fc9dd8f29d90cf1f4bad96f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 4 Oct 2024 05:31:42 +0530 Subject: [PATCH 032/113] Update lint-and-format.yml --- .github/workflows/lint-and-format.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-and-format.yml b/.github/workflows/lint-and-format.yml index 65e4983c4..ab74c7e9b 100644 --- a/.github/workflows/lint-and-format.yml +++ b/.github/workflows/lint-and-format.yml @@ -37,7 +37,7 @@ jobs: uses: actions/cache@v4 with: path: agents-api/.pytype - key: ${{ runner.os }}-agents-api-pytype-${{ hashFiles('agents-api/**/*.py') }} + key: ${{ runner.os }}-agents-api-pytype- restore-keys: | ${{ runner.os }}-agents-api-pytype- From 9c38da1a42c29da7218dac9696b1d67d9ced2538 Mon Sep 17 00:00:00 2001 From: Vivek Gurudutt K <127002789+VivekGuruduttK28@users.noreply.github.com> Date: Fri, 4 Oct 2024 05:40:54 +0530 Subject: [PATCH 033/113] Enhanced the error messages (#575) This PR is to fix the issue mentioned in #572 I have made the required changes in the files create_agent.py, create_or_update_agent.py and delete_agent.py. I have added descriptions to QueryException, ValidationError and TypeError. ---- > [!IMPORTANT] > Enhanced error messages for exceptions in agent-related files to provide detailed guidance on potential issues. > > - **Error Messages**: > - Enhanced error messages for `QueryException`, `ValidationError`, and `TypeError` in `create_agent.py`, `create_or_update_agent.py`, and `delete_agent.py`. > - `QueryException`: Now includes a detailed message about potential causes related to database query failures. > - `ValidationError`: Provides guidance on checking input data for missing or incorrect fields. > - `TypeError`: Describes type mismatch issues and suggests reviewing input data types. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 049d7eea196b74158e4fc4d83049656c7e7fa12e. It will automatically update as commits are pushed. Co-authored-by: Diwank Singh Tomer --- agents-api/agents_api/models/agent/create_agent.py | 6 +++--- .../agents_api/models/agent/create_or_update_agent.py | 6 +++--- agents-api/agents_api/models/agent/delete_agent.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/agents-api/agents_api/models/agent/create_agent.py b/agents-api/agents_api/models/agent/create_agent.py index 73be4ec77..546d0d441 100644 --- a/agents-api/agents_api/models/agent/create_agent.py +++ b/agents-api/agents_api/models/agent/create_agent.py @@ -32,9 +32,9 @@ in str(e): lambda *_: HTTPException( detail="developer not found", status_code=403 ), - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass(HTTPException, status_code=400, detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), + ValidationError: partialclass(HTTPException, status_code=400, detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), + TypeError: partialclass(HTTPException, status_code=400, detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again."), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/agent/create_or_update_agent.py b/agents-api/agents_api/models/agent/create_or_update_agent.py index 156c8ae61..17e01fccb 100644 --- a/agents-api/agents_api/models/agent/create_or_update_agent.py +++ b/agents-api/agents_api/models/agent/create_or_update_agent.py @@ -27,9 +27,9 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass(HTTPException, status_code=400,detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), + ValidationError: partialclass(HTTPException, status_code=400,detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), + TypeError: partialclass(HTTPException, status_code=400,detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again."), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/agent/delete_agent.py b/agents-api/agents_api/models/agent/delete_agent.py index 926007bdf..cb6b16718 100644 --- a/agents-api/agents_api/models/agent/delete_agent.py +++ b/agents-api/agents_api/models/agent/delete_agent.py @@ -32,9 +32,9 @@ in e.resp["display"]: lambda *_: HTTPException( detail="developer not found or doesnt own resource", status_code=404 ), - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass(HTTPException, status_code=400,detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), + ValidationError: partialclass(HTTPException, status_code=400,detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), + TypeError: partialclass(HTTPException, status_code=400,detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again."), } ) @wrap_in_class( From 51f5e65cf7095c09219dbe60080898b530f36dac Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Thu, 3 Oct 2024 20:11:31 -0400 Subject: [PATCH 034/113] fix(agents-api): Remove unnecessary 'type' property from tool type definition (#574) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Removed 'type' property from tool classes and added computed 'type' property using a function in `Tools.py`, `openapi_model.py`, and `tasks.py`. > > - **Behavior**: > - Removed `type` property from `CreateToolRequest`, `NamedToolChoice`, `PatchToolRequest`, `Tool`, and `UpdateToolRequest` in `Tools.py`. > - Added computed `type` property to `TaskTool`, `Tool`, `UpdateToolRequest`, and `PatchToolRequest` in `openapi_model.py`. > - Updated `task_to_spec()` in `tasks.py` to use computed `type` property. > - **Misc**: > - Removed `type` property from `Tool` and `NamedToolChoice` in `models.tsp`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 289e87eff9a220b2c4430959f989cca471e36cf9. It will automatically update as commits are pushed. Signed-off-by: Diwank Singh Tomer --- agents-api/agents_api/autogen/Tools.py | 31 ------ .../agents_api/autogen/openapi_model.py | 97 +++++-------------- .../agents_api/common/protocol/tasks.py | 27 ++++-- typespec/tools/models.tsp | 14 --- 4 files changed, 40 insertions(+), 129 deletions(-) diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index c2d4199a2..8227e5759 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -33,10 +33,6 @@ class CreateToolRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - type: Literal["function", "integration", "system", "api_call"] = "function" - """ - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - """ name: Annotated[str, Field(max_length=40, pattern="^[^\\W0-9]\\w*$")] """ Name of the tool (must be unique for this agent and a valid python identifier string ) @@ -168,10 +164,6 @@ class NamedToolChoice(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - type: Literal["function", "integration", "system", "api_call"] - """ - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - """ function: FunctionCallOption | None = None @@ -183,10 +175,6 @@ class PatchToolRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - type: Literal["function", "integration", "system", "api_call"] = "function" - """ - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - """ name: Annotated[str | None, Field(None, max_length=40, pattern="^[^\\W0-9]\\w*$")] """ Name of the tool (must be unique for this agent and a valid python identifier string ) @@ -247,10 +235,6 @@ class Tool(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - type: Literal["function", "integration", "system", "api_call"] = "function" - """ - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - """ name: Annotated[str, Field(max_length=40, pattern="^[^\\W0-9]\\w*$")] """ Name of the tool (must be unique for this agent and a valid python identifier string ) @@ -291,10 +275,6 @@ class UpdateToolRequest(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - type: Literal["function", "integration", "system", "api_call"] = "function" - """ - Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) - """ name: Annotated[str, Field(max_length=40, pattern="^[^\\W0-9]\\w*$")] """ Name of the tool (must be unique for this agent and a valid python identifier string ) @@ -316,14 +296,3 @@ class ChosenFunctionCall(ChosenToolCall): """ The function to call """ - - -class NamedFunctionChoice(NamedToolChoice): - model_config = ConfigDict( - populate_by_name=True, - ) - type: Literal["function"] = "function" - function: FunctionCallOption - """ - The function to call - """ diff --git a/agents-api/agents_api/autogen/openapi_model.py b/agents-api/agents_api/autogen/openapi_model.py index bff2221eb..0d9390816 100644 --- a/agents-api/agents_api/autogen/openapi_model.py +++ b/agents-api/agents_api/autogen/openapi_model.py @@ -77,88 +77,35 @@ class InputChatMLMessage(Message): pass -# Custom types (not generated correctly) -# -------------------------------------- - -ChatMLContent = ( - list[ChatMLTextContentPart | ChatMLImageContentPart] - | Tool - | ChosenToolCall - | str - | ToolResponse - | list[ - list[ChatMLTextContentPart | ChatMLImageContentPart] - | Tool - | ChosenToolCall - | str - | ToolResponse - ] -) - -# Extract ChatMLRole -ChatMLRole = BaseEntry.model_fields["role"].annotation - -# Extract ChatMLSource -ChatMLSource = BaseEntry.model_fields["source"].annotation - -# Extract ExecutionStatus -ExecutionStatus = Execution.model_fields["status"].annotation - -# Extract TransitionType -TransitionType = Transition.model_fields["type"].annotation - -# Assertions to ensure consistency (optional, but recommended for runtime checks) -assert ChatMLRole == BaseEntry.model_fields["role"].annotation -assert ChatMLSource == BaseEntry.model_fields["source"].annotation -assert ExecutionStatus == Execution.model_fields["status"].annotation -assert TransitionType == Transition.model_fields["type"].annotation - - -# Create models -# ------------- +# Patches +# ------- -class CreateTransitionRequest(Transition): - # The following fields are optional in this +def type_property(self: BaseModel) -> str: + return ( + "function" + if self.function + else "integration" + if self.integration + else "system" + if self.system + else "api_call" + if self.api_call + else None + ) - id: UUID | None = None - execution_id: UUID | None = None - created_at: AwareDatetime | None = None - updated_at: AwareDatetime | None = None - metadata: dict[str, Any] | None = None - task_token: str | None = None +# Patch original Tool class to add 'type' property +TaskTool.type = computed_field(property(type_property)) -class CreateEntryRequest(BaseEntry): - timestamp: Annotated[ - float, Field(ge=0.0, default_factory=lambda: utcnow().timestamp()) - ] +# Patch original Tool class to add 'type' property +Tool.type = computed_field(property(type_property)) - @classmethod - def from_model_input( - cls: Type[Self], - model: str, - *, - role: ChatMLRole, - content: ChatMLContent, - name: str | None = None, - source: ChatMLSource, - **kwargs: dict, - ) -> Self: - tokenizer: dict = select_tokenizer(model=model) - token_count = token_counter( - model=model, messages=[{"role": role, "content": content, "name": name}] - ) +# Patch original UpdateToolRequest class to add 'type' property +UpdateToolRequest.type = computed_field(property(type_property)) - return cls( - role=role, - content=content, - name=name, - source=source, - tokenizer=tokenizer["type"], - token_count=token_count, - **kwargs, - ) +# Patch original PatchToolRequest class to add 'type' property +PatchToolRequest.type = computed_field(property(type_property)) # Patch Task Workflow Steps diff --git a/agents-api/agents_api/common/protocol/tasks.py b/agents-api/agents_api/common/protocol/tasks.py index 6892d7098..bbb5c28d3 100644 --- a/agents-api/agents_api/common/protocol/tasks.py +++ b/agents-api/agents_api/common/protocol/tasks.py @@ -218,19 +218,28 @@ def task_to_spec( task: Task | CreateTaskRequest | UpdateTaskRequest | PatchTaskRequest, **model_opts ) -> TaskSpecDef | PartialTaskSpecDef: task_data = task.model_dump(**model_opts) - main = task_data.pop("main") - workflows = [Workflow(name="main", steps=main)] + if "tools" in task_data: + del task_data["tools"] - for k in list(task_data.keys()): - if k in TaskSpec.model_fields.keys(): - continue + tools = [] + for tool in task.tools: + tool_spec = getattr(tool, tool.type) - steps = task_data.pop(k) - workflows.append(Workflow(name=k, steps=steps)) + tools.append( + TaskToolDef( + type=tool.type, + spec=tool_spec.model_dump(), + **tool.model_dump(exclude={"type"}), + ) + ) - tools = task_data.pop("tools", []) - tools = [TaskToolDef(spec=tool.pop(tool["type"]), **tool) for tool in tools] + workflows = [Workflow(name="main", steps=task_data.pop("main"))] + + for key, steps in list(task_data.items()): + if key not in TaskSpec.model_fields: + workflows.append(Workflow(name=key, steps=steps)) + del task_data[key] cls = PartialTaskSpecDef if isinstance(task, PatchTaskRequest) else TaskSpecDef diff --git a/typespec/tools/models.tsp b/typespec/tools/models.tsp index be0fb4f68..8a8cead44 100644 --- a/typespec/tools/models.tsp +++ b/typespec/tools/models.tsp @@ -74,9 +74,6 @@ model SystemDef { // TODO: We should use this model for all tools, not just functions and discriminate on the type model Tool { - /** Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) */ - type: ToolType = ToolType.function; - /** Name of the tool (must be unique for this agent and a valid python identifier string )*/ name: validPythonIdentifier; @@ -95,24 +92,13 @@ model FunctionCallOption { name: string; } -@discriminator("type") model NamedToolChoice { - /** Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) */ - type: ToolType; - function?: FunctionCallOption; integration?: never; // TODO: Implement system?: never; // TODO: Implement api_call?: never; // TODO: Implement } -model NamedFunctionChoice extends NamedToolChoice { - type: ToolType.function; - - /** The function to call */ - function: FunctionCallOption; -} - model ToolResponse { @key id: uuid; From 06813fbe4afde299420d6d285fc4ee3b4d9a6dbd Mon Sep 17 00:00:00 2001 From: JeevaRamanathan <64531160+JeevaRamanathan@users.noreply.github.com> Date: Fri, 4 Oct 2024 05:42:58 +0530 Subject: [PATCH 035/113] Enhanced error message in create, delete agent (#572) Related to #568 Enhanced HTTPException in `create_agent.py` and `delete_agent.py`. As this issue states, we aim to improve error messages throughout the agents-api. I believe this issue can accommodate multiple pull requests. Your suggestions are highly appreciated. ---- > [!IMPORTANT] > Enhanced error messages in `create_agent.py` and `delete_agent.py` for better clarity in `HTTPException` details. > > - **Error Messages**: > - In `create_agent.py`, updated `HTTPException` detail to "Developer not found. Please ensure the provided auth token (which refers to your developer_id) is valid and the developer has the necessary permissions to create an agent." > - In `delete_agent.py`, updated `HTTPException` detail to "The specified developer does not own the requested resource. Please verify the ownership or check if the developer ID is correct." > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for a085d4193ec0c36ba407f340c77e81834419dd69. It will automatically update as commits are pushed. Co-authored-by: Diwank Singh Tomer --- agents-api/agents_api/models/agent/create_agent.py | 3 ++- agents-api/agents_api/models/agent/delete_agent.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/agents-api/agents_api/models/agent/create_agent.py b/agents-api/agents_api/models/agent/create_agent.py index 546d0d441..c1451bb30 100644 --- a/agents-api/agents_api/models/agent/create_agent.py +++ b/agents-api/agents_api/models/agent/create_agent.py @@ -30,7 +30,8 @@ lambda e: isinstance(e, QueryException) and "asserted to return some results, but returned none" in str(e): lambda *_: HTTPException( - detail="developer not found", status_code=403 + detail="Developer not found. Please ensure the provided auth token (which refers to your developer_id) is valid and the developer has the necessary permissions to create an agent.", + status_code=403 ), QueryException: partialclass(HTTPException, status_code=400, detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), ValidationError: partialclass(HTTPException, status_code=400, detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), diff --git a/agents-api/agents_api/models/agent/delete_agent.py b/agents-api/agents_api/models/agent/delete_agent.py index cb6b16718..d8f710481 100644 --- a/agents-api/agents_api/models/agent/delete_agent.py +++ b/agents-api/agents_api/models/agent/delete_agent.py @@ -30,7 +30,8 @@ lambda e: isinstance(e, QueryException) and "Developer does not own resource" in e.resp["display"]: lambda *_: HTTPException( - detail="developer not found or doesnt own resource", status_code=404 + detail="The specified developer does not own the requested resource. Please verify the ownership or check if the developer ID is correct.", + status_code=404 ), QueryException: partialclass(HTTPException, status_code=400,detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), ValidationError: partialclass(HTTPException, status_code=400,detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), From c5ea3ba75e9e1ef86efee81c093f46565e98b00b Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Thu, 3 Oct 2024 20:38:48 -0400 Subject: [PATCH 036/113] feat(agents-api): Naive speed improvement to cozo queries by adding limit=1 to all relevant queries (#580) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Improve CozoDB query performance by adding `:limit 1` to relevant queries and restructure CI/CD workflows for agents-api. > > - **Performance Improvement**: > - Add `:limit 1` to CozoDB queries in `get_agent.py`, `get_cached_response.py`, and `prepare_chat_context.py` among others to improve query performance. > - **CI/CD Workflow**: > - Rename `lint-and-format.yml` to `lint-agents-api-pr.yml` and remove typecheck and test steps. > - Add `test-agents-api-pr.yml` for running tests on pull requests. > - Add `typecheck-agents-api-pr.yml` for type-checking on pull requests. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 4cd6bb0379e5afe3fb9941a338a1d7ab89f8ca0d. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- ...-and-format.yml => lint-agents-api-pr.yml} | 18 ------ .github/workflows/test-agents-api-pr.yml | 48 ++++++++++++++++ .github/workflows/typecheck-agents-api-pr.yml | 56 +++++++++++++++++++ .../agents_api/models/agent/get_agent.py | 2 + .../models/chat/get_cached_response.py | 1 + .../models/chat/prepare_chat_context.py | 2 + .../models/developer/get_developer.py | 2 + .../agents_api/models/docs/embed_snippets.py | 1 + agents-api/agents_api/models/docs/get_doc.py | 2 + .../agents_api/models/entry/get_history.py | 4 +- .../execution/create_execution_transition.py | 2 + .../execution/get_execution_transition.py | 4 +- .../execution/get_paused_execution_token.py | 1 + .../execution/get_temporal_workflow_data.py | 2 + .../models/execution/lookup_temporal_data.py | 2 + .../execution/prepare_execution_input.py | 2 + .../models/execution/update_execution.py | 2 + .../agents_api/models/session/get_session.py | 5 +- .../models/session/prepare_session_data.py | 2 + .../agents_api/models/tools/create_tools.py | 1 + .../agents_api/models/tools/get_tool.py | 2 + .../tools/get_tool_args_from_metadata.py | 4 ++ agents-api/agents_api/models/user/get_user.py | 5 +- agents-api/agents_api/models/utils.py | 4 ++ 24 files changed, 152 insertions(+), 22 deletions(-) rename .github/workflows/{lint-and-format.yml => lint-agents-api-pr.yml} (76%) create mode 100644 .github/workflows/test-agents-api-pr.yml create mode 100644 .github/workflows/typecheck-agents-api-pr.yml diff --git a/.github/workflows/lint-and-format.yml b/.github/workflows/lint-agents-api-pr.yml similarity index 76% rename from .github/workflows/lint-and-format.yml rename to .github/workflows/lint-agents-api-pr.yml index ab74c7e9b..90fdd0a4b 100644 --- a/.github/workflows/lint-and-format.yml +++ b/.github/workflows/lint-agents-api-pr.yml @@ -33,35 +33,17 @@ jobs: restore-keys: | ${{ runner.os }}-agents-api-poetry- - - name: Cache pytype - uses: actions/cache@v4 - with: - path: agents-api/.pytype - key: ${{ runner.os }}-agents-api-pytype- - restore-keys: | - ${{ runner.os }}-agents-api-pytype- - - name: Install dependencies run: | cd agents-api poetry install - - name: Typecheck - run: | - cd agents-api - poetry run poe typecheck - - name: Lint and format run: | cd agents-api poetry run poe format poetry run poe lint - - name: Run tests - run: | - cd agents-api - poetry run poe test - - uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: "refactor: Lint agents-api (CI)" diff --git a/.github/workflows/test-agents-api-pr.yml b/.github/workflows/test-agents-api-pr.yml new file mode 100644 index 000000000..b0f815634 --- /dev/null +++ b/.github/workflows/test-agents-api-pr.yml @@ -0,0 +1,48 @@ +name: Test agents-api +run-name: ${{ github.actor }} is testing the code + +# TODO: Fix CI github actions +# SCRUM-26 + +on: [pull_request] + +jobs: + Test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + + - name: Configure Poetry to use .venv + run: | + cd agents-api + poetry config virtualenvs.in-project true + + - name: Cache Poetry virtualenv + uses: actions/cache@v4 + with: + path: agents-api/.venv + key: ${{ runner.os }}-agents-api-poetry-${{ hashFiles('agents-api/poetry.lock') }} + restore-keys: | + ${{ runner.os }}-agents-api-poetry- + + - name: Install dependencies + run: | + cd agents-api + poetry install + + - name: Run tests + run: | + cd agents-api + poetry run poe test --fail-limit 1 + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} diff --git a/.github/workflows/typecheck-agents-api-pr.yml b/.github/workflows/typecheck-agents-api-pr.yml new file mode 100644 index 000000000..513390883 --- /dev/null +++ b/.github/workflows/typecheck-agents-api-pr.yml @@ -0,0 +1,56 @@ +name: Typecheck agents-api +run-name: ${{ github.actor }} is typechecking the code + +# TODO: Fix CI github actions +# SCRUM-26 + +on: [pull_request] + +jobs: + Typecheck: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + + - name: Configure Poetry to use .venv + run: | + cd agents-api + poetry config virtualenvs.in-project true + + - name: Cache Poetry virtualenv + uses: actions/cache@v4 + with: + path: agents-api/.venv + key: ${{ runner.os }}-agents-api-poetry-${{ hashFiles('agents-api/poetry.lock') }} + restore-keys: | + ${{ runner.os }}-agents-api-poetry- + + - name: Cache pytype + uses: actions/cache@v4 + with: + path: agents-api/.pytype + key: ${{ runner.os }}-agents-api-pytype-${{ github.base_ref }} + restore-keys: | + ${{ runner.os }}-agents-api-pytype- + + - name: Install dependencies + run: | + cd agents-api + poetry install + + - name: Typecheck + run: | + cd agents-api + poetry run poe typecheck + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} diff --git a/agents-api/agents_api/models/agent/get_agent.py b/agents-api/agents_api/models/agent/get_agent.py index 956fa46a5..f8127751a 100644 --- a/agents-api/agents_api/models/agent/get_agent.py +++ b/agents-api/agents_api/models/agent/get_agent.py @@ -101,6 +101,8 @@ def get_agent(*, developer_id: UUID, agent_id: UUID) -> tuple[list[str], dict]: "min_p": min_p, "preset": preset, } + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/chat/get_cached_response.py b/agents-api/agents_api/models/chat/get_cached_response.py index 5440a6703..368c88567 100644 --- a/agents-api/agents_api/models/chat/get_cached_response.py +++ b/agents-api/agents_api/models/chat/get_cached_response.py @@ -9,6 +9,7 @@ def get_cached_response(key: str) -> tuple[str, dict]: query = """ input[key] <- [[$key]] ?[key, value] := input[key], *session_cache{key, value} + :limit 1 """ return (query, {"key": key}) diff --git a/agents-api/agents_api/models/chat/prepare_chat_context.py b/agents-api/agents_api/models/chat/prepare_chat_context.py index 4d521acb0..9be2d64aa 100644 --- a/agents-api/agents_api/models/chat/prepare_chat_context.py +++ b/agents-api/agents_api/models/chat/prepare_chat_context.py @@ -119,6 +119,8 @@ def prepare_chat_context( ?[{', '.join(session_data_fields)}, toolsets] := *_session_data_json {{ {', '.join(session_data_fields)} }}, *_toolsets_json {{ toolsets }} + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/developer/get_developer.py b/agents-api/agents_api/models/developer/get_developer.py index 31ade5334..0ae5421aa 100644 --- a/agents-api/agents_api/models/developer/get_developer.py +++ b/agents-api/agents_api/models/developer/get_developer.py @@ -67,6 +67,8 @@ def get_developer( created_at, updated_at, } + + :limit 1 """ return (query, {"developer_id": developer_id}) diff --git a/agents-api/agents_api/models/docs/embed_snippets.py b/agents-api/agents_api/models/docs/embed_snippets.py index e810d0379..993e76396 100644 --- a/agents-api/agents_api/models/docs/embed_snippets.py +++ b/agents-api/agents_api/models/docs/embed_snippets.py @@ -81,6 +81,7 @@ def embed_snippets( }}, index > {max(snippet_indices)} + :limit 1 :assert none """ diff --git a/agents-api/agents_api/models/docs/get_doc.py b/agents-api/agents_api/models/docs/get_doc.py index 4b3996c27..e81084985 100644 --- a/agents-api/agents_api/models/docs/get_doc.py +++ b/agents-api/agents_api/models/docs/get_doc.py @@ -87,6 +87,8 @@ def get_doc( metadata, }, snippets[snippet_data] + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/entry/get_history.py b/agents-api/agents_api/models/entry/get_history.py index 8918d357f..bd3c0397a 100644 --- a/agents-api/agents_api/models/entry/get_history.py +++ b/agents-api/agents_api/models/entry/get_history.py @@ -131,7 +131,9 @@ def get_history( session_relations[relations], session_id = to_uuid($session_id), created_at = now() - """ + + :limit 1 + """ queries = [ verify_developer_id_query(developer_id), diff --git a/agents-api/agents_api/models/execution/create_execution_transition.py b/agents-api/agents_api/models/execution/create_execution_transition.py index 42c6f1c22..f40395126 100644 --- a/agents-api/agents_api/models/execution/create_execution_transition.py +++ b/agents-api/agents_api/models/execution/create_execution_transition.py @@ -141,6 +141,8 @@ def create_execution_transition( found = length(prev_transitions), valid = if($next_type == "init", found == 0, found > 0), assert(valid, "Invalid transition"), + + :limit 1 """ # Prepare the insert query diff --git a/agents-api/agents_api/models/execution/get_execution_transition.py b/agents-api/agents_api/models/execution/get_execution_transition.py index d3ebf3783..e2b38789a 100644 --- a/agents-api/agents_api/models/execution/get_execution_transition.py +++ b/agents-api/agents_api/models/execution/get_execution_transition.py @@ -65,7 +65,9 @@ def get_execution_transition( is_null(next_tuple), null, {"workflow": next_tuple->0, "step": next_tuple->1}, - ), + ) + + :limit 1 """ get_query += filter diff --git a/agents-api/agents_api/models/execution/get_paused_execution_token.py b/agents-api/agents_api/models/execution/get_paused_execution_token.py index b4c9f9081..44eb8a4da 100644 --- a/agents-api/agents_api/models/execution/get_paused_execution_token.py +++ b/agents-api/agents_api/models/execution/get_paused_execution_token.py @@ -45,6 +45,7 @@ def get_paused_execution_token( execution_id = to_uuid($execution_id), status = "awaiting_input" + :limit 1 :assert some """ diff --git a/agents-api/agents_api/models/execution/get_temporal_workflow_data.py b/agents-api/agents_api/models/execution/get_temporal_workflow_data.py index bb0a462ef..8b1bf4604 100644 --- a/agents-api/agents_api/models/execution/get_temporal_workflow_data.py +++ b/agents-api/agents_api/models/execution/get_temporal_workflow_data.py @@ -45,6 +45,8 @@ def get_temporal_workflow_data( result_run_id, first_execution_run_id, } + + :limit 1 """ return ( diff --git a/agents-api/agents_api/models/execution/lookup_temporal_data.py b/agents-api/agents_api/models/execution/lookup_temporal_data.py index e3c369b94..35f09129b 100644 --- a/agents-api/agents_api/models/execution/lookup_temporal_data.py +++ b/agents-api/agents_api/models/execution/lookup_temporal_data.py @@ -43,6 +43,8 @@ def lookup_temporal_data( *temporal_executions_lookup { id, execution_id, run_id, first_execution_run_id, result_run_id } + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/execution/prepare_execution_input.py b/agents-api/agents_api/models/execution/prepare_execution_input.py index b763a7508..5f30e7f83 100644 --- a/agents-api/agents_api/models/execution/prepare_execution_input.py +++ b/agents-api/agents_api/models/execution/prepare_execution_input.py @@ -187,6 +187,8 @@ def prepare_execution_input( user = null, session = null, arguments = execution->"input" + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/execution/update_execution.py b/agents-api/agents_api/models/execution/update_execution.py index c2f40c7ff..4d0367ae4 100644 --- a/agents-api/agents_api/models/execution/update_execution.py +++ b/agents-api/agents_api/models/execution/update_execution.py @@ -82,6 +82,8 @@ def update_execution( ?[num] := valid_status[num], assert(num > 0, 'Invalid status') + + :limit 1 """ update_query = f""" diff --git a/agents-api/agents_api/models/session/get_session.py b/agents-api/agents_api/models/session/get_session.py index 2d8956eb7..45d971c3f 100644 --- a/agents-api/agents_api/models/session/get_session.py +++ b/agents-api/agents_api/models/session/get_session.py @@ -95,7 +95,10 @@ def get_session( token_budget, context_overflow, @ "END" - }, updated_at = to_int(validity) + }, + updated_at = to_int(validity) + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/session/prepare_session_data.py b/agents-api/agents_api/models/session/prepare_session_data.py index e8cfb7fc7..bbbd9c4cd 100644 --- a/agents-api/agents_api/models/session/prepare_session_data.py +++ b/agents-api/agents_api/models/session/prepare_session_data.py @@ -209,6 +209,8 @@ def prepare_session_data( session_data[session], user_data[users], agent_data[agents] + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/tools/create_tools.py b/agents-api/agents_api/models/tools/create_tools.py index dd8397797..87ea3a9cf 100644 --- a/agents-api/agents_api/models/tools/create_tools.py +++ b/agents-api/agents_api/models/tools/create_tools.py @@ -80,6 +80,7 @@ def create_tools( name, } + :limit 1 :assert none """ diff --git a/agents-api/agents_api/models/tools/get_tool.py b/agents-api/agents_api/models/tools/get_tool.py index 5ea009064..465fd2efe 100644 --- a/agents-api/agents_api/models/tools/get_tool.py +++ b/agents-api/agents_api/models/tools/get_tool.py @@ -68,6 +68,8 @@ def get_tool( updated_at, created_at, } + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py b/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py index ade296a29..2cdb92cb9 100644 --- a/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py +++ b/agents-api/agents_api/models/tools/get_tool_args_from_metadata.py @@ -46,6 +46,8 @@ def tool_args_for_task( # Right values overwrite left values # See: https://docs.cozodb.org/en/latest/functions.html#Func.Vector.concat values = concat(agent_{arg_type}, task_{arg_type}), + + :limit 1 """ queries = [ @@ -88,6 +90,8 @@ def tool_args_for_session( # Right values overwrite left values # See: https://docs.cozodb.org/en/latest/functions.html#Func.Vector.concat values = concat(agent_{arg_type}, session_{arg_type}), + + :limit 1 """ queries = [ diff --git a/agents-api/agents_api/models/user/get_user.py b/agents-api/agents_api/models/user/get_user.py index cc7c6f970..2b4f59c83 100644 --- a/agents-api/agents_api/models/user/get_user.py +++ b/agents-api/agents_api/models/user/get_user.py @@ -67,7 +67,10 @@ def get_user( created_at, updated_at, metadata, - }""" + } + + :limit 1 + """ queries = [ verify_developer_id_query(developer_id), diff --git a/agents-api/agents_api/models/utils.py b/agents-api/agents_api/models/utils.py index c97d92451..c163642c0 100644 --- a/agents-api/agents_api/models/utils.py +++ b/agents-api/agents_api/models/utils.py @@ -127,6 +127,8 @@ def verify_developer_id_query(developer_id: UUID | str) -> str: matched[num], exists = num > 0, assert(exists, "Developer does not exist") + + :limit 1 """ @@ -162,6 +164,8 @@ def verify_developer_owns_resource_query( found[num], exists = num > 0, assert(exists, "Developer does not own resource {resource} with {resource_id_key} {resource_id_value}") + + :limit 1 """ rule = rule_head + rule_body + assertion From 3f7979123396be3c05b913af24524a21f17f72c8 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Fri, 4 Oct 2024 00:39:34 +0000 Subject: [PATCH 037/113] refactor: Lint agents-api (CI) --- .../agents_api/models/agent/create_agent.py | 20 +++++++++++++++---- .../models/agent/create_or_update_agent.py | 18 ++++++++++++++--- .../agents_api/models/agent/delete_agent.py | 20 +++++++++++++++---- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/agents-api/agents_api/models/agent/create_agent.py b/agents-api/agents_api/models/agent/create_agent.py index c1451bb30..a52a7b771 100644 --- a/agents-api/agents_api/models/agent/create_agent.py +++ b/agents-api/agents_api/models/agent/create_agent.py @@ -31,11 +31,23 @@ and "asserted to return some results, but returned none" in str(e): lambda *_: HTTPException( detail="Developer not found. Please ensure the provided auth token (which refers to your developer_id) is valid and the developer has the necessary permissions to create an agent.", - status_code=403 + status_code=403, + ), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", ), - QueryException: partialclass(HTTPException, status_code=400, detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), - ValidationError: partialclass(HTTPException, status_code=400, detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), - TypeError: partialclass(HTTPException, status_code=400, detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again."), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/agent/create_or_update_agent.py b/agents-api/agents_api/models/agent/create_or_update_agent.py index 17e01fccb..835245787 100644 --- a/agents-api/agents_api/models/agent/create_or_update_agent.py +++ b/agents-api/agents_api/models/agent/create_or_update_agent.py @@ -27,9 +27,21 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400,detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), - ValidationError: partialclass(HTTPException, status_code=400,detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), - TypeError: partialclass(HTTPException, status_code=400,detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again."), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", + ), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/agent/delete_agent.py b/agents-api/agents_api/models/agent/delete_agent.py index d8f710481..c8bdc2106 100644 --- a/agents-api/agents_api/models/agent/delete_agent.py +++ b/agents-api/agents_api/models/agent/delete_agent.py @@ -31,11 +31,23 @@ and "Developer does not own resource" in e.resp["display"]: lambda *_: HTTPException( detail="The specified developer does not own the requested resource. Please verify the ownership or check if the developer ID is correct.", - status_code=404 + status_code=404, + ), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", ), - QueryException: partialclass(HTTPException, status_code=400,detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect."), - ValidationError: partialclass(HTTPException, status_code=400,detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format."), - TypeError: partialclass(HTTPException, status_code=400,detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again."), } ) @wrap_in_class( From fe8a8c9d9653b1023a398619f322832a772842b2 Mon Sep 17 00:00:00 2001 From: Ho Yin <88828097+lhy-hoyin@users.noreply.github.com> Date: Fri, 4 Oct 2024 08:39:50 +0800 Subject: [PATCH 038/113] Improve docstrings + minor code refactor (#545) This PR includes: - Adding, formatting and improving of docstring comments - Updating absolute imports to relative imports (similar to other files) ---- > [!IMPORTANT] > Improved docstrings, switched to relative imports, and used a constant for `EMBEDDING_SIZE` for better code clarity and consistency. > > - **Docstrings**: > - Improved and formatted docstrings across multiple files for clarity and consistency. > - Added detailed attribute descriptions in exception classes like `AgentNotFoundError` and `UserNotFoundError`. > - **Imports**: > - Updated absolute imports to relative imports in files like `truncation.py`, `worker.py`, and `messages.py` for consistency. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for c27aebf2cdfb27a2f94306001140974ad2bb3659. It will automatically update as commits are pushed. --------- Co-authored-by: Diwank Singh Tomer --- .../agents_api/activities/truncation.py | 2 +- .../agents_api/clients/worker/worker.py | 2 +- .../agents_api/common/exceptions/__init__.py | 6 +++-- .../agents_api/common/exceptions/agents.py | 25 ++++++++++++++++--- .../agents_api/common/exceptions/sessions.py | 24 +++++++----------- .../agents_api/common/exceptions/users.py | 12 ++++++--- .../agents_api/common/protocol/agents.py | 20 +++++++++------ agents-api/agents_api/common/utils/json.py | 22 +++++++++++----- .../agents_api/common/utils/messages.py | 2 +- agents-api/agents_api/exceptions.py | 6 +++++ .../agents_api/models/agent/create_agent.py | 8 +++--- .../models/agent/create_or_update_agent.py | 20 +++++++-------- .../agents_api/models/agent/delete_agent.py | 8 +++--- .../agents_api/models/agent/get_agent.py | 8 +++--- .../agents_api/models/agent/patch_agent.py | 10 ++++---- .../agents_api/models/agent/update_agent.py | 10 ++++---- .../agents_api/models/chat/gather_messages.py | 3 +-- .../agents_api/models/docs/create_doc.py | 8 +++--- .../agents_api/models/docs/embed_snippets.py | 6 ++--- .../models/docs/search_docs_by_embedding.py | 12 ++++----- .../models/docs/search_docs_by_text.py | 6 ++--- .../agents_api/models/entry/delete_entries.py | 2 +- .../models/session/delete_session.py | 6 ++--- .../models/session/list_sessions.py | 3 ++- .../models/session/patch_session.py | 9 ++++--- .../agents_api/models/tools/create_tools.py | 6 ++--- .../agents_api/models/tools/patch_tool.py | 10 ++++---- .../models/user/create_or_update_user.py | 14 +++++------ .../agents_api/models/user/delete_user.py | 8 +++--- .../agents_api/models/user/list_users.py | 10 ++++---- .../agents_api/models/user/patch_user.py | 8 +++--- .../agents_api/models/user/update_user.py | 3 ++- agents-api/agents_api/routers/jobs/routers.py | 4 +-- .../routers/tasks/create_or_update_task.py | 7 +++--- .../routers/tasks/get_execution_details.py | 5 ++-- .../tasks/list_execution_transitions.py | 5 ++-- .../routers/tasks/list_task_executions.py | 7 +++--- .../agents_api/routers/tasks/list_tasks.py | 7 +++--- .../routers/tasks/patch_execution.py | 7 +++--- .../routers/tasks/update_execution.py | 11 ++++---- agents-api/tests/fixtures.py | 2 +- agents-api/tests/test_activities.py | 9 ++----- agents-api/tests/test_docs_routes.py | 4 +-- agents-api/tests/test_execution_queries.py | 2 +- agents-api/tests/test_execution_workflow.py | 4 +-- agents-api/tests/test_task_queries.py | 2 +- agents-api/tests/test_task_routes.py | 4 +-- agents-api/tests/test_workflow_routes.py | 4 +-- agents-api/tests/utils.py | 1 + 49 files changed, 209 insertions(+), 175 deletions(-) diff --git a/agents-api/agents_api/activities/truncation.py b/agents-api/agents_api/activities/truncation.py index 4742ee6d4..afdb43da4 100644 --- a/agents-api/agents_api/activities/truncation.py +++ b/agents-api/agents_api/activities/truncation.py @@ -3,7 +3,7 @@ from beartype import beartype from temporalio import activity -from agents_api.autogen.openapi_model import Entry +from ..autogen.openapi_model import Entry # from agents_api.models.entry.entries_summarization import get_toplevel_entries_query diff --git a/agents-api/agents_api/clients/worker/worker.py b/agents-api/agents_api/clients/worker/worker.py index 1deb8d1c3..55b810c3e 100644 --- a/agents-api/agents_api/clients/worker/worker.py +++ b/agents-api/agents_api/clients/worker/worker.py @@ -1,6 +1,6 @@ import httpx -from agents_api.env import temporal_worker_url +from ...env import temporal_worker_url from .types import ( MemoryManagementTask, diff --git a/agents-api/agents_api/common/exceptions/__init__.py b/agents-api/agents_api/common/exceptions/__init__.py index a38a546a2..571691082 100644 --- a/agents-api/agents_api/common/exceptions/__init__.py +++ b/agents-api/agents_api/common/exceptions/__init__.py @@ -1,12 +1,14 @@ """ -This module defines a structured hierarchy of custom exceptions for the agents API, aimed at handling specific error scenarios encountered across various operations. These exceptions are designed to provide clear, actionable error messages and appropriate HTTP status codes, enhancing the API's robustness and usability. +This module defines a structured hierarchy of custom exceptions for the agents API, aimed at handling specific error scenarios encountered across various operations. +These exceptions are designed to provide clear, actionable error messages and appropriate HTTP status codes, enhancing the API's robustness and usability. Exceptions are organized into categories based on the domain of operation, including: - Agent-related operations (agents.py): Exceptions such as `AgentNotFoundError` and `AgentToolNotFoundError` cater to errors specific to agent management. - Session management (sessions.py): Defines exceptions like `SessionNotFoundError` for handling errors related to session operations. - User interactions (users.py): Includes exceptions such as `UserNotFoundError` for addressing issues encountered during user-related operations. -All custom exceptions extend from `BaseCommonException`, which encapsulates common attributes and behavior, including the error message and HTTP status code. This structured approach to exception handling facilitates precise and meaningful error feedback to API consumers, thereby improving the overall developer experience. +All custom exceptions extend from `BaseCommonException`, which encapsulates common attributes and behavior, including the error message and HTTP status code. +This structured approach to exception handling facilitates precise and meaningful error feedback to API consumers, thereby improving the overall developer experience. """ diff --git a/agents-api/agents_api/common/exceptions/agents.py b/agents-api/agents_api/common/exceptions/agents.py index c412eba35..e58f25104 100644 --- a/agents-api/agents_api/common/exceptions/agents.py +++ b/agents-api/agents_api/common/exceptions/agents.py @@ -12,7 +12,12 @@ class BaseAgentException(BaseCommonException): class AgentNotFoundError(BaseAgentException): - """Exception raised when a requested agent cannot be found.""" + """ + Exception raised when a requested agent cannot be found. + Attributes: + developer_id (UUID | str): The ID of the developer attempting the operation. + agent_id (UUID | str): The ID of the agent that was not found. + """ def __init__(self, developer_id: UUID | str, agent_id: UUID | str): # Initialize the exception with a message indicating the missing agent and developer ID. @@ -23,7 +28,12 @@ def __init__(self, developer_id: UUID | str, agent_id: UUID | str): class AgentToolNotFoundError(BaseAgentException): - """Exception raised when a requested tool associated with an agent cannot be found.""" + """ + Exception raised when a requested tool associated with an agent cannot be found. + Attributes: + agent_id (UUID | str): The ID of the agent that was not found. + tool_id (UUID | str): The ID of the tool that was not found. + """ def __init__(self, agent_id: UUID | str, tool_id: UUID | str): # Initialize the exception with a message indicating the missing tool and agent ID. @@ -33,7 +43,12 @@ def __init__(self, agent_id: UUID | str, tool_id: UUID | str): class AgentDocNotFoundError(BaseAgentException): - """Exception raised when a requested document associated with an agent cannot be found.""" + """ + Exception raised when a requested document associated with an agent cannot be found. + Attributes: + agent_id (UUID | str): The ID of the agent that was not found. + doc_id (UUID | str): The ID of the document that was not found. + """ def __init__(self, agent_id: UUID | str, doc_id: UUID | str): # Initialize the exception with a message indicating the missing document and agent ID. @@ -43,6 +58,8 @@ def __init__(self, agent_id: UUID | str, doc_id: UUID | str): class AgentModelNotValid(BaseAgentException): + """Exception raised when requested model is not recognized.""" + def __init__(self, model: str, all_models: list[str]): super().__init__( f"Unknown model: {model}. Please provide a valid model name." @@ -52,6 +69,8 @@ def __init__(self, model: str, all_models: list[str]): class MissingAgentModelAPIKeyError(BaseAgentException): + """Exception raised when API key for requested model is missing.""" + def __init__(self, model: str): super().__init__( f"API key missing for model: {model}. Please provide a valid API key in the configuration", diff --git a/agents-api/agents_api/common/exceptions/sessions.py b/agents-api/agents_api/common/exceptions/sessions.py index d6c04aff5..14d6ff4e7 100644 --- a/agents-api/agents_api/common/exceptions/sessions.py +++ b/agents-api/agents_api/common/exceptions/sessions.py @@ -8,29 +8,23 @@ from . import BaseCommonException -""" -Base exception class for session-related errors. - -This class serves as a base for all session-related exceptions, allowing for a structured exception handling approach specific to session operations. -""" - - class BaseSessionException(BaseCommonException): - pass - + """ + Base exception class for session-related errors. -""" -Exception raised when a session cannot be found. + This class serves as a base for all session-related exceptions, allowing for a structured exception handling approach specific to session operations. + """ -This exception is used to indicate that a specific session, identified by its session ID, does not exist or is not accessible for the given developer. -""" + pass class SessionNotFoundError(BaseSessionException): """ - Initializes a new instance of the SessionNotFoundError. + Exception raised when a session cannot be found. + + This exception is used to indicate that a specific session, identified by its session ID, does not exist or is not accessible for the given developer. - Args: + Attributes: developer_id (UUID | str): The unique identifier of the developer attempting to access the session. session_id (UUID | str): The unique identifier of the session that was not found. """ diff --git a/agents-api/agents_api/common/exceptions/users.py b/agents-api/agents_api/common/exceptions/users.py index 2f7f58ed6..cf4e995ad 100644 --- a/agents-api/agents_api/common/exceptions/users.py +++ b/agents-api/agents_api/common/exceptions/users.py @@ -6,13 +6,18 @@ class BaseUserException(BaseCommonException): - """Base exception class for user-related errors. This class serves as a parent for all user-related exceptions to facilitate catching errors specific to user operations.""" + """ + Base exception class for user-related errors. + + This class serves as a parent for all user-related exceptions to facilitate catching errors specific to user operations. + """ pass class UserNotFoundError(BaseUserException): - """Exception raised when a requested user cannot be found. + """ + Exception raised when a requested user cannot be found. Attributes: developer_id (UUID | str): The ID of the developer attempting the operation. user_id (UUID | str): The ID of the user that was not found. @@ -27,7 +32,8 @@ def __init__(self, developer_id: UUID | str, user_id: UUID | str): class UserDocNotFoundError(BaseUserException): - """Exception raised when a specific document related to a user cannot be found. + """ + Exception raised when a specific document related to a user cannot be found. Attributes: user_id (UUID | str): The ID of the user associated with the document. doc_id (UUID | str): The ID of the document that was not found. diff --git a/agents-api/agents_api/common/protocol/agents.py b/agents-api/agents_api/common/protocol/agents.py index 222f91f01..fb8b4f063 100644 --- a/agents-api/agents_api/common/protocol/agents.py +++ b/agents-api/agents_api/common/protocol/agents.py @@ -4,17 +4,23 @@ class AgentDefaultSettings(BaseModel): """Defines default settings for an agent. These settings control various aspects of the agent's behavior during operation.""" - """Temperature setting influencing the randomness of the agent's responses. Higher values lead to more random responses.""" temperature: float = 0.0 - """Top-p sampling setting controlling the nucleus of the probability distribution to sample from.""" + """Temperature setting influencing the randomness of the agent's responses. Higher values lead to more random responses.""" + top_p: float = 1.0 - """Penalty applied to discourage repetition in the agent's responses.""" + """Top-p sampling setting controlling the nucleus of the probability distribution to sample from.""" + repetition_penalty: float = 1.0 - """Penalty for longer responses, encouraging more concise outputs.""" + """Penalty applied to discourage repetition in the agent's responses.""" + length_penalty: float = 1.0 - """Penalty applied based on the presence of certain words, influencing content generation.""" + """Penalty for longer responses, encouraging more concise outputs.""" + presence_penalty: float = 0.0 - """Penalty that decreases the likelihood of frequently used words in the agent's responses.""" + """Penalty applied based on the presence of certain words, influencing content generation.""" + frequency_penalty: float = 0.0 - """Minimum probability threshold for including a word in the agent's response.""" + """Penalty that decreases the likelihood of frequently used words in the agent's responses.""" + min_p: float = 0.01 + """Minimum probability threshold for including a word in the agent's response.""" diff --git a/agents-api/agents_api/common/utils/json.py b/agents-api/agents_api/common/utils/json.py index 3157af9c8..ec53ecb27 100644 --- a/agents-api/agents_api/common/utils/json.py +++ b/agents-api/agents_api/common/utils/json.py @@ -11,28 +11,35 @@ class CustomJSONEncoder(json.JSONEncoder): """A custom JSON encoder subclass that handles None values and UUIDs for JSON serialization. It allows specifying a default value for None objects during initialization.""" def __init__(self, *args, **kwargs) -> None: - """Initializes the custom JSON encoder. + """ + Initializes the custom JSON encoder. Parameters: *args: Variable length argument list. **kwargs: Arbitrary keyword arguments. The 'default_empty_value' keyword argument specifies the default value to use for None objects during serialization. """ + self._default_empty_value = kwargs.pop("default_empty_value") super().__init__(*args, **kwargs) def encode(self, o) -> str: - """Encodes the given object into a JSON formatted string. + """ + Encodes the given object into a JSON formatted string. Parameters: o: The object to encode. - Returns: A JSON formatted string representing 'o'.""" + Returns: A JSON formatted string representing 'o'. + """ + # Use the overridden default method for serialization before encoding return super().encode(self.default(o)) def default(self, obj) -> Any: - """Provides a default serialization for objects that the standard JSON encoder cannot serialize. + """ + Provides a default serialization for objects that the standard JSON encoder cannot serialize. Parameters: obj: The object to serialize. Returns: A serializable object or raises a TypeError if the object is not serializable. """ + if obj is None: return self._default_empty_value @@ -46,12 +53,15 @@ def default(self, obj) -> Any: def dumps(obj: Any, default_empty_value="", cls=None) -> str: - """Serializes an object to a JSON formatted string using the custom JSON encoder. + """ + Serializes an object to a JSON formatted string using the custom JSON encoder. Parameters: obj: The object to serialize. default_empty_value: The default value to use for None objects. cls: The custom encoder class to use, defaults to CustomJSONEncoder. - Returns: A JSON formatted string.""" + Returns: A JSON formatted string. + """ + return json.dumps( obj, cls=cls or CustomJSONEncoder, default_empty_value=default_empty_value ) diff --git a/agents-api/agents_api/common/utils/messages.py b/agents-api/agents_api/common/utils/messages.py index fd971296c..c94808324 100644 --- a/agents-api/agents_api/common/utils/messages.py +++ b/agents-api/agents_api/common/utils/messages.py @@ -1,7 +1,7 @@ import json from typing import cast -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( ChatMLImageContentPart, ChatMLTextContentPart, ) diff --git a/agents-api/agents_api/exceptions.py b/agents-api/agents_api/exceptions.py index fbb8f00f8..4fbf8a2b9 100644 --- a/agents-api/agents_api/exceptions.py +++ b/agents-api/agents_api/exceptions.py @@ -3,11 +3,15 @@ class AgentsBaseException(Exception): class ModelNotSupportedError(AgentsBaseException): + """Exception raised when model is not supported.""" + def __init__(self, model_name) -> None: super().__init__(f"model {model_name} is not supported") class PromptTooBigError(AgentsBaseException): + """Exception raised when prompt is too big.""" + def __init__(self, token_count, max_tokens) -> None: super().__init__( f"prompt is too big, {token_count} tokens provided, exceeds maximum of {max_tokens}" @@ -15,5 +19,7 @@ def __init__(self, token_count, max_tokens) -> None: class UnknownTokenizerError(AgentsBaseException): + """Exception raised when tokenizer is unknown.""" + def __init__(self) -> None: super().__init__("unknown tokenizer") diff --git a/agents-api/agents_api/models/agent/create_agent.py b/agents-api/agents_api/models/agent/create_agent.py index a52a7b771..98daab540 100644 --- a/agents-api/agents_api/models/agent/create_agent.py +++ b/agents-api/agents_api/models/agent/create_agent.py @@ -68,12 +68,12 @@ def create_agent( Constructs and executes a datalog query to create a new agent in the database. Parameters: - - agent_id (UUID | None): The unique identifier for the agent. - - developer_id (UUID): The unique identifier for the developer creating the agent. - - data (CreateAgentRequest): The data for the new agent. + agent_id (UUID | None): The unique identifier for the agent. + developer_id (UUID): The unique identifier for the developer creating the agent. + data (CreateAgentRequest): The data for the new agent. Returns: - - Agent: The newly created agent record. + Agent: The newly created agent record. """ agent_id = agent_id or uuid4() diff --git a/agents-api/agents_api/models/agent/create_or_update_agent.py b/agents-api/agents_api/models/agent/create_or_update_agent.py index 835245787..3902c1bb5 100644 --- a/agents-api/agents_api/models/agent/create_or_update_agent.py +++ b/agents-api/agents_api/models/agent/create_or_update_agent.py @@ -59,18 +59,18 @@ def create_or_update_agent( Constructs and executes a datalog query to create a new agent in the database. Parameters: - - agent_id (UUID): The unique identifier for the agent. - - developer_id (UUID): The unique identifier for the developer creating the agent. - - name (str): The name of the agent. - - about (str): A description of the agent. - - instructions (list[str], optional): A list of instructions for using the agent. Defaults to an empty list. - - model (str, optional): The model identifier for the agent. Defaults to "gpt-4o". - - metadata (dict, optional): A dictionary of metadata for the agent. Defaults to an empty dict. - - default_settings (dict, optional): A dictionary of default settings for the agent. Defaults to an empty dict. - - client (CozoClient, optional): The CozoDB client instance to use for the query. Defaults to a preconfigured client instance. + agent_id (UUID): The unique identifier for the agent. + developer_id (UUID): The unique identifier for the developer creating the agent. + name (str): The name of the agent. + about (str): A description of the agent. + instructions (list[str], optional): A list of instructions for using the agent. Defaults to an empty list. + model (str, optional): The model identifier for the agent. Defaults to "gpt-4o". + metadata (dict, optional): A dictionary of metadata for the agent. Defaults to an empty dict. + default_settings (dict, optional): A dictionary of default settings for the agent. Defaults to an empty dict. + client (CozoClient, optional): The CozoDB client instance to use for the query. Defaults to a preconfigured client instance. Returns: - Agent: The newly created agent record. + Agent: The newly created agent record. """ # Extract the agent data from the payload diff --git a/agents-api/agents_api/models/agent/delete_agent.py b/agents-api/agents_api/models/agent/delete_agent.py index c8bdc2106..60de66292 100644 --- a/agents-api/agents_api/models/agent/delete_agent.py +++ b/agents-api/agents_api/models/agent/delete_agent.py @@ -67,12 +67,12 @@ def delete_agent(*, developer_id: UUID, agent_id: UUID) -> tuple[list[str], dict Constructs and returns a datalog query for deleting an agent and its default settings from the database. Parameters: - - developer_id (UUID): The UUID of the developer owning the agent. - - agent_id (UUID): The UUID of the agent to be deleted. - - client (CozoClient, optional): An instance of the CozoClient to execute the query. + developer_id (UUID): The UUID of the developer owning the agent. + agent_id (UUID): The UUID of the agent to be deleted. + client (CozoClient, optional): An instance of the CozoClient to execute the query. Returns: - - ResourceDeletedResponse: The response indicating the deletion of the agent. + ResourceDeletedResponse: The response indicating the deletion of the agent. """ queries = [ diff --git a/agents-api/agents_api/models/agent/get_agent.py b/agents-api/agents_api/models/agent/get_agent.py index f8127751a..bdae85fcb 100644 --- a/agents-api/agents_api/models/agent/get_agent.py +++ b/agents-api/agents_api/models/agent/get_agent.py @@ -46,12 +46,12 @@ def get_agent(*, developer_id: UUID, agent_id: UUID) -> tuple[list[str], dict]: This function constructs and executes a datalog query to retrieve information about a specific agent, including its default settings, based on the provided agent_id and developer_id. Parameters: - - developer_id (UUID): The unique identifier for the developer. - - agent_id (UUID): The unique identifier for the agent. - - client (CozoClient, optional): The database client used to execute the query. + developer_id (UUID): The unique identifier for the developer. + agent_id (UUID): The unique identifier for the agent. + client (CozoClient, optional): The database client used to execute the query. Returns: - - Agent + Agent """ # Constructing a datalog query to retrieve agent details and default settings. # The query uses input parameters for agent_id and developer_id to filter the results. diff --git a/agents-api/agents_api/models/agent/patch_agent.py b/agents-api/agents_api/models/agent/patch_agent.py index 72fdc7811..364d1a974 100644 --- a/agents-api/agents_api/models/agent/patch_agent.py +++ b/agents-api/agents_api/models/agent/patch_agent.py @@ -46,13 +46,13 @@ def patch_agent( """Patches agent data based on provided updates. Parameters: - agent_id (UUID): The unique identifier for the agent. - developer_id (UUID): The unique identifier for the developer. - default_settings (dict, optional): Default settings to apply to the agent. - **update_data: Arbitrary keyword arguments representing data to update. + agent_id (UUID): The unique identifier for the agent. + developer_id (UUID): The unique identifier for the developer. + default_settings (dict, optional): Default settings to apply to the agent. + **update_data: Arbitrary keyword arguments representing data to update. Returns: - ResourceUpdatedResponse: The updated agent data. + ResourceUpdatedResponse: The updated agent data. """ update_data = data.model_dump(exclude_unset=True) diff --git a/agents-api/agents_api/models/agent/update_agent.py b/agents-api/agents_api/models/agent/update_agent.py index be7e9ea21..992bb9796 100644 --- a/agents-api/agents_api/models/agent/update_agent.py +++ b/agents-api/agents_api/models/agent/update_agent.py @@ -46,13 +46,13 @@ def update_agent( Constructs and executes a datalog query to update an agent and its default settings in the 'cozodb' database. Parameters: - - agent_id (UUID): The unique identifier of the agent to be updated. - - developer_id (UUID): The unique identifier of the developer associated with the agent. - - data (UpdateAgentRequest): The request payload containing the updated agent data. - - client (CozoClient, optional): The database client used to execute the query. Defaults to a pre-configured client instance. + agent_id (UUID): The unique identifier of the agent to be updated. + developer_id (UUID): The unique identifier of the developer associated with the agent. + data (UpdateAgentRequest): The request payload containing the updated agent data. + client (CozoClient, optional): The database client used to execute the query. Defaults to a pre-configured client instance. Returns: - ResourceUpdatedResponse: The updated agent data. + ResourceUpdatedResponse: The updated agent data. """ default_settings = ( data.default_settings.model_dump(exclude_none=True) diff --git a/agents-api/agents_api/models/chat/gather_messages.py b/agents-api/agents_api/models/chat/gather_messages.py index c1683653f..b6bfdc217 100644 --- a/agents-api/agents_api/models/chat/gather_messages.py +++ b/agents-api/agents_api/models/chat/gather_messages.py @@ -6,8 +6,7 @@ from pycozo.client import QueryException from pydantic import ValidationError -from agents_api.autogen.Chat import ChatInput - +from ...autogen.Chat import ChatInput from ...autogen.openapi_model import DocReference, History from ...clients import litellm from ...common.protocol.developers import Developer diff --git a/agents-api/agents_api/models/docs/create_doc.py b/agents-api/agents_api/models/docs/create_doc.py index ee26df484..1c667bd51 100644 --- a/agents-api/agents_api/models/docs/create_doc.py +++ b/agents-api/agents_api/models/docs/create_doc.py @@ -50,10 +50,10 @@ def create_doc( Constructs and executes a datalog query to create a new document and its associated snippets in the 'cozodb' database. Parameters: - - owner_type (Literal["user", "agent"]): The type of the owner of the document. - - owner_id (UUID): The UUID of the document owner. - - id (UUID): The UUID of the document to be created. - - data (CreateDocRequest): The content of the document. + owner_type (Literal["user", "agent"]): The type of the owner of the document. + owner_id (UUID): The UUID of the document owner. + id (UUID): The UUID of the document to be created. + data (CreateDocRequest): The content of the document. """ doc_id = str(doc_id or uuid4()) diff --git a/agents-api/agents_api/models/docs/embed_snippets.py b/agents-api/agents_api/models/docs/embed_snippets.py index 993e76396..8d8ae1e62 100644 --- a/agents-api/agents_api/models/docs/embed_snippets.py +++ b/agents-api/agents_api/models/docs/embed_snippets.py @@ -49,9 +49,9 @@ def embed_snippets( """Embeds document snippets in the cozodb database. Parameters: - doc_id (UUID): The unique identifier for the document. - snippet_indices (list[int]): Indices of the snippets in the document. - embeddings (list[list[float]]): Embedding vectors for the snippets. + doc_id (UUID): The unique identifier for the document. + snippet_indices (list[int]): Indices of the snippets in the document. + embeddings (list[list[float]]): Embedding vectors for the snippets. """ doc_id = str(doc_id) diff --git a/agents-api/agents_api/models/docs/search_docs_by_embedding.py b/agents-api/agents_api/models/docs/search_docs_by_embedding.py index d6bed97fc..83418aa21 100644 --- a/agents-api/agents_api/models/docs/search_docs_by_embedding.py +++ b/agents-api/agents_api/models/docs/search_docs_by_embedding.py @@ -56,12 +56,12 @@ def search_docs_by_embedding( Searches for document snippets in CozoDB by embedding query. Parameters: - - owner_type (Literal["user", "agent"]): The type of the owner of the documents. - - owner_id (UUID): The unique identifier of the owner. - - query_embedding (list[float]): The embedding vector of the query. - - k (int, optional): The number of nearest neighbors to retrieve. Defaults to 3. - - confidence (float, optional): The confidence threshold for filtering results. Defaults to 0.8. - - mmr_lambda (float, optional): The lambda parameter for MMR. Defaults to 0.25. + owner_type (Literal["user", "agent"]): The type of the owner of the documents. + owner_id (UUID): The unique identifier of the owner. + query_embedding (list[float]): The embedding vector of the query. + k (int, optional): The number of nearest neighbors to retrieve. Defaults to 3. + confidence (float, optional): The confidence threshold for filtering results. Defaults to 0.8. + mmr_lambda (float, optional): The lambda parameter for MMR. Defaults to 0.25. """ assert len(query_embedding) == embedding_size diff --git a/agents-api/agents_api/models/docs/search_docs_by_text.py b/agents-api/agents_api/models/docs/search_docs_by_text.py index eeae8362c..bb700a494 100644 --- a/agents-api/agents_api/models/docs/search_docs_by_text.py +++ b/agents-api/agents_api/models/docs/search_docs_by_text.py @@ -53,9 +53,9 @@ def search_docs_by_text( Searches for document snippets in CozoDB by embedding query. Parameters: - - owners (list[tuple[Literal["user", "agent"], UUID]]): The type of the owner of the documents. - - query (str): The query string. - - k (int, optional): The number of nearest neighbors to retrieve. Defaults to 3. + owners (list[tuple[Literal["user", "agent"], UUID]]): The type of the owner of the documents. + query (str): The query string. + k (int, optional): The number of nearest neighbors to retrieve. Defaults to 3. """ owners: list[list[str]] = [ diff --git a/agents-api/agents_api/models/entry/delete_entries.py b/agents-api/agents_api/models/entry/delete_entries.py index 48c37cd25..c98b6c7d2 100644 --- a/agents-api/agents_api/models/entry/delete_entries.py +++ b/agents-api/agents_api/models/entry/delete_entries.py @@ -49,7 +49,7 @@ def delete_entries_for_session( Constructs and returns a datalog query for deleting entries associated with a given session ID from the 'cozodb' database. Parameters: - - session_id (UUID): The unique identifier of the session whose entries are to be deleted. + session_id (UUID): The unique identifier of the session whose entries are to be deleted. """ delete_query = """ diff --git a/agents-api/agents_api/models/session/delete_session.py b/agents-api/agents_api/models/session/delete_session.py index af9e331c7..81f8e1f7c 100644 --- a/agents-api/agents_api/models/session/delete_session.py +++ b/agents-api/agents_api/models/session/delete_session.py @@ -51,11 +51,11 @@ def delete_session( Deletes a session and its related data from the 'cozodb' database. Parameters: - - developer_id (UUID): The unique identifier for the developer. - - session_id (UUID): The unique identifier for the session to be deleted. + developer_id (UUID): The unique identifier for the developer. + session_id (UUID): The unique identifier for the session to be deleted. Returns: - - ResourceDeletedResponse: The response indicating the deletion of the session. + ResourceDeletedResponse: The response indicating the deletion of the session. """ session_id = str(session_id) developer_id = str(developer_id) diff --git a/agents-api/agents_api/models/session/list_sessions.py b/agents-api/agents_api/models/session/list_sessions.py index 14f4cad0d..b7d5c0049 100644 --- a/agents-api/agents_api/models/session/list_sessions.py +++ b/agents-api/agents_api/models/session/list_sessions.py @@ -41,7 +41,8 @@ def list_sessions( direction: Literal["asc", "desc"] = "desc", metadata_filter: dict[str, Any] = {}, ) -> tuple[list[str], dict]: - """Lists sessions from the 'cozodb' database based on the provided filters. + """ + Lists sessions from the 'cozodb' database based on the provided filters. Parameters: developer_id (UUID): The developer's ID to filter sessions by. diff --git a/agents-api/agents_api/models/session/patch_session.py b/agents-api/agents_api/models/session/patch_session.py index a9f3121b9..4a119a684 100644 --- a/agents-api/agents_api/models/session/patch_session.py +++ b/agents-api/agents_api/models/session/patch_session.py @@ -60,12 +60,13 @@ def patch_session( developer_id: UUID, data: PatchSessionRequest, ) -> tuple[list[str], dict]: - """Patch session data in the 'cozodb' database. + """ + Patch session data in the 'cozodb' database. Parameters: - - session_id (UUID): The unique identifier for the session to be updated. - - developer_id (UUID): The unique identifier for the developer making the update. - - data (PatchSessionRequest): The request payload containing the updates to apply. + session_id (UUID): The unique identifier for the session to be updated. + developer_id (UUID): The unique identifier for the developer making the update. + data (PatchSessionRequest): The request payload containing the updates to apply. """ update_data = data.model_dump(exclude_unset=True) diff --git a/agents-api/agents_api/models/tools/create_tools.py b/agents-api/agents_api/models/tools/create_tools.py index 87ea3a9cf..fe7e28228 100644 --- a/agents-api/agents_api/models/tools/create_tools.py +++ b/agents-api/agents_api/models/tools/create_tools.py @@ -51,11 +51,11 @@ def create_tools( Constructs a datalog query for inserting tool records into the 'agent_functions' relation in the CozoDB. Parameters: - - agent_id (UUID): The unique identifier for the agent. - - data (list[CreateToolRequest]): A list of function definitions to be inserted. + agent_id (UUID): The unique identifier for the agent. + data (list[CreateToolRequest]): A list of function definitions to be inserted. Returns: - list[Tool] + list[Tool] """ tools_data = [ diff --git a/agents-api/agents_api/models/tools/patch_tool.py b/agents-api/agents_api/models/tools/patch_tool.py index 5bbfe1c91..0d8304d7d 100644 --- a/agents-api/agents_api/models/tools/patch_tool.py +++ b/agents-api/agents_api/models/tools/patch_tool.py @@ -40,16 +40,16 @@ def patch_tool( *, developer_id: UUID, agent_id: UUID, tool_id: UUID, data: PatchToolRequest ) -> tuple[list[str], dict]: """ - # Execute the datalog query and return the results as a DataFrame + Execute the datalog query and return the results as a DataFrame Updates the tool information for a given agent and tool ID in the 'cozodb' database. Parameters: - - agent_id (UUID): The unique identifier of the agent. - - tool_id (UUID): The unique identifier of the tool to be updated. - - data (PatchToolRequest): The request payload containing the updated tool information. + agent_id (UUID): The unique identifier of the agent. + tool_id (UUID): The unique identifier of the tool to be updated. + data (PatchToolRequest): The request payload containing the updated tool information. Returns: - - ResourceUpdatedResponse: The updated tool data. + ResourceUpdatedResponse: The updated tool data. """ agent_id = str(agent_id) diff --git a/agents-api/agents_api/models/user/create_or_update_user.py b/agents-api/agents_api/models/user/create_or_update_user.py index 9e9045e74..97db913c5 100644 --- a/agents-api/agents_api/models/user/create_or_update_user.py +++ b/agents-api/agents_api/models/user/create_or_update_user.py @@ -44,15 +44,15 @@ def create_or_update_user( Constructs and executes a datalog query to create a new user in the database. Parameters: - - user_id (UUID): The unique identifier for the user. - - developer_id (UUID): The unique identifier for the developer creating the user. - - name (str): The name of the user. - - about (str): A description of the user. - - metadata (dict, optional): A dictionary of metadata for the user. Defaults to an empty dict. - - client (CozoClient, optional): The CozoDB client instance to use for the query. Defaults to a preconfigured client instance. + user_id (UUID): The unique identifier for the user. + developer_id (UUID): The unique identifier for the developer creating the user. + name (str): The name of the user. + about (str): A description of the user. + metadata (dict, optional): A dictionary of metadata for the user. Defaults to an empty dict. + client (CozoClient, optional): The CozoDB client instance to use for the query. Defaults to a preconfigured client instance. Returns: - User: The newly created user record. + User: The newly created user record. """ # Extract the user data from the payload diff --git a/agents-api/agents_api/models/user/delete_user.py b/agents-api/agents_api/models/user/delete_user.py index b5fcb8424..0532f5cfa 100644 --- a/agents-api/agents_api/models/user/delete_user.py +++ b/agents-api/agents_api/models/user/delete_user.py @@ -49,12 +49,12 @@ def delete_user(*, developer_id: UUID, user_id: UUID) -> tuple[list[str], dict]: Constructs and returns a datalog query for deleting an user and its default settings from the database. Parameters: - - developer_id (UUID): The UUID of the developer owning the user. - - user_id (UUID): The UUID of the user to be deleted. - - client (CozoClient, optional): An instance of the CozoClient to execute the query. + developer_id (UUID): The UUID of the developer owning the user. + user_id (UUID): The UUID of the user to be deleted. + client (CozoClient, optional): An instance of the CozoClient to execute the query. Returns: - - ResourceDeletedResponse: The response indicating the deletion of the user. + ResourceDeletedResponse: The response indicating the deletion of the user. """ queries = [ diff --git a/agents-api/agents_api/models/user/list_users.py b/agents-api/agents_api/models/user/list_users.py index 57dc9b8c8..2a810b8e0 100644 --- a/agents-api/agents_api/models/user/list_users.py +++ b/agents-api/agents_api/models/user/list_users.py @@ -43,13 +43,13 @@ def list_users( Queries the 'cozodb' database to list users associated with a specific developer. Parameters: - - developer_id (UUID): The unique identifier of the developer. - - limit (int): The maximum number of users to return. Defaults to 100. - - offset (int): The number of users to skip before starting to collect the result set. Defaults to 0. - - metadata_filter (dict[str, Any]): A dictionary representing filters to apply on user metadata. + developer_id (UUID): The unique identifier of the developer. + limit (int): The maximum number of users to return. Defaults to 100. + offset (int): The number of users to skip before starting to collect the result set. Defaults to 0. + metadata_filter (dict[str, Any]): A dictionary representing filters to apply on user metadata. Returns: - - pd.DataFrame: A DataFrame containing the queried user data. + pd.DataFrame: A DataFrame containing the queried user data. """ # Construct a filter string for the metadata based on the provided dictionary. metadata_filter_str = ", ".join( diff --git a/agents-api/agents_api/models/user/patch_user.py b/agents-api/agents_api/models/user/patch_user.py index faf38298c..4498c6ded 100644 --- a/agents-api/agents_api/models/user/patch_user.py +++ b/agents-api/agents_api/models/user/patch_user.py @@ -49,12 +49,12 @@ def patch_user( Generates a datalog query for updating a user's information. Parameters: - - developer_id (UUID): The UUID of the developer. - - user_id (UUID): The UUID of the user to be updated. - - **update_data: Arbitrary keyword arguments representing the data to be updated. + developer_id (UUID): The UUID of the developer. + user_id (UUID): The UUID of the user to be updated. + **update_data: Arbitrary keyword arguments representing the data to be updated. Returns: - - tuple[str, dict]: A pandas DataFrame containing the results of the query execution. + tuple[str, dict]: A pandas DataFrame containing the results of the query execution. """ update_data = data.model_dump(exclude_unset=True) diff --git a/agents-api/agents_api/models/user/update_user.py b/agents-api/agents_api/models/user/update_user.py index 9a13d9369..fd8e7e2c8 100644 --- a/agents-api/agents_api/models/user/update_user.py +++ b/agents-api/agents_api/models/user/update_user.py @@ -39,7 +39,8 @@ def update_user( *, developer_id: UUID, user_id: UUID, data: UpdateUserRequest ) -> tuple[list[str], dict]: - """Updates user information in the 'cozodb' database. + """ + Updates user information in the 'cozodb' database. Parameters: developer_id (UUID): The developer's unique identifier. diff --git a/agents-api/agents_api/routers/jobs/routers.py b/agents-api/agents_api/routers/jobs/routers.py index 8bff6c7cc..dff4bed7b 100644 --- a/agents-api/agents_api/routers/jobs/routers.py +++ b/agents-api/agents_api/routers/jobs/routers.py @@ -4,8 +4,8 @@ from fastapi import APIRouter from temporalio.client import WorkflowExecutionStatus -from agents_api.autogen.openapi_model import JobStatus -from agents_api.clients.temporal import get_client +from ...autogen.openapi_model import JobStatus +from ...clients.temporal import get_client router: APIRouter = APIRouter() diff --git a/agents-api/agents_api/routers/tasks/create_or_update_task.py b/agents-api/agents_api/routers/tasks/create_or_update_task.py index e5245670a..50dbf19d9 100644 --- a/agents-api/agents_api/routers/tasks/create_or_update_task.py +++ b/agents-api/agents_api/routers/tasks/create_or_update_task.py @@ -6,15 +6,14 @@ from jsonschema.exceptions import SchemaError, ValidationError from starlette.status import HTTP_201_CREATED -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( CreateOrUpdateTaskRequest, ResourceUpdatedResponse, ) -from agents_api.dependencies.developer_id import get_developer_id -from agents_api.models.task.create_or_update_task import ( +from ...dependencies.developer_id import get_developer_id +from ...models.task.create_or_update_task import ( create_or_update_task as create_or_update_task_query, ) - from .router import router diff --git a/agents-api/agents_api/routers/tasks/get_execution_details.py b/agents-api/agents_api/routers/tasks/get_execution_details.py index 8da7b98c8..95bccbc07 100644 --- a/agents-api/agents_api/routers/tasks/get_execution_details.py +++ b/agents-api/agents_api/routers/tasks/get_execution_details.py @@ -1,12 +1,11 @@ from uuid import UUID -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( Execution, ) -from agents_api.models.execution.get_execution import ( +from ...models.execution.get_execution import ( get_execution as get_execution_query, ) - from .router import router diff --git a/agents-api/agents_api/routers/tasks/list_execution_transitions.py b/agents-api/agents_api/routers/tasks/list_execution_transitions.py index fd7be992a..9ce169509 100644 --- a/agents-api/agents_api/routers/tasks/list_execution_transitions.py +++ b/agents-api/agents_api/routers/tasks/list_execution_transitions.py @@ -1,14 +1,13 @@ from typing import Literal from uuid import UUID -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( ListResponse, Transition, ) -from agents_api.models.execution.list_execution_transitions import ( +from ...models.execution.list_execution_transitions import ( list_execution_transitions as list_execution_transitions_query, ) - from .router import router diff --git a/agents-api/agents_api/routers/tasks/list_task_executions.py b/agents-api/agents_api/routers/tasks/list_task_executions.py index f2961e54a..72cbd9b40 100644 --- a/agents-api/agents_api/routers/tasks/list_task_executions.py +++ b/agents-api/agents_api/routers/tasks/list_task_executions.py @@ -3,15 +3,14 @@ from fastapi import Depends -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( Execution, ListResponse, ) -from agents_api.dependencies.developer_id import get_developer_id -from agents_api.models.execution.list_executions import ( +from ...dependencies.developer_id import get_developer_id +from ...models.execution.list_executions import ( list_executions as list_task_executions_query, ) - from .router import router diff --git a/agents-api/agents_api/routers/tasks/list_tasks.py b/agents-api/agents_api/routers/tasks/list_tasks.py index 43a7e9158..a53983006 100644 --- a/agents-api/agents_api/routers/tasks/list_tasks.py +++ b/agents-api/agents_api/routers/tasks/list_tasks.py @@ -3,13 +3,12 @@ from fastapi import Depends -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( ListResponse, Task, ) -from agents_api.dependencies.developer_id import get_developer_id -from agents_api.models.task.list_tasks import list_tasks as list_tasks_query - +from ...dependencies.developer_id import get_developer_id +from ...models.task.list_tasks import list_tasks as list_tasks_query from .router import router diff --git a/agents-api/agents_api/routers/tasks/patch_execution.py b/agents-api/agents_api/routers/tasks/patch_execution.py index 0eb159c83..3cc45ee37 100644 --- a/agents-api/agents_api/routers/tasks/patch_execution.py +++ b/agents-api/agents_api/routers/tasks/patch_execution.py @@ -3,15 +3,14 @@ from fastapi import Depends -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( ResourceUpdatedResponse, UpdateExecutionRequest, ) -from agents_api.dependencies.developer_id import get_developer_id -from agents_api.models.execution.update_execution import ( +from ...dependencies.developer_id import get_developer_id +from ...models.execution.update_execution import ( update_execution as update_execution_query, ) - from .router import router diff --git a/agents-api/agents_api/routers/tasks/update_execution.py b/agents-api/agents_api/routers/tasks/update_execution.py index 968b6bdfb..d887c455d 100644 --- a/agents-api/agents_api/routers/tasks/update_execution.py +++ b/agents-api/agents_api/routers/tasks/update_execution.py @@ -4,19 +4,18 @@ from fastapi import Depends, HTTPException -from agents_api.autogen.openapi_model import ( +from ...autogen.openapi_model import ( ResumeExecutionRequest, StopExecutionRequest, ) -from agents_api.clients.temporal import get_client -from agents_api.dependencies.developer_id import get_developer_id -from agents_api.models.execution.get_paused_execution_token import ( +from ...clients.temporal import get_client +from ...dependencies.developer_id import get_developer_id +from ...models.execution.get_paused_execution_token import ( get_paused_execution_token, ) -from agents_api.models.execution.get_temporal_workflow_data import ( +from ...models.execution.get_temporal_workflow_data import ( get_temporal_workflow_data, ) - from .router import router diff --git a/agents-api/tests/fixtures.py b/agents-api/tests/fixtures.py index d5b032311..b732e750c 100644 --- a/agents-api/tests/fixtures.py +++ b/agents-api/tests/fixtures.py @@ -37,7 +37,7 @@ from agents_api.models.user.delete_user import delete_user from agents_api.web import app -from .utils import patch_embed_acompletion as patch_embed_acompletion_ctx +from tests.utils import patch_embed_acompletion as patch_embed_acompletion_ctx EMBEDDING_SIZE: int = 1024 diff --git a/agents-api/tests/test_activities.py b/agents-api/tests/test_activities.py index 98dfc97b5..a2f15d179 100644 --- a/agents-api/tests/test_activities.py +++ b/agents-api/tests/test_activities.py @@ -7,13 +7,8 @@ from agents_api.clients import temporal from agents_api.env import temporal_task_queue from agents_api.workflows.demo import DemoWorkflow - -from .fixtures import ( - cozo_client, - test_developer_id, - test_doc, -) -from .utils import patch_testing_temporal +from tests.fixtures import cozo_client, test_developer_id, test_doc +from tests.utils import patch_testing_temporal @test("activity: call direct embed_docs") diff --git a/agents-api/tests/test_docs_routes.py b/agents-api/tests/test_docs_routes.py index d4b677d05..d61bfbcb7 100644 --- a/agents-api/tests/test_docs_routes.py +++ b/agents-api/tests/test_docs_routes.py @@ -1,6 +1,6 @@ from ward import test -from .fixtures import ( +from tests.fixtures import ( make_request, patch_embed_acompletion, test_agent, @@ -8,7 +8,7 @@ test_user, test_user_doc, ) -from .utils import patch_testing_temporal +from tests.utils import patch_testing_temporal @test("route: create user doc") diff --git a/agents-api/tests/test_execution_queries.py b/agents-api/tests/test_execution_queries.py index 29ddcbd86..7af9f9512 100644 --- a/agents-api/tests/test_execution_queries.py +++ b/agents-api/tests/test_execution_queries.py @@ -16,7 +16,7 @@ from agents_api.models.execution.list_executions import list_executions from agents_api.models.execution.lookup_temporal_data import lookup_temporal_data -from .fixtures import ( +from tests.fixtures import ( cozo_client, test_developer_id, test_execution, diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index b6394f1bc..ecebf34c3 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -15,8 +15,8 @@ from agents_api.models.task.create_task import create_task from agents_api.routers.tasks.create_task_execution import start_execution -from .fixtures import cozo_client, test_agent, test_developer_id -from .utils import patch_integration_service, patch_testing_temporal +from tests.fixtures import cozo_client, test_agent, test_developer_id +from tests.utils import patch_integration_service, patch_testing_temporal EMBEDDING_SIZE: int = 1024 diff --git a/agents-api/tests/test_task_queries.py b/agents-api/tests/test_task_queries.py index 2399416db..f14c431f8 100644 --- a/agents-api/tests/test_task_queries.py +++ b/agents-api/tests/test_task_queries.py @@ -16,7 +16,7 @@ from agents_api.models.task.list_tasks import list_tasks from agents_api.models.task.update_task import update_task -from .fixtures import cozo_client, test_agent, test_developer_id, test_task +from tests.fixtures import cozo_client, test_agent, test_developer_id, test_task @test("model: create task") diff --git a/agents-api/tests/test_task_routes.py b/agents-api/tests/test_task_routes.py index 4ab708560..5d3c2f998 100644 --- a/agents-api/tests/test_task_routes.py +++ b/agents-api/tests/test_task_routes.py @@ -4,14 +4,14 @@ from ward import test -from .fixtures import ( +from tests.fixtures import ( client, make_request, test_agent, test_execution, test_task, ) -from .utils import patch_testing_temporal +from tests.utils import patch_testing_temporal @test("route: unauthorized should fail") diff --git a/agents-api/tests/test_workflow_routes.py b/agents-api/tests/test_workflow_routes.py index 34aa0101c..d1538535d 100644 --- a/agents-api/tests/test_workflow_routes.py +++ b/agents-api/tests/test_workflow_routes.py @@ -4,8 +4,8 @@ from ward import test -from .fixtures import cozo_client, test_agent, test_developer_id -from .utils import patch_http_client_with_temporal +from tests.fixtures import cozo_client, test_agent, test_developer_id +from tests.utils import patch_http_client_with_temporal @test("workflow route: evaluate step single") diff --git a/agents-api/tests/utils.py b/agents-api/tests/utils.py index 3f0f1f94a..dc1007d13 100644 --- a/agents-api/tests/utils.py +++ b/agents-api/tests/utils.py @@ -10,6 +10,7 @@ from agents_api.worker.codec import pydantic_data_converter from agents_api.worker.worker import create_worker +# Replicated here to prevent circular import EMBEDDING_SIZE: int = 1024 From a6bcbbe91202d37f063f5a74f10178f283bfdb26 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Fri, 4 Oct 2024 00:40:27 +0000 Subject: [PATCH 039/113] refactor: Lint agents-api (CI) --- agents-api/agents_api/clients/worker/worker.py | 1 - agents-api/agents_api/common/exceptions/sessions.py | 1 + agents-api/agents_api/common/protocol/agents.py | 2 +- agents-api/agents_api/common/utils/json.py | 2 +- agents-api/tests/fixtures.py | 1 - agents-api/tests/test_execution_queries.py | 1 - agents-api/tests/test_execution_workflow.py | 1 - agents-api/tests/test_task_queries.py | 1 - 8 files changed, 3 insertions(+), 7 deletions(-) diff --git a/agents-api/agents_api/clients/worker/worker.py b/agents-api/agents_api/clients/worker/worker.py index 55b810c3e..8befa3080 100644 --- a/agents-api/agents_api/clients/worker/worker.py +++ b/agents-api/agents_api/clients/worker/worker.py @@ -1,7 +1,6 @@ import httpx from ...env import temporal_worker_url - from .types import ( MemoryManagementTask, MemoryManagementTaskArgs, diff --git a/agents-api/agents_api/common/exceptions/sessions.py b/agents-api/agents_api/common/exceptions/sessions.py index 14d6ff4e7..6e9941d43 100644 --- a/agents-api/agents_api/common/exceptions/sessions.py +++ b/agents-api/agents_api/common/exceptions/sessions.py @@ -8,6 +8,7 @@ from . import BaseCommonException + class BaseSessionException(BaseCommonException): """ Base exception class for session-related errors. diff --git a/agents-api/agents_api/common/protocol/agents.py b/agents-api/agents_api/common/protocol/agents.py index fb8b4f063..89f7f4a2d 100644 --- a/agents-api/agents_api/common/protocol/agents.py +++ b/agents-api/agents_api/common/protocol/agents.py @@ -9,7 +9,7 @@ class AgentDefaultSettings(BaseModel): top_p: float = 1.0 """Top-p sampling setting controlling the nucleus of the probability distribution to sample from.""" - + repetition_penalty: float = 1.0 """Penalty applied to discourage repetition in the agent's responses.""" diff --git a/agents-api/agents_api/common/utils/json.py b/agents-api/agents_api/common/utils/json.py index ec53ecb27..f1b82742a 100644 --- a/agents-api/agents_api/common/utils/json.py +++ b/agents-api/agents_api/common/utils/json.py @@ -39,7 +39,7 @@ def default(self, obj) -> Any: obj: The object to serialize. Returns: A serializable object or raises a TypeError if the object is not serializable. """ - + if obj is None: return self._default_empty_value diff --git a/agents-api/tests/fixtures.py b/agents-api/tests/fixtures.py index b732e750c..9ae198c78 100644 --- a/agents-api/tests/fixtures.py +++ b/agents-api/tests/fixtures.py @@ -36,7 +36,6 @@ from agents_api.models.user.create_user import create_user from agents_api.models.user.delete_user import delete_user from agents_api.web import app - from tests.utils import patch_embed_acompletion as patch_embed_acompletion_ctx EMBEDDING_SIZE: int = 1024 diff --git a/agents-api/tests/test_execution_queries.py b/agents-api/tests/test_execution_queries.py index 7af9f9512..42904776d 100644 --- a/agents-api/tests/test_execution_queries.py +++ b/agents-api/tests/test_execution_queries.py @@ -15,7 +15,6 @@ from agents_api.models.execution.get_execution import get_execution from agents_api.models.execution.list_executions import list_executions from agents_api.models.execution.lookup_temporal_data import lookup_temporal_data - from tests.fixtures import ( cozo_client, test_developer_id, diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index ecebf34c3..3df23e5cd 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -14,7 +14,6 @@ ) from agents_api.models.task.create_task import create_task from agents_api.routers.tasks.create_task_execution import start_execution - from tests.fixtures import cozo_client, test_agent, test_developer_id from tests.utils import patch_integration_service, patch_testing_temporal diff --git a/agents-api/tests/test_task_queries.py b/agents-api/tests/test_task_queries.py index f14c431f8..e61489df8 100644 --- a/agents-api/tests/test_task_queries.py +++ b/agents-api/tests/test_task_queries.py @@ -15,7 +15,6 @@ from agents_api.models.task.get_task import get_task from agents_api.models.task.list_tasks import list_tasks from agents_api.models.task.update_task import update_task - from tests.fixtures import cozo_client, test_agent, test_developer_id, test_task From 1c2fb63266eb621785e8a81884c1e0850f999353 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Thu, 3 Oct 2024 20:53:13 -0400 Subject: [PATCH 040/113] feat: Add API call tool type (#571) - **Add optional description field to agent tools** - **feat(typespec): Add API call tool definition type** ---- > [!IMPORTANT] > Add API call tool type and description field to agent tools, updating models and types accordingly. > > - **Behavior**: > - Adds `ApiCallDef` and `ApiCallDefUpdate` classes in `Tools.py` to define API call tools. > - Adds `api_call` field to `CreateToolRequest`, `PatchToolRequest`, `UpdateToolRequest`, and `Tool` classes in `Tools.py`. > - Adds `description` field to `CreateToolRequest`, `PatchToolRequest`, `UpdateToolRequest`, and `Tool` classes in `Tools.py`. > - Updates `prepare_chat_context.py` and `prepare_execution_input.py` to include `description` in tool data. > - Implements `execute_api_call()` in `excecute_api_call.py` to handle API call execution. > - **Types**: > - Adds `httpMethod` alias in `scalars.tsp` for valid HTTP methods. > - Defines `ApiCallDef` model in `models.tsp` for API call tools. > - **Misc**: > - Updates `create_tools.py` and `list_tools.py` to handle `description` field in tool records. > - Adds migration `migrate_1727922523_add_description_to_tools.py` to add `description` field to tools table. > - Adds test `workflow: tool call api_call` in `test_execution_workflow.py` to verify API call tool functionality. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 326067adba2a9903e818a19e401ac2e74ca8e81d. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: HamadaSalhab Co-authored-by: vedantsahai18 Co-authored-by: creatorrr --- .../activities/excecute_api_call.py | 60 ++++++ .../activities/task_steps/base_evaluate.py | 11 +- agents-api/agents_api/autogen/Tasks.py | 2 +- agents-api/agents_api/autogen/Tools.py | 181 ++++++++++++++++-- .../models/chat/prepare_chat_context.py | 3 +- .../execution/prepare_execution_input.py | 1 + .../models/task/create_or_update_task.py | 4 +- .../agents_api/models/task/create_task.py | 2 +- .../agents_api/models/tools/create_tools.py | 16 +- .../agents_api/models/tools/list_tools.py | 8 +- .../agents_api/routers/agents/create_agent.py | 5 +- agents-api/agents_api/worker/worker.py | 2 + .../workflows/task_execution/__init__.py | 40 ++++ ...ate_1727922523_add_description_to_tools.py | 64 +++++++ agents-api/tests/test_docs_queries.py | 1 + agents-api/tests/test_execution_workflow.py | 59 ++++++ typespec/common/scalars.tsp | 3 + typespec/tasks/steps.tsp | 2 +- typespec/tools/models.tsp | 61 ++++-- 19 files changed, 478 insertions(+), 47 deletions(-) create mode 100644 agents-api/agents_api/activities/excecute_api_call.py create mode 100644 agents-api/migrations/migrate_1727922523_add_description_to_tools.py diff --git a/agents-api/agents_api/activities/excecute_api_call.py b/agents-api/agents_api/activities/excecute_api_call.py new file mode 100644 index 000000000..88fabce89 --- /dev/null +++ b/agents-api/agents_api/activities/excecute_api_call.py @@ -0,0 +1,60 @@ +from typing import Annotated, Any, Optional, TypedDict, Union + +import httpx +from beartype import beartype +from pydantic import Field +from temporalio import activity + +from ..autogen.openapi_model import ApiCallDef + +# from ..clients import integrations +from ..common.protocol.tasks import StepContext +from ..env import testing + +# from ..models.tools import get_tool_args_from_metadata + + +class RequestArgs(TypedDict): + content: Optional[str] + data: Optional[dict[str, Any]] + json_: Optional[dict[str, Any]] + cookies: Optional[dict[str, str]] + params: Optional[Union[str, dict[str, Any]]] + + +@beartype +async def execute_api_call( + api_call: ApiCallDef, + request_args: RequestArgs, +) -> Any: + try: + async with httpx.AsyncClient() as client: + response = await client.request( + method=api_call.method, + url=str(api_call.url), + headers=api_call.headers, + follow_redirects=api_call.follow_redirects, + **request_args, + ) + + response_dict = { + "status_code": response.status_code, + "headers": dict(response.headers), + "content": response.content, + "json": response.json(), + } + + return response_dict + + except BaseException as e: + if activity.in_activity(): + activity.logger.error(f"Error in execute_api_call: {e}") + + raise + + +mock_execute_api_call = execute_api_call + +execute_api_call = activity.defn(name="execute_api_call")( + execute_api_call if not testing else mock_execute_api_call +) diff --git a/agents-api/agents_api/activities/task_steps/base_evaluate.py b/agents-api/agents_api/activities/task_steps/base_evaluate.py index 0263345ec..3fcbf2f73 100644 --- a/agents-api/agents_api/activities/task_steps/base_evaluate.py +++ b/agents-api/agents_api/activities/task_steps/base_evaluate.py @@ -12,7 +12,7 @@ @beartype async def base_evaluate( - exprs: str | list[str] | dict[str, str], + exprs: str | list[str] | dict[str, str] | dict[str, dict[str, str]], values: dict[str, Any] = {}, extra_lambda_strs: dict[str, str] | None = None, ) -> Any | list[Any] | dict[str, Any]: @@ -53,9 +53,18 @@ async def base_evaluate( case list(): return [evaluator.eval(expr) for expr in exprs] + case dict() as d if all(isinstance(v, dict) for v in d.values()): + return { + k: {ik: evaluator.eval(iv) for ik, iv in v.items()} + for k, v in d.items() + } + case dict(): return {k: evaluator.eval(v) for k, v in exprs.items()} + case _: + raise ValueError(f"Invalid expression: {exprs}") + except BaseException as e: if activity.in_activity(): activity.logger.error(f"Error in base_evaluate: {e}") diff --git a/agents-api/agents_api/autogen/Tasks.py b/agents-api/agents_api/autogen/Tasks.py index 9dd531c47..83fde00da 100644 --- a/agents-api/agents_api/autogen/Tasks.py +++ b/agents-api/agents_api/autogen/Tasks.py @@ -944,7 +944,7 @@ class ToolCallStep(BaseModel): """ The tool to run """ - arguments: dict[str, str] | Literal["_"] = "_" + arguments: dict[str, dict[str, str] | str] | Literal["_"] = "_" """ The input parameters for the tool (defaults to last step output) """ diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index 8227e5759..07bcbea43 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -6,7 +6,114 @@ from typing import Annotated, Any, Literal from uuid import UUID -from pydantic import AwareDatetime, BaseModel, ConfigDict, Field +from pydantic import AnyUrl, AwareDatetime, BaseModel, ConfigDict, Field, StrictBool + + +class ApiCallDef(BaseModel): + """ + API call definition + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + method: Literal[ + "GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT", "TRACE" + ] + """ + The HTTP method to use + """ + url: AnyUrl + """ + The URL to call + """ + headers: dict[str, str] | None = None + """ + The headers to send with the request + """ + content: str | None = None + """ + The content as base64 to send with the request + """ + data: dict[str, str] | None = None + """ + The data to send as form data + """ + json_: Annotated[dict[str, Any] | None, Field(None, alias="json")] + """ + JSON body to send with the request + """ + cookies: dict[str, str] | None = None + """ + Cookies + """ + params: str | dict[str, Any] | None = None + """ + The parameters to send with the request + """ + follow_redirects: StrictBool | None = None + """ + Follow redirects + """ + + +class ApiCallDefUpdate(BaseModel): + """ + API call definition + """ + + model_config = ConfigDict( + populate_by_name=True, + ) + method: ( + Literal[ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH", + "HEAD", + "OPTIONS", + "CONNECT", + "TRACE", + ] + | None + ) = None + """ + The HTTP method to use + """ + url: AnyUrl | None = None + """ + The URL to call + """ + headers: dict[str, str] | None = None + """ + The headers to send with the request + """ + content: str | None = None + """ + The content as base64 to send with the request + """ + data: dict[str, str] | None = None + """ + The data to send as form data + """ + json_: Annotated[dict[str, Any] | None, Field(None, alias="json")] + """ + JSON body to send with the request + """ + cookies: dict[str, str] | None = None + """ + Cookies + """ + params: str | dict[str, Any] | None = None + """ + The parameters to send with the request + """ + follow_redirects: StrictBool | None = None + """ + Follow redirects + """ class ChosenToolCall(BaseModel): @@ -37,12 +144,26 @@ class CreateToolRequest(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ + description: str | None = None + """ + Description of the tool + """ function: FunctionDef | None = None """ The function to call """ integration: IntegrationDef | None = None + """ + The integration to call + """ system: SystemDef | None = None + """ + The system to call + """ + api_call: ApiCallDef | None = None + """ + The API call to make + """ class FunctionCallOption(BaseModel): @@ -104,10 +225,6 @@ class IntegrationDef(BaseModel): """ The specific method of the integration to call """ - description: str | None = None - """ - Optional description of the integration - """ setup: dict[str, Any] | None = None """ The setup parameters the integration accepts @@ -146,10 +263,6 @@ class IntegrationDefUpdate(BaseModel): """ The specific method of the integration to call """ - description: str | None = None - """ - Optional description of the integration - """ setup: dict[str, Any] | None = None """ The setup parameters the integration accepts @@ -179,12 +292,26 @@ class PatchToolRequest(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ + description: str | None = None + """ + Description of the tool + """ function: FunctionDef | None = None """ The function to call """ integration: IntegrationDefUpdate | None = None + """ + The integration to call + """ system: SystemDefUpdate | None = None + """ + The system to call + """ + api_call: ApiCallDefUpdate | None = None + """ + The API call to make + """ class SystemDef(BaseModel): @@ -199,10 +326,6 @@ class SystemDef(BaseModel): """ The name of the system call """ - description: str | None = None - """ - Optional description of the system call - """ arguments: dict[str, Any] | None = None """ The arguments to pre-apply to the system call @@ -221,10 +344,6 @@ class SystemDefUpdate(BaseModel): """ The name of the system call """ - description: str | None = None - """ - Optional description of the system call - """ arguments: dict[str, Any] | None = None """ The arguments to pre-apply to the system call @@ -239,12 +358,26 @@ class Tool(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ + description: str | None = None + """ + Description of the tool + """ function: FunctionDef | None = None """ The function to call """ integration: IntegrationDef | None = None + """ + The integration to call + """ system: SystemDef | None = None + """ + The system to call + """ + api_call: ApiCallDef | None = None + """ + The API call to make + """ created_at: Annotated[AwareDatetime, Field(json_schema_extra={"readOnly": True})] """ When this resource was created as UTC date-time @@ -279,12 +412,26 @@ class UpdateToolRequest(BaseModel): """ Name of the tool (must be unique for this agent and a valid python identifier string ) """ + description: str | None = None + """ + Description of the tool + """ function: FunctionDef | None = None """ The function to call """ integration: IntegrationDef | None = None + """ + The integration to call + """ system: SystemDef | None = None + """ + The system to call + """ + api_call: ApiCallDef | None = None + """ + The API call to make + """ class ChosenFunctionCall(ChosenToolCall): diff --git a/agents-api/agents_api/models/chat/prepare_chat_context.py b/agents-api/agents_api/models/chat/prepare_chat_context.py index 9be2d64aa..f77686d7a 100644 --- a/agents-api/agents_api/models/chat/prepare_chat_context.py +++ b/agents-api/agents_api/models/chat/prepare_chat_context.py @@ -90,12 +90,13 @@ def prepare_chat_context( participant_type: "agent", }, - *tools { agent_id, tool_id, name, type, spec, updated_at, created_at }, + *tools { agent_id, tool_id, name, type, spec, description, updated_at, created_at }, tool = { "id": tool_id, "name": name, "type": type, "spec": spec, + "description": description, "updated_at": updated_at, "created_at": created_at, } diff --git a/agents-api/agents_api/models/execution/prepare_execution_input.py b/agents-api/agents_api/models/execution/prepare_execution_input.py index 5f30e7f83..513c44a16 100644 --- a/agents-api/agents_api/models/execution/prepare_execution_input.py +++ b/agents-api/agents_api/models/execution/prepare_execution_input.py @@ -149,6 +149,7 @@ def prepare_execution_input( "name", "type", "spec", + "description", "created_at", "updated_at", ) diff --git a/agents-api/agents_api/models/task/create_or_update_task.py b/agents-api/agents_api/models/task/create_or_update_task.py index af7e258d9..d787d78b5 100644 --- a/agents-api/agents_api/models/task/create_or_update_task.py +++ b/agents-api/agents_api/models/task/create_or_update_task.py @@ -64,7 +64,9 @@ def create_or_update_task( data.metadata = data.metadata or {} data.input_schema = data.input_schema or {} - task_data = task_to_spec(data).model_dump(exclude_none=True, exclude_unset=True) + task_data = task_to_spec(data).model_dump( + exclude_none=True, exclude_unset=True, mode="json" + ) task_data.pop("task_id", None) task_data["created_at"] = utcnow().timestamp() diff --git a/agents-api/agents_api/models/task/create_task.py b/agents-api/agents_api/models/task/create_task.py index a44146c34..9affe0ead 100644 --- a/agents-api/agents_api/models/task/create_task.py +++ b/agents-api/agents_api/models/task/create_task.py @@ -55,7 +55,7 @@ def create_task( # Prepares the update data by filtering out None values and adding user_id and developer_id. columns, values = cozo_process_mutate_data( { - **task_spec.model_dump(exclude_none=True, exclude_unset=True), + **task_spec.model_dump(exclude_none=True, exclude_unset=True, mode="json"), "task_id": str(task_id), "agent_id": str(agent_id), } diff --git a/agents-api/agents_api/models/tools/create_tools.py b/agents-api/agents_api/models/tools/create_tools.py index fe7e28228..b98a751d0 100644 --- a/agents-api/agents_api/models/tools/create_tools.py +++ b/agents-api/agents_api/models/tools/create_tools.py @@ -65,32 +65,35 @@ def create_tools( tool.type, tool.name, getattr(tool, tool.type).dict(), + tool.description if hasattr(tool, "description") else None, ] for tool in data ] ensure_tool_name_unique_query = """ - input[agent_id, tool_id, type, name, spec] <- $records + input[agent_id, tool_id, type, name, spec, description] <- $records ?[tool_id] := - input[agent_id, _, type, name, _], + input[agent_id, _, type, name, _, _], *tools{ agent_id: to_uuid(agent_id), tool_id, type, name, + spec, + description, } :limit 1 :assert none """ - # Datalog query for inserting new tool records into the 'agent_functions' relation + # Datalog query for inserting new tool records into the 'tools' relation create_query = """ - input[agent_id, tool_id, type, name, spec] <- $records + input[agent_id, tool_id, type, name, spec, description] <- $records # Do not add duplicate - ?[agent_id, tool_id, type, name, spec] := - input[agent_id, tool_id, type, name, spec], + ?[agent_id, tool_id, type, name, spec, description] := + input[agent_id, tool_id, type, name, spec, description], not *tools{ agent_id: to_uuid(agent_id), type, @@ -103,6 +106,7 @@ def create_tools( type, name, spec, + description, } :returning """ diff --git a/agents-api/agents_api/models/tools/list_tools.py b/agents-api/agents_api/models/tools/list_tools.py index 931ca3ca9..727bf8028 100644 --- a/agents-api/agents_api/models/tools/list_tools.py +++ b/agents-api/agents_api/models/tools/list_tools.py @@ -30,7 +30,11 @@ @wrap_in_class( Tool, transform=lambda d: { - d["type"]: {**d.pop("spec"), "name": d["name"]}, + d["type"]: { + **d.pop("spec"), + "name": d["name"], + "description": d["description"], + }, **d, }, ) @@ -58,6 +62,7 @@ def list_tools( name, type, spec, + description, updated_at, created_at, ] := input[agent_id], @@ -67,6 +72,7 @@ def list_tools( name, type, spec, + description, updated_at, created_at, }} diff --git a/agents-api/agents_api/routers/agents/create_agent.py b/agents-api/agents_api/routers/agents/create_agent.py index a662bef15..2e1c4df0a 100644 --- a/agents-api/agents_api/routers/agents/create_agent.py +++ b/agents-api/agents_api/routers/agents/create_agent.py @@ -4,13 +4,12 @@ from fastapi import Depends from starlette.status import HTTP_201_CREATED -import agents_api.models as models - from ...autogen.openapi_model import ( CreateAgentRequest, ResourceCreatedResponse, ) from ...dependencies.developer_id import get_developer_id +from ...models.agent.create_agent import create_agent as create_agent_query from .router import router @@ -20,7 +19,7 @@ async def create_agent( data: CreateAgentRequest, ) -> ResourceCreatedResponse: # TODO: Validate model name - agent = models.agent.create_agent( + agent = create_agent_query( developer_id=x_developer_id, data=data, ) diff --git a/agents-api/agents_api/worker/worker.py b/agents-api/agents_api/worker/worker.py index 77698364d..08322772f 100644 --- a/agents-api/agents_api/worker/worker.py +++ b/agents-api/agents_api/worker/worker.py @@ -15,6 +15,7 @@ def create_worker(client: Client) -> Any: from ..activities import task_steps from ..activities.demo import demo_activity from ..activities.embed_docs import embed_docs + from ..activities.excecute_api_call import execute_api_call from ..activities.execute_integration import execute_integration from ..activities.mem_mgmt import mem_mgmt from ..activities.mem_rating import mem_rating @@ -52,6 +53,7 @@ def create_worker(client: Client) -> Any: demo_activity, embed_docs, execute_integration, + execute_api_call, mem_mgmt, mem_rating, summarization, diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index 2ca7e6ade..6023f6f25 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -11,8 +11,10 @@ # Import necessary modules and types with workflow.unsafe.imports_passed_through(): from ...activities import task_steps + from ...activities.excecute_api_call import execute_api_call from ...activities.execute_integration import execute_integration from ...autogen.openapi_model import ( + ApiCallDef, EmbedStep, ErrorWorkflowStep, EvaluateStep, @@ -505,6 +507,44 @@ async def run( state = PartialTransition(output=tool_call_response) + case ToolCallStep(), StepOutcome(output=tool_call) if tool_call[ + "type" + ] == "api_call": + call = tool_call["api_call"] + tool_name = call["name"] + arguments = call["arguments"] + apicall_spec = next( + (t for t in context.tools if t.name == tool_name), None + ) + + if apicall_spec is None: + raise ApplicationError(f"Integration {tool_name} not found") + + api_call = ApiCallDef( + method=apicall_spec.spec["method"], + url=apicall_spec.spec["url"], + headers=apicall_spec.spec["headers"], + follow_redirects=apicall_spec.spec["follow_redirects"], + ) + + if "json_" in arguments: + arguments["json"] = arguments["json_"] + del arguments["json_"] + + # Execute the API call using the `execute_api_call` function + tool_call_response = await workflow.execute_activity( + execute_api_call, + args=[ + api_call, + arguments, + ], + schedule_to_close_timeout=timedelta( + seconds=30 if debug or testing else 600 + ), + ) + + state = PartialTransition(output=tool_call_response) + case ToolCallStep(), StepOutcome(output=_): # FIXME: Handle system/api_call tool_calls raise ApplicationError("Not implemented") diff --git a/agents-api/migrations/migrate_1727922523_add_description_to_tools.py b/agents-api/migrations/migrate_1727922523_add_description_to_tools.py new file mode 100644 index 000000000..1d6724090 --- /dev/null +++ b/agents-api/migrations/migrate_1727922523_add_description_to_tools.py @@ -0,0 +1,64 @@ +# /usr/bin/env python3 + +MIGRATION_ID = "add_description_to_tools" +CREATED_AT = 1727922523.283493 + + +add_description_to_tools = dict( + up=""" + ?[agent_id, tool_id, type, name, description, spec, updated_at, created_at] := *tools { + agent_id, tool_id, type, name, spec, updated_at, created_at + }, description = null + + :replace tools { + agent_id: Uuid, + tool_id: Uuid, + => + type: String, + name: String, + description: String?, + spec: Json, + + updated_at: Float default now(), + created_at: Float default now(), + } + """, + down=""" + ?[agent_id, tool_id, type, name, spec, updated_at, created_at] := *tools { + agent_id, tool_id, type, name, spec, updated_at, created_at + } + + :replace tools { + agent_id: Uuid, + tool_id: Uuid, + => + type: String, + name: String, + spec: Json, + + updated_at: Float default now(), + created_at: Float default now(), + } + """, +) + + +queries_to_run = [ + add_description_to_tools, +] + + +def run(client, *queries): + joiner = "}\n\n{" + + query = joiner.join(queries) + query = f"{{\n{query}\n}}" + client.run(query) + + +def up(client): + run(client, *[q["up"] for q in queries_to_run]) + + +def down(client): + run(client, *[q["down"] for q in reversed(queries_to_run)]) diff --git a/agents-api/tests/test_docs_queries.py b/agents-api/tests/test_docs_queries.py index fcf7f9bd6..b0f886c4f 100644 --- a/agents-api/tests/test_docs_queries.py +++ b/agents-api/tests/test_docs_queries.py @@ -41,6 +41,7 @@ def _( ) +# TODO: Execute embedding workflow to fix this test and other docs tests @test("model: get docs") def _(client=cozo_client, doc=test_doc, developer_id=test_developer_id): get_doc( diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index 3df23e5cd..2a4fd7f75 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -440,6 +440,65 @@ async def _( assert result["hello"] == data.input["test"] +@test("workflow: tool call api_call") +async def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, +): + data = CreateExecutionRequest(input={"test": "input"}) + + task = create_task( + developer_id=developer_id, + agent_id=agent.id, + data=CreateTaskRequest( + **{ + "name": "test task", + "description": "test task about", + "input_schema": {"type": "object", "additionalProperties": True}, + "tools": [ + { + "type": "api_call", + "name": "hello", + "api_call": { + "method": "GET", + "url": "https://httpbin.org/get", + }, + } + ], + "main": [ + { + "tool": "hello", + "arguments": { + "params": {"test": "_.test"}, + }, + }, + { + "evaluate": {"hello": "_.json.args.test"}, + }, + ], + } + ), + client=client, + ) + + async with patch_testing_temporal() as (_, mock_run_task_execution_workflow): + execution, handle = await start_execution( + developer_id=developer_id, + task_id=task.id, + data=data, + client=client, + ) + + assert handle is not None + assert execution.task_id == task.id + assert execution.input == data.input + mock_run_task_execution_workflow.assert_called_once() + + result = await handle.result() + assert result["hello"] == data.input["test"] + + @test("workflow: tool call integration dummy") async def _( client=cozo_client, diff --git a/typespec/common/scalars.tsp b/typespec/common/scalars.tsp index 76ccef2d3..8dc07cbbc 100644 --- a/typespec/common/scalars.tsp +++ b/typespec/common/scalars.tsp @@ -69,3 +69,6 @@ alias integrationProvider = ( // | "webpage" // | "requests" ); + +/** A valid HTTP method */ +alias httpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "CONNECT" | "TRACE"; diff --git a/typespec/tasks/steps.tsp b/typespec/tasks/steps.tsp index 2267ae320..7a5f6d5b9 100644 --- a/typespec/tasks/steps.tsp +++ b/typespec/tasks/steps.tsp @@ -82,7 +82,7 @@ model ToolCallStepDef { tool: validPythonIdentifier; /** The input parameters for the tool (defaults to last step output) */ - arguments: ExpressionObject | "_" = "_"; + arguments: NestedExpressionObject | "_" = "_"; } model PromptStep extends BaseWorkflowStep<"prompt"> { diff --git a/typespec/tools/models.tsp b/typespec/tools/models.tsp index 8a8cead44..94243d20f 100644 --- a/typespec/tools/models.tsp +++ b/typespec/tools/models.tsp @@ -50,9 +50,6 @@ model IntegrationDef { /** The specific method of the integration to call */ method?: string; - /** Optional description of the integration */ - description?: string; - /** The setup parameters the integration accepts */ setup?: FunctionParameters; @@ -65,23 +62,59 @@ model SystemDef { /** The name of the system call */ call: string; - /** Optional description of the system call */ - description?: string; - /** The arguments to pre-apply to the system call */ arguments?: FunctionParameters; } -// TODO: We should use this model for all tools, not just functions and discriminate on the type +/** API call definition */ +model ApiCallDef { + /** The HTTP method to use */ + method: httpMethod; + + /** The URL to call */ + url: url; + + /** The headers to send with the request */ + headers?: Record; + + /** The content as base64 to send with the request */ + content?: string; + + /** The data to send as form data */ + data?: Record; + + /** JSON body to send with the request */ + json?: Record; + + /** Cookies */ + cookies?: Record; + + /** The parameters to send with the request */ + params?: string | Record; + + /** Follow redirects */ + follow_redirects?: boolean; +} + + model Tool { /** Name of the tool (must be unique for this agent and a valid python identifier string )*/ name: validPythonIdentifier; + /** Description of the tool */ + description?: string; + /** The function to call */ function?: FunctionDef; + + /** The integration to call */ integration?: IntegrationDef; + + /** The system to call */ system?: SystemDef; - api_call?: never; // TODO: Implement + + /** The API call to make */ + api_call?: ApiCallDef; ...HasTimestamps; ...HasId; @@ -94,9 +127,9 @@ model FunctionCallOption { model NamedToolChoice { function?: FunctionCallOption; - integration?: never; // TODO: Implement - system?: never; // TODO: Implement - api_call?: never; // TODO: Implement + integration?: never; + system?: never; + api_call?: never; } model ToolResponse { @@ -128,9 +161,9 @@ model ChosenToolCall { type: ToolType; function?: FunctionCallOption; - integration?: never; // TODO: Implement - system?: never; // TODO: Implement - api_call?: never; // TODO: Implement + integration?: never; + system?: never; + api_call?: never; ...HasId; } From cb9a1d527eb73a318c4a8c6ba89332427a8af9c3 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Thu, 3 Oct 2024 20:59:53 -0400 Subject: [PATCH 041/113] feat: Update submodule pointers to latest sdk versions --- sdks/node-sdk | 2 +- sdks/python-sdk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdks/node-sdk b/sdks/node-sdk index 8f190fd7c..1317978f9 160000 --- a/sdks/node-sdk +++ b/sdks/node-sdk @@ -1 +1 @@ -Subproject commit 8f190fd7c36f32aeb112ead95ba40254c8cbbc46 +Subproject commit 1317978f98661b5ae5b23d9c47a0a8d18f6f5718 diff --git a/sdks/python-sdk b/sdks/python-sdk index 872b15062..1b8c9fc9c 160000 --- a/sdks/python-sdk +++ b/sdks/python-sdk @@ -1 +1 @@ -Subproject commit 872b150629d33e563740095125a2276c1be023e8 +Subproject commit 1b8c9fc9c7b1fd2dc5eb60bbc908283bce99a1b2 From 19c6240150095679b8e591d5c6bc63f4a81c1f7f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 4 Oct 2024 19:28:36 -0400 Subject: [PATCH 042/113] feat(typespec,agents-api): Add system tool call types (#585) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Add system tool call types and update API models and specifications for version 1.0.0. > > - **Behavior**: > - Add `timeout` field to `ApiCallDef` and `ApiCallDefUpdate` in `Tools.py`. > - Change `data` type from `dict[str, str]` to `dict[str, Any]` in `ApiCallDef` and `ApiCallDefUpdate`. > - Change `description` type from `str` to `Any` in `FunctionDef`. > - Add `resource`, `operation`, `resource_id`, and `subresource` fields to `SystemDef` and `SystemDefUpdate`. > - **Models**: > - Add new aliases `resourceType`, `subresourceType`, and `operationType` in `models.tsp`. > - Update `SystemDef` model to include new fields in `models.tsp`. > - **API**: > - Add OpenAPI specification for version 1.0.0 in `openapi-1.0.0.yaml`. > - **Misc**: > - Update `versions.tsp` to include version `1.0.0`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 524135861c57310e71a75133a11340ac5d20186b. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: HamadaSalhab --- .../agents_api/activities/execute_system.py | 163 + .../activities/task_steps/prompt_step.py | 27 +- .../activities/task_steps/tool_call_step.py | 33 +- agents-api/agents_api/autogen/Tools.py | 79 +- agents-api/agents_api/worker/worker.py | 2 + .../workflows/task_execution/__init__.py | 27 +- agents-api/tests/test_execution_workflow.py | 60 + agents-api/tests/test_tool_queries.py | 1 + typespec/.gitignore | 9 +- typespec/tools/models.tsp | 58 +- .../@typespec/openapi3/openapi-0.4.0.yaml | 6345 +++++++++++++++++ .../@typespec/openapi3/openapi-1.0.0.yaml | 6345 +++++++++++++++++ typespec/versions.tsp | 1 + 13 files changed, 13114 insertions(+), 36 deletions(-) create mode 100644 agents-api/agents_api/activities/execute_system.py create mode 100644 typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml create mode 100644 typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml diff --git a/agents-api/agents_api/activities/execute_system.py b/agents-api/agents_api/activities/execute_system.py new file mode 100644 index 000000000..8e4d71274 --- /dev/null +++ b/agents-api/agents_api/activities/execute_system.py @@ -0,0 +1,163 @@ +from typing import Any +from uuid import UUID + +from beartype import beartype +from temporalio import activity + +from ..autogen.Tools import SystemDef +from ..common.protocol.tasks import StepContext +from ..env import testing +from ..models.agent.create_agent import create_agent as create_agent_query +from ..models.agent.delete_agent import delete_agent as delete_agent_query +from ..models.agent.get_agent import get_agent as get_agent_query +from ..models.agent.list_agents import list_agents as list_agents_query +from ..models.agent.update_agent import update_agent as update_agent_query +from ..models.docs.create_doc import create_doc as create_doc_query +from ..models.docs.delete_doc import delete_doc as delete_doc_query +from ..models.docs.get_doc import get_doc as get_doc_query +from ..models.docs.list_docs import list_docs as list_docs_query +from ..models.session.create_session import create_session as create_session_query +from ..models.session.delete_session import delete_session as delete_session_query +from ..models.session.get_session import get_session as get_session_query +from ..models.session.list_sessions import list_sessions as list_sessions_query +from ..models.session.update_session import update_session as update_session_query +from ..models.task.create_task import create_task as create_task_query +from ..models.task.delete_task import delete_task as delete_task_query +from ..models.task.get_task import get_task as get_task_query +from ..models.task.list_tasks import list_tasks as list_tasks_query +from ..models.task.update_task import update_task as update_task_query +from ..models.user.create_user import create_user as create_user_query +from ..models.user.delete_user import delete_user as delete_user_query +from ..models.user.get_user import get_user as get_user_query +from ..models.user.list_users import list_users as list_users_query +from ..models.user.update_user import update_user as update_user_query + + +@beartype +async def execute_system( + context: StepContext, + system: SystemDef, +) -> Any: + arguments = system.arguments + arguments["developer_id"] = context.execution_input.developer_id + + # Convert all UUIDs to UUID objects + if "agent_id" in arguments: + arguments["agent_id"] = UUID(arguments["agent_id"]) + if "user_id" in arguments: + arguments["user_id"] = UUID(arguments["user_id"]) + if "task_id" in arguments: + arguments["task_id"] = UUID(arguments["task_id"]) + if "session_id" in arguments: + arguments["session_id"] = UUID(arguments["session_id"]) + if "doc_id" in arguments: + arguments["doc_id"] = UUID(arguments["doc_id"]) + + # FIXME: This is a total mess. Should be refactored. + try: + # AGENTS + if system.resource == "agent": + # DOCS SUBRESOURCE + if system.subresource == "doc": + # Define the arguments for the agent doc queries + agent_doc_args = { + **{ + "owner_type": "agent", + "owner_id": arguments.pop("agent_id"), + }, + **arguments, + } + if system.operation == "list": + return list_docs_query(**agent_doc_args) + elif system.operation == "create": + return create_doc_query(**agent_doc_args) + elif system.operation == "delete": + return delete_doc_query(**agent_doc_args) + + # NO SUBRESOURCE + elif system.subresource == None: + if system.operation == "list": + return list_agents_query(**arguments) + elif system.operation == "get": + return get_agent_query(**arguments) + elif system.operation == "create": + return create_agent_query(**arguments) + elif system.operation == "update": + return update_agent_query(**arguments) + elif system.operation == "delete": + return delete_agent_query(**arguments) + + # USERS + elif system.resource == "user": + # DOCS SUBRESOURCE + if system.subresource == "doc": + # Define the arguments for the user doc queries + user_doc_args = { + **{ + "owner_type": "user", + "owner_id": arguments.pop("user_id"), + }, + **arguments, + } + if system.operation == "list": + return list_docs_query(**user_doc_args) + elif system.operation == "create": + return create_doc_query(**user_doc_args) + elif system.operation == "delete": + return delete_doc_query(**user_doc_args) + + # NO SUBRESOURCE + elif system.subresource == None: + if system.operation == "list": + return list_users_query(**arguments) + elif system.operation == "get": + return get_user_query(**arguments) + elif system.operation == "create": + return create_user_query(**arguments) + elif system.operation == "update": + return update_user_query(**arguments) + elif system.operation == "delete": + return delete_user_query(**arguments) + + # SESSIONS + elif system.resource == "session": + if system.operation == "list": + return list_sessions_query(**arguments) + elif system.operation == "get": + return get_session_query(**arguments) + elif system.operation == "create": + return create_session_query(**arguments) + elif system.operation == "update": + return update_session_query(**arguments) + elif system.operation == "delete": + return update_session_query(**arguments) + elif system.operation == "delete": + return delete_session_query(**arguments) + # TASKS + elif system.resource == "task": + if system.operation == "list": + return list_tasks_query(**arguments) + elif system.operation == "get": + return get_task_query(**arguments) + elif system.operation == "create": + return create_task_query(**arguments) + elif system.operation == "update": + return update_task_query(**arguments) + elif system.operation == "delete": + return delete_task_query(**arguments) + + raise NotImplementedError(f"System call not implemented for { + system.resource}.{system.operation}") + + except BaseException as e: + if activity.in_activity(): + activity.logger.error(f"Error in execute_system_call: {e}") + raise + + +# Mock and activity definition +mock_execute_system = execute_system + +execute_system = activity.defn(name="execute_system")( + execute_system if not testing else mock_execute_system +) diff --git a/agents-api/agents_api/activities/task_steps/prompt_step.py b/agents-api/agents_api/activities/task_steps/prompt_step.py index e9b4daeb3..bdc8a5c6e 100644 --- a/agents-api/agents_api/activities/task_steps/prompt_step.py +++ b/agents-api/agents_api/activities/task_steps/prompt_step.py @@ -2,6 +2,7 @@ from temporalio import activity from temporalio.exceptions import ApplicationError +from ...autogen.Tools import Tool from ...clients import ( litellm, # We dont directly import `acompletion` so we can mock it ) @@ -10,6 +11,22 @@ from ...models.tools.list_tools import list_tools +# FIXME: This shouldn't be here. +def format_agent_tool(tool: Tool) -> dict: + if tool.function: + return { + "type": "function", + "function": { + "name": tool.name, + "description": tool.description, + "parameters": tool.function.parameters, + }, + } + # TODO: Add integration | system | api_call tool types + else: + return {} + + @activity.defn @beartype async def prompt_step(context: StepContext) -> StepOutcome: @@ -46,15 +63,7 @@ async def prompt_step(context: StepContext) -> StepOutcome: # Format agent_tools for litellm formatted_agent_tools = [ - { - "type": tool.type, - "function": { - "name": tool.function.name, - "description": tool.function.description, - "parameters": tool.function.parameters, - }, - } - for tool in agent_tools + format_agent_tool(tool) for tool in agent_tools if format_agent_tool(tool) ] if context.current_step.settings: diff --git a/agents-api/agents_api/activities/task_steps/tool_call_step.py b/agents-api/agents_api/activities/task_steps/tool_call_step.py index 3082d8706..8d5d2fc8c 100644 --- a/agents-api/agents_api/activities/task_steps/tool_call_step.py +++ b/agents-api/agents_api/activities/task_steps/tool_call_step.py @@ -6,13 +6,14 @@ from temporalio.exceptions import ApplicationError from ...activities.task_steps.base_evaluate import base_evaluate -from ...autogen.openapi_model import Tool, ToolCallStep +from ...autogen.openapi_model import TaskToolDef, Tool, ToolCallStep from ...common.protocol.tasks import ( StepContext, StepOutcome, ) +# FIXME: This shouldn't be here. def generate_call_id(): # Generate 18 random bytes (which will result in 24 base64 characters) random_bytes = secrets.token_bytes(18) @@ -22,6 +23,26 @@ def generate_call_id(): return f"call_{base64_string}" +# FIXME: This shouldn't be here, and shouldn't be done this way. Should be refactored. +def construct_tool_call(tool: TaskToolDef, arguments: dict, call_id: str) -> dict: + return { + tool.type: { + "arguments": arguments, + "name": tool.name, + } + if tool.type != "system" + else { + "resource": tool.spec["resource"], + "operation": tool.spec["operation"], + "resource_id": tool.spec["resource_id"], + "subresource": tool.spec["subresource"], + "arguments": arguments, + }, + "id": call_id, + "type": tool.type, + } + + @activity.defn @beartype async def tool_call_step(context: StepContext) -> StepOutcome: @@ -40,14 +61,6 @@ async def tool_call_step(context: StepContext) -> StepOutcome: ) call_id = generate_call_id() - - tool_call = { - tool.type: { - "arguments": arguments, - "name": tool_name, - }, - "id": call_id, - "type": tool.type, - } + tool_call = construct_tool_call(tool, arguments, call_id) return StepOutcome(output=tool_call) diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index 07bcbea43..ffe10302c 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -35,7 +35,7 @@ class ApiCallDef(BaseModel): """ The content as base64 to send with the request """ - data: dict[str, str] | None = None + data: dict[str, Any] | None = None """ The data to send as form data """ @@ -55,6 +55,10 @@ class ApiCallDef(BaseModel): """ Follow redirects """ + timeout: int | None = None + """ + The timeout for the request + """ class ApiCallDefUpdate(BaseModel): @@ -94,7 +98,7 @@ class ApiCallDefUpdate(BaseModel): """ The content as base64 to send with the request """ - data: dict[str, str] | None = None + data: dict[str, Any] | None = None """ The data to send as form data """ @@ -114,6 +118,10 @@ class ApiCallDefUpdate(BaseModel): """ Follow redirects """ + timeout: int | None = None + """ + The timeout for the request + """ class ChosenToolCall(BaseModel): @@ -188,9 +196,9 @@ class FunctionDef(BaseModel): """ DO NOT USE: This will be overriden by the tool name. Here only for compatibility reasons. """ - description: str | None = None + description: Any | None = None """ - Description of the function + DO NOT USE: This will be overriden by the tool description. Here only for compatibility reasons. """ parameters: dict[str, Any] | None = None """ @@ -322,9 +330,34 @@ class SystemDef(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - call: str + resource: Literal["agent", "user", "task", "execution", "doc", "session", "job"] + """ + Resource is the name of the resource to use + """ + operation: Literal[ + "create", + "update", + "patch", + "create_or_update", + "embed", + "change_status", + "search", + "chat", + "history", + "delete", + "get", + "list", + ] """ - The name of the system call + Operation is the name of the operation to perform + """ + resource_id: UUID | None = None + """ + Resource id (if applicable) + """ + subresource: Literal["tool", "doc", "execution", "transition"] | None = None + """ + Sub-resource type (if applicable) """ arguments: dict[str, Any] | None = None """ @@ -340,9 +373,39 @@ class SystemDefUpdate(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - call: str | None = None + resource: ( + Literal["agent", "user", "task", "execution", "doc", "session", "job"] | None + ) = None + """ + Resource is the name of the resource to use + """ + operation: ( + Literal[ + "create", + "update", + "patch", + "create_or_update", + "embed", + "change_status", + "search", + "chat", + "history", + "delete", + "get", + "list", + ] + | None + ) = None + """ + Operation is the name of the operation to perform + """ + resource_id: UUID | None = None + """ + Resource id (if applicable) + """ + subresource: Literal["tool", "doc", "execution", "transition"] | None = None """ - The name of the system call + Sub-resource type (if applicable) """ arguments: dict[str, Any] | None = None """ diff --git a/agents-api/agents_api/worker/worker.py b/agents-api/agents_api/worker/worker.py index 08322772f..dc02cb4a7 100644 --- a/agents-api/agents_api/worker/worker.py +++ b/agents-api/agents_api/worker/worker.py @@ -17,6 +17,7 @@ def create_worker(client: Client) -> Any: from ..activities.embed_docs import embed_docs from ..activities.excecute_api_call import execute_api_call from ..activities.execute_integration import execute_integration + from ..activities.execute_system import execute_system from ..activities.mem_mgmt import mem_mgmt from ..activities.mem_rating import mem_rating from ..activities.summarization import summarization @@ -53,6 +54,7 @@ def create_worker(client: Client) -> Any: demo_activity, embed_docs, execute_integration, + execute_system, execute_api_call, mem_mgmt, mem_rating, diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index 6023f6f25..3c6106267 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -13,6 +13,7 @@ from ...activities import task_steps from ...activities.excecute_api_call import execute_api_call from ...activities.execute_integration import execute_integration + from ...activities.execute_system import execute_system from ...autogen.openapi_model import ( ApiCallDef, EmbedStep, @@ -39,6 +40,7 @@ WorkflowStep, YieldStep, ) + from ...autogen.Tools import SystemDef from ...common.protocol.tasks import ( ExecutionInput, PartialTransition, @@ -545,9 +547,28 @@ async def run( state = PartialTransition(output=tool_call_response) - case ToolCallStep(), StepOutcome(output=_): - # FIXME: Handle system/api_call tool_calls - raise ApplicationError("Not implemented") + case ToolCallStep(), StepOutcome(output=tool_call) if tool_call[ + "type" + ] == "system": + call = tool_call.get("system") + + system_call = SystemDef(**call) + tool_call_response = await workflow.execute_activity( + execute_system, + args=[context, system_call], + schedule_to_close_timeout=timedelta( + seconds=30 if debug or testing else 600 + ), + ) + + # FIXME: This is a hack to make the output of the system call match + # the expected output format (convert uuid/datetime to strings) + def model_dump(obj): + if isinstance(obj, list): + return [model_dump(item) for item in obj] + return obj.model_dump(mode="json") + + state = PartialTransition(output=model_dump(tool_call_response)) case _: workflow.logger.error( diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index 2a4fd7f75..c701a2e2f 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -440,6 +440,66 @@ async def _( assert result["hello"] == data.input["test"] +@test("workflow: system call - list agents") +async def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, +): + data = CreateExecutionRequest(input={}) + + task = create_task( + developer_id=developer_id, + agent_id=agent.id, + data=CreateTaskRequest( + **{ + "name": "Test system tool task", + "description": "List agents using system call", + "input_schema": {"type": "object"}, + "tools": [ + { + "name": "list_agents", + "description": "List all agents", + "type": "system", + "system": {"resource": "agent", "operation": "list"}, + }, + ], + "main": [ + { + "tool": "list_agents", + "arguments": { + "limit": "10", + }, + }, + ], + } + ), + client=client, + ) + + async with patch_testing_temporal() as (_, mock_run_task_execution_workflow): + execution, handle = await start_execution( + developer_id=developer_id, + task_id=task.id, + data=data, + client=client, + ) + + assert handle is not None + assert execution.task_id == task.id + assert execution.input == data.input + mock_run_task_execution_workflow.assert_called_once() + + result = await handle.result() + assert isinstance(result, list) + # Result's length should be less than or equal to the limit + assert len(result) <= 10 + # Check if all items are agent dictionaries + assert all(isinstance(agent, dict) for agent in result) + # Check if each agent has an 'id' field + assert all("id" in agent for agent in result) + + @test("workflow: tool call api_call") async def _( client=cozo_client, diff --git a/agents-api/tests/test_tool_queries.py b/agents-api/tests/test_tool_queries.py index c21b7fbfb..b41125aaf 100644 --- a/agents-api/tests/test_tool_queries.py +++ b/agents-api/tests/test_tool_queries.py @@ -142,6 +142,7 @@ def _( ): update_data = UpdateToolRequest( name="updated_tool", + description="An updated description", type="function", function={ "description": "An updated function that prints hello world", diff --git a/typespec/.gitignore b/typespec/.gitignore index 98d4239d8..d0791ce2c 100644 --- a/typespec/.gitignore +++ b/typespec/.gitignore @@ -1 +1,8 @@ -/tsp-output/ +# Ignore everything in tsp-output +tsp-output/**/*.* + +# Don't ignore the openapi3 directory +!tsp-output/@typespec/openapi3/ + +# But don't ignore openapi-*.yaml files in tsp-output/@typespec/openapi3/ +!tsp-output/@typespec/openapi3/openapi-*.yaml diff --git a/typespec/tools/models.tsp b/typespec/tools/models.tsp index 94243d20f..61918a4f7 100644 --- a/typespec/tools/models.tsp +++ b/typespec/tools/models.tsp @@ -34,8 +34,8 @@ model FunctionDef { /** DO NOT USE: This will be overriden by the tool name. Here only for compatibility reasons. */ name?: null = null; - /** Description of the function */ - description?: string; + /** DO NOT USE: This will be overriden by the tool description. Here only for compatibility reasons. */ + description?: null = null; /** The parameters the function accepts */ parameters?: FunctionParameters; @@ -57,10 +57,55 @@ model IntegrationDef { arguments?: FunctionParameters; } +// +// SYSTEM TOOL MODELS +// + +alias resourceType = ( + | "agent" + | "user" + | "task" + | "execution" + | "doc" + | "session" + | "job" +); + +alias subresourceType = ( + | "tool" + | "doc" + | "execution" + | "transition" +); + +alias operationType = ( + | "create" + | "update" + | "patch" + | "create_or_update" + | "embed" + | "change_status" + | "search" + | "chat" + | "history" + | "delete" + | "get" + | "list" +); + /** System definition */ model SystemDef { - /** The name of the system call */ - call: string; + /** Resource is the name of the resource to use */ + resource: resourceType; + + /** Operation is the name of the operation to perform */ + operation: operationType; + + /** Resource id (if applicable) */ + resource_id?: uuid; + + /** Sub-resource type (if applicable) */ + subresource?: subresourceType; /** The arguments to pre-apply to the system call */ arguments?: FunctionParameters; @@ -81,7 +126,7 @@ model ApiCallDef { content?: string; /** The data to send as form data */ - data?: Record; + data?: Record; /** JSON body to send with the request */ json?: Record; @@ -94,6 +139,9 @@ model ApiCallDef { /** Follow redirects */ follow_redirects?: boolean; + + /** The timeout for the request */ + timeout?: uint8; } diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml new file mode 100644 index 000000000..e578d26d9 --- /dev/null +++ b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml @@ -0,0 +1,6345 @@ +openapi: 3.0.0 +info: + title: Julep API + termsOfService: https://julep.ai/terms + contact: + name: Julep AI + url: https://julep.ai + email: developers@julep.ai + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + summary: A backend for creating stateful AI apps + description: Julep is a backend for creating stateful AI apps with background tasks and long-term memory easily. + version: 0.4.0 +externalDocs: + url: https://docs.julep.ai + description: Julep API documentation +tags: [] +paths: + /agents: + get: + operationId: AgentsRoute_list + description: List Agents (paginated) + parameters: + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Agents.Agent' + required: + - items + post: + operationId: AgentsRoute_create + description: Create a new Agent + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.CreateAgentRequest' + /agents/{id}: + post: + operationId: AgentsRoute_createOrUpdate + description: Create or update an Agent + parameters: + - $ref: '#/components/parameters/Agents.CreateOrUpdateAgentRequest.id' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.UpdateAgentRequest' + put: + operationId: AgentsRoute_update + description: Update an existing Agent by id (overwrites existing values; use PATCH for merging instead) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.UpdateAgentRequest' + patch: + operationId: AgentsRoute_patch + description: Update an existing Agent by id (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.PatchAgentRequest' + delete: + operationId: AgentsRoute_delete + description: Delete Agent by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: AgentsRoute_get + description: Get an Agent by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.Agent' + /agents/{id}/docs: + get: + operationId: AgentDocsRoute_list + description: List Docs owned by an Agent + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Docs.Doc' + required: + - results + post: + operationId: AgentDocsRoute_create + description: Create a Doc for this Agent + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.CreateDocRequest' + /agents/{id}/docs/{child_id}: + delete: + operationId: AgentDocsRoute_delete + description: Delete a Doc for this Agent + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /agents/{id}/search: + post: + operationId: AgentsDocsSearchRoute_search + description: Search Docs owned by an Agent + parameters: + - name: id + in: path + required: true + description: ID of the parent + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.DocSearchResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + body: + anyOf: + - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' + - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' + - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' + required: + - body + /agents/{id}/tasks: + get: + operationId: TasksRoute_list + description: List tasks (paginated) + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Tasks.Task' + required: + - results + post: + operationId: TasksRoute_create + description: Create a new task + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/x-yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + application/json: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + /agents/{id}/tasks/{child_id}: + put: + operationId: TasksRoute_update + description: Update an existing task (overwrite existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be updated + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tasks.UpdateTaskRequest' + patch: + operationId: TasksRoute_patch + description: Update an existing task (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be patched + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tasks.PatchTaskRequest' + delete: + operationId: TasksRoute_delete + description: Delete a task by its id + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /agents/{id}/tools: + get: + operationId: AgentToolsRoute_list + description: List tools of the given agent + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Tools.Tool' + required: + - results + post: + operationId: AgentToolsRoute_create + description: Create a new tool for this agent + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.CreateAgentRequest' + /agents/{id}/tools/{child_id}: + put: + operationId: AgentToolsRoute_update + description: Update an existing tool (overwrite existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be updated + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tools.UpdateToolRequest' + patch: + operationId: AgentToolsRoute_patch + description: Update an existing tool (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be patched + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tools.PatchToolRequest' + delete: + operationId: AgentToolsRoute_delete + description: Delete an existing tool by id + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /agents/{parent_id}/tasks/{id}: + post: + operationId: TasksCreateOrUpdateRoute_createOrUpdate + description: Create or update a task + parameters: + - name: parent_id + in: path + required: true + description: ID of the agent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Tasks.CreateOrUpdateTaskRequest.id' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/x-yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + application/json: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + /docs/{id}: + get: + operationId: IndividualDocsRoute_get + description: Get Doc by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.Doc' + /embed: + post: + operationId: EmbedRoute_embed + description: Embed a query for search + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.EmbedQueryResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + body: + $ref: '#/components/schemas/Docs.EmbedQueryRequest' + required: + - body + /executions: + post: + operationId: ExecutionsRoute_resumeWithTaskToken + description: Resume an execution with a task token + parameters: + - name: task_token + in: query + required: true + description: A Task Token is a unique identifier for a specific Task Execution. + schema: + type: string + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.TaskTokenResumeExecutionRequest' + description: Request to resume an execution with a task token + security: + - {} + /executions/{id}: + get: + operationId: ExecutionsRoute_get + description: Get an Execution by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.Execution' + put: + operationId: ExecutionsRoute_update + description: Update an existing Execution + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.UpdateExecutionRequest' + /executions/{id}/transitions: + get: + operationId: ExecutionTransitionsRoute_list + description: List the Transitions of an Execution by id + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + type: object + properties: + transitions: + type: array + items: + $ref: '#/components/schemas/Executions.Transition' + required: + - transitions + required: + - results + /executions/{id}/transitions.stream: + get: + operationId: ExecutionTransitionsStreamRoute_stream + description: Stream events emitted by the given execution + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - name: next_token + in: query + required: true + description: Next page token + schema: + type: string + nullable: true + default: null + explode: false + responses: + '200': + description: The request has succeeded. + content: + text/event-stream: + schema: + $ref: '#/components/schemas/Executions.TransitionEvent' + /jobs/{id}: + get: + operationId: JobRoute_get + description: Get the status of an existing Job by its id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Jobs.JobStatus' + /sessions: + get: + operationId: SessionsRoute_list + description: List sessions (paginated) + parameters: + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Sessions.Session' + required: + - items + post: + operationId: SessionsRoute_create + description: Create a new session + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.CreateSessionRequest' + /sessions/{id}: + post: + operationId: SessionsRoute_createOrUpdate + description: Create or update a session + parameters: + - $ref: '#/components/parameters/Sessions.CreateOrUpdateSessionRequest.id' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.CreateSessionRequest' + put: + operationId: SessionsRoute_update + description: Update an existing session by its id (overwrites all existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.UpdateSessionRequest' + patch: + operationId: SessionsRoute_patch + description: Update an existing session by its id (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.PatchSessionRequest' + delete: + operationId: SessionsRoute_delete + description: Delete a session by its id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: SessionsRoute_get + description: Get a session by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.Session' + /sessions/{id}/chat: + post: + operationId: ChatRoute_generate + description: Generate a response from the model + parameters: + - name: id + in: path + required: true + description: The session ID + schema: + $ref: '#/components/schemas/Common.uuid' + - name: x-custom-api-key + in: header + required: false + description: Custom API key + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/Chat.ChunkChatResponse' + - $ref: '#/components/schemas/Chat.MessageChatResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Chat.ChatInput' + description: Request to generate a response from the model + /sessions/{id}/history: + delete: + operationId: HistoryRoute_delete + description: Clear the history of a Session (resets the Session) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: HistoryRoute_history + description: Get history of a Session + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Entries.History' + /tasks/{id}/executions: + post: + operationId: TaskExecutionsRoute_create + description: Create an execution for the given task + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.CreateExecutionRequest' + get: + operationId: TaskExecutionsRoute_list + description: List executions of the given task + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Executions.Execution' + required: + - results + /users: + get: + operationId: UsersRoute_list + description: List users (paginated) + parameters: + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Users.User' + required: + - items + post: + operationId: UsersRoute_create + description: Create a new user + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.CreateUserRequest' + /users/{id}: + post: + operationId: UsersRoute_createOrUpdate + description: Create or update a user + parameters: + - $ref: '#/components/parameters/Users.CreateOrUpdateUserRequest' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.CreateUserRequest' + put: + operationId: UsersRoute_update + description: Update an existing user by id (overwrite existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.UpdateUserRequest' + patch: + operationId: UsersRoute_patch + description: Update an existing user by id (merge with existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.PatchUserRequest' + delete: + operationId: UsersRoute_delete + description: Delete a user by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: UsersRoute_get + description: Get a user by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Users.User' + /users/{id}/docs: + get: + operationId: UserDocsRoute_list + description: List Docs owned by a User + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Docs.Doc' + required: + - results + post: + operationId: UserDocsRoute_create + description: Create a Doc for this User + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.CreateDocRequest' + /users/{id}/docs/{child_id}: + delete: + operationId: UserDocsRoute_delete + description: Delete a Doc for this User + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /users/{id}/search: + post: + operationId: UserDocsSearchRoute_search + description: Search Docs owned by a User + parameters: + - name: id + in: path + required: true + description: ID of the parent + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.DocSearchResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + body: + anyOf: + - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' + - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' + - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' + required: + - body +security: + - ApiKeyAuth: [] + - ApiKeyAuth_: [] +components: + parameters: + Agents.CreateOrUpdateAgentRequest.id: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + Common.PaginationOptions.direction: + name: direction + in: query + required: true + description: Sort direction + schema: + type: string + enum: + - asc + - desc + default: asc + explode: false + Common.PaginationOptions.limit: + name: limit + in: query + required: true + description: Limit the number of items returned + schema: + $ref: '#/components/schemas/Common.limit' + default: 100 + explode: false + Common.PaginationOptions.metadata_filter: + name: metadata_filter + in: query + required: true + description: JSON string of object that should be used to filter objects by metadata + schema: + type: string + default: '{}' + explode: false + Common.PaginationOptions.offset: + name: offset + in: query + required: true + description: Offset the items returned + schema: + $ref: '#/components/schemas/Common.offset' + default: 0 + explode: false + Common.PaginationOptions.sort_by: + name: sort_by + in: query + required: true + description: Sort by a field + schema: + type: string + enum: + - created_at + - updated_at + default: created_at + explode: false + Sessions.CreateOrUpdateSessionRequest.id: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + Tasks.CreateOrUpdateTaskRequest.id: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + Users.CreateOrUpdateUserRequest: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + schemas: + Agents.Agent: + type: object + required: + - id + - created_at + - updated_at + - name + - about + - model + - instructions + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + Agents.CreateAgentRequest: + type: object + required: + - name + - about + - model + - instructions + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + description: Payload for creating a agent (and associated documents) + Agents.CreateOrUpdateAgentRequest: + type: object + required: + - id + - name + - about + - model + - instructions + properties: + id: + $ref: '#/components/schemas/Common.uuid' + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + allOf: + - $ref: '#/components/schemas/Agents.CreateAgentRequest' + Agents.PatchAgentRequest: + type: object + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + description: Payload for patching a agent + Agents.UpdateAgentRequest: + type: object + required: + - name + - about + - model + - instructions + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + description: Payload for updating a agent + Chat.BaseChatOutput: + type: object + required: + - index + - finish_reason + properties: + index: + type: integer + format: uint32 + finish_reason: + allOf: + - $ref: '#/components/schemas/Chat.FinishReason' + description: The reason the model stopped generating tokens + default: stop + logprobs: + allOf: + - $ref: '#/components/schemas/Chat.LogProbResponse' + description: The log probabilities of tokens + Chat.BaseChatResponse: + type: object + required: + - jobs + - docs + - created_at + - id + properties: + usage: + allOf: + - $ref: '#/components/schemas/Chat.CompetionUsage' + description: Usage statistics for the completion request + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: Background job IDs that may have been spawned from this interaction. + default: [] + readOnly: true + docs: + type: array + items: + $ref: '#/components/schemas/Docs.DocReference' + description: Documents referenced for this request (for citation purposes). + default: [] + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + Chat.BaseTokenLogProb: + type: object + required: + - token + - logprob + properties: + token: + type: string + logprob: + type: number + format: float + description: The log probability of the token + bytes: + type: array + items: + type: integer + format: uint16 + Chat.ChatInput: + type: object + required: + - remember + - recall + - save + - stream + - stop + properties: + remember: + type: boolean + description: 'DISABLED: Whether this interaction should form new memories or not (will be enabled in a future release)' + default: false + readOnly: true + recall: + type: boolean + description: Whether previous memories and docs should be recalled or not + default: true + save: + type: boolean + description: Whether this interaction should be stored in the session history or not + default: true + model: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Identifier of the model to be used + stream: + type: boolean + description: Indicates if the server should stream the response as it's generated + default: false + stop: + type: array + items: + type: string + maxItems: 4 + description: Up to 4 sequences where the API will stop generating further tokens. + default: [] + seed: + type: integer + format: int16 + minimum: -1 + maximum: 1000 + description: If specified, the system will make a best effort to sample deterministically for that particular seed value + max_tokens: + type: integer + format: uint32 + minimum: 1 + description: The maximum number of tokens to generate in the chat completion + logit_bias: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.logit_bias' + description: Modify the likelihood of specified tokens appearing in the completion + response_format: + anyOf: + - $ref: '#/components/schemas/Chat.SimpleCompletionResponseFormat' + - $ref: '#/components/schemas/Chat.SchemaCompletionResponseFormat' + description: Response format (set to `json_object` to restrict output to JSON) + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of the agent to use for this interaction. (Only applicable for multi-agent sessions) + repetition_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + length_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. + min_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Minimum probability compared to leading token to be considered + frequency_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + presence_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + temperature: + type: number + format: float + minimum: 0 + maximum: 5 + description: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + top_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. + allOf: + - $ref: '#/components/schemas/Chat.ChatInputData' + Chat.ChatInputData: + type: object + required: + - messages + - tools + properties: + messages: + type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + minItems: 1 + description: A list of new input messages comprising the conversation so far. + tools: + type: array + items: + $ref: '#/components/schemas/Tools.Tool' + description: (Advanced) List of tools that are provided in addition to agent's default set of tools. + default: [] + tool_choice: + anyOf: + - type: string + enum: + - auto + - none + - $ref: '#/components/schemas/Tools.NamedToolChoice' + description: Can be one of existing tools given to the agent earlier or the ones provided in this request. + Chat.ChatOutputChunk: + type: object + required: + - delta + properties: + delta: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + description: The message generated by the model + allOf: + - $ref: '#/components/schemas/Chat.BaseChatOutput' + description: Streaming chat completion output + Chat.ChatSettings: + type: object + required: + - stream + - stop + properties: + model: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Identifier of the model to be used + stream: + type: boolean + description: Indicates if the server should stream the response as it's generated + default: false + stop: + type: array + items: + type: string + maxItems: 4 + description: Up to 4 sequences where the API will stop generating further tokens. + default: [] + seed: + type: integer + format: int16 + minimum: -1 + maximum: 1000 + description: If specified, the system will make a best effort to sample deterministically for that particular seed value + max_tokens: + type: integer + format: uint32 + minimum: 1 + description: The maximum number of tokens to generate in the chat completion + logit_bias: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.logit_bias' + description: Modify the likelihood of specified tokens appearing in the completion + response_format: + anyOf: + - $ref: '#/components/schemas/Chat.SimpleCompletionResponseFormat' + - $ref: '#/components/schemas/Chat.SchemaCompletionResponseFormat' + description: Response format (set to `json_object` to restrict output to JSON) + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of the agent to use for this interaction. (Only applicable for multi-agent sessions) + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + Chat.ChunkChatResponse: + type: object + required: + - choices + properties: + choices: + type: array + items: + $ref: '#/components/schemas/Chat.ChatOutputChunk' + description: The deltas generated by the model + allOf: + - $ref: '#/components/schemas/Chat.BaseChatResponse' + Chat.CompetionUsage: + type: object + properties: + completion_tokens: + type: integer + format: uint32 + description: Number of tokens in the generated completion + readOnly: true + prompt_tokens: + type: integer + format: uint32 + description: Number of tokens in the prompt + readOnly: true + total_tokens: + type: integer + format: uint32 + description: Total number of tokens used in the request (prompt + completion) + readOnly: true + description: Usage statistics for the completion request + Chat.DefaultChatSettings: + type: object + properties: + repetition_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + length_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. + min_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Minimum probability compared to leading token to be considered + allOf: + - $ref: '#/components/schemas/Chat.OpenAISettings' + description: Default settings for the chat session (also used by the agent) + Chat.FinishReason: + type: string + enum: + - stop + - length + - content_filter + - tool_calls + description: |- + The reason the model stopped generating tokens. This will be `stop` + if the model hit a natural stop point or a provided stop sequence, + `length` if the maximum number of tokens specified in the request + was reached, `content_filter` if content was omitted due to a flag + from our content filters, `tool_calls` if the model called a tool. + Chat.LogProbResponse: + type: object + required: + - content + properties: + content: + type: array + items: + $ref: '#/components/schemas/Chat.TokenLogProb' + nullable: true + description: The log probabilities of the tokens + Chat.MessageChatResponse: + type: object + required: + - choices + properties: + choices: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Chat.SingleChatOutput' + - $ref: '#/components/schemas/Chat.MultipleChatOutput' + description: The deltas generated by the model + allOf: + - $ref: '#/components/schemas/Chat.BaseChatResponse' + Chat.MultipleChatOutput: + type: object + required: + - messages + properties: + messages: + type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + tool_calls: + type: array + items: + $ref: '#/components/schemas/Tools.ChosenToolCall' + nullable: true + description: Tool calls generated by the model. + default: [] + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + minItems: 1 + readOnly: true + allOf: + - $ref: '#/components/schemas/Chat.BaseChatOutput' + description: The output returned by the model. Note that, depending on the model provider, they might return more than one message. + Chat.OpenAISettings: + type: object + properties: + frequency_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + presence_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + temperature: + type: number + format: float + minimum: 0 + maximum: 5 + description: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + top_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. + Chat.SchemaCompletionResponseFormat: + type: object + required: + - type + - json_schema + properties: + type: + type: string + enum: + - json_schema + description: The format of the response + default: json_schema + json_schema: + type: object + additionalProperties: {} + description: The schema of the response + Chat.SimpleCompletionResponseFormat: + type: object + required: + - type + properties: + type: + type: string + enum: + - text + - json_object + description: The format of the response + default: text + Chat.SingleChatOutput: + type: object + required: + - message + properties: + message: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + tool_calls: + type: array + items: + $ref: '#/components/schemas/Tools.ChosenToolCall' + nullable: true + description: Tool calls generated by the model. + default: [] + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + allOf: + - $ref: '#/components/schemas/Chat.BaseChatOutput' + description: The output returned by the model. Note that, depending on the model provider, they might return more than one message. + Chat.TokenLogProb: + type: object + required: + - top_logprobs + properties: + top_logprobs: + type: array + items: + $ref: '#/components/schemas/Chat.BaseTokenLogProb' + minItems: 1 + description: The log probabilities of the tokens + readOnly: true + allOf: + - $ref: '#/components/schemas/Chat.BaseTokenLogProb' + Common.JinjaTemplate: + type: string + description: A valid jinja template. + Common.PyExpression: + type: string + description: A simple python expression compatible with SimpleEval. + Common.ResourceCreatedResponse: + type: object + required: + - id + - created_at + - jobs + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: ID of created resource + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: IDs (if any) of jobs created as part of this request + default: [] + readOnly: true + Common.ResourceDeletedResponse: + type: object + required: + - id + - deleted_at + - jobs + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: ID of deleted resource + deleted_at: + type: string + format: date-time + description: When this resource was deleted as UTC date-time + readOnly: true + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: IDs (if any) of jobs created as part of this request + default: [] + readOnly: true + Common.ResourceUpdatedResponse: + type: object + required: + - id + - updated_at + - jobs + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: ID of updated resource + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: IDs (if any) of jobs created as part of this request + default: [] + readOnly: true + Common.identifierSafeUnicode: + type: string + maxLength: 120 + pattern: ^[\p{L}\p{Nl}\p{Pattern_Syntax}\p{Pattern_White_Space}]+[\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{Pattern_Syntax}\p{Pattern_White_Space}]*$ + description: |- + For Unicode character safety + See: https://unicode.org/reports/tr31/ + See: https://www.unicode.org/reports/tr39/#Identifier_Characters + Common.limit: + type: integer + format: uint16 + minimum: 1 + maximum: 1000 + exclusiveMaximum: true + description: Limit the number of results + Common.logit_bias: + type: number + format: float + minimum: -100 + maximum: 100 + Common.offset: + type: integer + format: uint32 + minimum: 0 + description: Offset to apply to the results + Common.uuid: + type: string + format: uuid + Common.validPythonIdentifier: + type: string + maxLength: 40 + pattern: ^[^\W0-9]\w*$ + description: Valid python identifier names + Docs.BaseDocSearchRequest: + type: object + required: + - limit + - lang + properties: + limit: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + default: 10 + lang: + type: string + enum: + - en-US + description: The language to be used for text-only search. Support for other languages coming soon. + default: en-US + Docs.CreateDocRequest: + type: object + required: + - title + - content + properties: + metadata: + type: object + additionalProperties: {} + title: + type: string + maxLength: 800 + description: Title describing what this document contains + content: + anyOf: + - type: string + - type: array + items: + type: string + description: Contents of the document + description: Payload for creating a doc + Docs.Doc: + type: object + required: + - id + - created_at + - title + - content + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + title: + type: string + maxLength: 800 + description: Title describing what this document contains + content: + anyOf: + - type: string + - type: array + items: + type: string + description: Contents of the document + embeddings: + anyOf: + - type: array + items: + type: number + format: float + - type: array + items: + type: array + items: + type: number + format: float + description: Embeddings for the document + readOnly: true + Docs.DocOwner: + type: object + required: + - id + - role + properties: + id: + anyOf: + - allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + - allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + role: + type: string + enum: + - user + - agent + Docs.DocReference: + type: object + required: + - owner + - id + - snippets + - distance + properties: + owner: + allOf: + - $ref: '#/components/schemas/Docs.DocOwner' + description: The owner of this document. + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + description: ID of the document + title: + type: string + snippets: + type: array + items: + $ref: '#/components/schemas/Docs.Snippet' + minItems: 1 + distance: + type: number + nullable: true + default: null + Docs.DocSearchResponse: + type: object + required: + - docs + - time + properties: + docs: + type: array + items: + $ref: '#/components/schemas/Docs.DocReference' + description: The documents that were found + time: + type: number + minimum: 0 + exclusiveMinimum: true + description: The time taken to search in seconds + Docs.EmbedQueryRequest: + type: object + required: + - text + properties: + text: + anyOf: + - type: string + - type: array + items: + type: string + description: Text or texts to embed + Docs.EmbedQueryResponse: + type: object + required: + - vectors + properties: + vectors: + type: array + items: + type: array + items: + type: number + description: The embedded vectors + Docs.HybridDocSearchRequest: + type: object + required: + - confidence + - alpha + - text + - vector + properties: + confidence: + type: number + minimum: 0 + maximum: 1 + description: The confidence cutoff level + default: 0.5 + alpha: + type: number + minimum: 0 + maximum: 1 + description: The weight to apply to BM25 vs Vector search results. 0 => pure BM25; 1 => pure vector; + default: 0.75 + text: + type: string + description: Text to use in the search. In `hybrid` search mode, either `text` or both `text` and `vector` fields are required. + vector: + type: array + items: + type: number + description: Vector to use in the search. Must be the same dimensions as the embedding model or else an error will be thrown. + allOf: + - $ref: '#/components/schemas/Docs.BaseDocSearchRequest' + Docs.Snippet: + type: object + required: + - index + - content + properties: + index: + type: integer + format: uint16 + content: + type: string + Docs.TextOnlyDocSearchRequest: + type: object + required: + - text + properties: + text: + type: string + description: Text to use in the search. + allOf: + - $ref: '#/components/schemas/Docs.BaseDocSearchRequest' + Docs.VectorDocSearchRequest: + type: object + required: + - confidence + - vector + properties: + confidence: + type: number + minimum: 0 + maximum: 1 + description: The confidence cutoff level + default: 0.5 + vector: + type: array + items: + type: number + description: Vector to use in the search. Must be the same dimensions as the embedding model or else an error will be thrown. + allOf: + - $ref: '#/components/schemas/Docs.BaseDocSearchRequest' + Entries.BaseEntry: + type: object + required: + - role + - name + - content + - source + - tokenizer + - token_count + - timestamp + properties: + role: + $ref: '#/components/schemas/Entries.ChatMLRole' + name: + type: string + nullable: true + default: null + content: + anyOf: + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + - $ref: '#/components/schemas/Tools.Tool' + - $ref: '#/components/schemas/Tools.ChosenToolCall' + - type: string + - $ref: '#/components/schemas/Tools.ToolResponse' + - type: array + items: + anyOf: + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + - $ref: '#/components/schemas/Tools.Tool' + - $ref: '#/components/schemas/Tools.ChosenToolCall' + - type: string + - $ref: '#/components/schemas/Tools.ToolResponse' + source: + type: string + enum: + - api_request + - api_response + - tool_response + - internal + - summarizer + - meta + tokenizer: + type: string + token_count: + type: integer + format: uint16 + timestamp: + type: number + minimum: 0 + description: This is the time that this event refers to. + Entries.ChatMLRole: + type: string + enum: + - user + - assistant + - system + - function + - function_response + - function_call + - auto + description: ChatML role (system|assistant|user|function_call|function|function_response|auto) + Entries.Entry: + type: object + required: + - created_at + - id + properties: + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + allOf: + - $ref: '#/components/schemas/Entries.BaseEntry' + Entries.History: + type: object + required: + - entries + - relations + - session_id + - created_at + properties: + entries: + type: array + items: + $ref: '#/components/schemas/Entries.Entry' + relations: + type: array + items: + $ref: '#/components/schemas/Entries.Relation' + session_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + Entries.ImageDetail: + type: string + enum: + - low + - high + - auto + description: Image detail level + Entries.Relation: + type: object + required: + - head + - relation + - tail + properties: + head: + $ref: '#/components/schemas/Common.uuid' + relation: + type: string + tail: + $ref: '#/components/schemas/Common.uuid' + Executions.CreateExecutionRequest: + type: object + required: + - input + properties: + input: + type: object + additionalProperties: {} + description: The input to the execution + output: + description: The output of the execution if it succeeded + error: + type: string + description: The error of the execution if it failed + metadata: + type: object + additionalProperties: {} + description: Payload for creating an execution + Executions.Execution: + type: object + required: + - task_id + - status + - input + - created_at + - updated_at + - id + properties: + task_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + description: The ID of the task that the execution is running + status: + type: string + enum: + - queued + - starting + - running + - awaiting_input + - succeeded + - failed + - cancelled + description: The status of the execution + readOnly: true + input: + type: object + additionalProperties: {} + description: The input to the execution + output: + description: The output of the execution if it succeeded + error: + type: string + description: The error of the execution if it failed + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + metadata: + type: object + additionalProperties: {} + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + Executions.ResumeExecutionRequest: + type: object + required: + - status + properties: + status: + type: string + enum: + - running + default: running + input: + type: object + additionalProperties: {} + description: The input to resume the execution with + allOf: + - $ref: '#/components/schemas/Executions.UpdateExecutionRequest' + Executions.StopExecutionRequest: + type: object + required: + - status + - reason + properties: + status: + type: string + enum: + - cancelled + default: cancelled + reason: + type: string + nullable: true + description: The reason for stopping the execution + default: null + allOf: + - $ref: '#/components/schemas/Executions.UpdateExecutionRequest' + Executions.TaskTokenResumeExecutionRequest: + type: object + required: + - status + properties: + status: + type: string + enum: + - running + default: running + input: + type: object + additionalProperties: {} + description: The input to resume the execution with + Executions.Transition: + type: object + required: + - execution_id + - current + - next + - id + properties: + execution_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + current: + allOf: + - $ref: '#/components/schemas/Executions.TransitionTarget' + readOnly: true + next: + type: object + allOf: + - $ref: '#/components/schemas/Executions.TransitionTarget' + nullable: true + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + allOf: + - $ref: '#/components/schemas/Executions.TransitionEvent' + Executions.TransitionEvent: + type: object + required: + - type + - output + - created_at + - updated_at + properties: + type: + type: string + enum: + - init + - init_branch + - finish + - finish_branch + - wait + - resume + - error + - step + - cancelled + readOnly: true + output: + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + Executions.TransitionTarget: + type: object + required: + - workflow + - step + properties: + workflow: + $ref: '#/components/schemas/Common.identifierSafeUnicode' + step: + type: integer + format: uint16 + Executions.UpdateExecutionRequest: + type: object + required: + - status + properties: + status: + type: string + enum: + - queued + - starting + - running + - awaiting_input + - succeeded + - failed + - cancelled + discriminator: + propertyName: status + mapping: + cancelled: '#/components/schemas/Executions.StopExecutionRequest' + running: '#/components/schemas/Executions.ResumeExecutionRequest' + Jobs.JobState: + type: string + enum: + - pending + - in_progress + - retrying + - succeeded + - aborted + - failed + - unknown + description: 'Current state (one of: pending, in_progress, retrying, succeeded, aborted, failed)' + Jobs.JobStatus: + type: object + required: + - id + - created_at + - updated_at + - name + - reason + - has_progress + - progress + - state + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the job + default: '' + reason: + type: string + description: Reason for the current state of the job + default: '' + has_progress: + type: boolean + description: Whether this Job supports progress updates + default: false + progress: + type: number + format: float + minimum: 0 + maximum: 100 + description: Progress percentage + default: 0 + state: + allOf: + - $ref: '#/components/schemas/Jobs.JobState' + description: Current state of the job + default: pending + Sessions.ContextOverflowType: + type: string + enum: + - truncate + - adaptive + Sessions.CreateOrUpdateSessionRequest: + type: object + required: + - id + - situation + - render_templates + - token_budget + - context_overflow + - forward_tool_results + properties: + id: + $ref: '#/components/schemas/Common.uuid' + user: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: User ID of user associated with this session + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of agent associated with this session + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + allOf: + - $ref: '#/components/schemas/Sessions.CreateSessionRequest' + Sessions.CreateSessionRequest: + type: object + required: + - situation + - render_templates + - token_budget + - context_overflow + - forward_tool_results + properties: + user: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: User ID of user associated with this session + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of agent associated with this session + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + description: Payload for creating a session + Sessions.MultiAgentMultiUserSession: + type: object + required: + - agents + - users + properties: + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.MultiAgentNoUserSession: + type: object + required: + - agents + properties: + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.MultiAgentSingleUserSession: + type: object + required: + - agents + - user + properties: + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + user: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.PatchSessionRequest: + type: object + properties: + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + description: Payload for patching a session + Sessions.Session: + type: object + required: + - situation + - summary + - render_templates + - token_budget + - context_overflow + - forward_tool_results + - id + - created_at + - updated_at + properties: + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + summary: + type: string + nullable: true + description: Summary (null at the beginning) - generated automatically after every interaction + default: null + readOnly: true + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + kind: + type: string + description: Discriminator property for Session. + discriminator: + propertyName: kind + mapping: + single_agent_no_user: '#/components/schemas/Sessions.SingleAgentNoUserSession' + single_agent_single_user: '#/components/schemas/Sessions.SingleAgentSingleUserSession' + single_agent_multi_user: '#/components/schemas/Sessions.SingleAgentMultiUserSession' + multi_agent_no_user: '#/components/schemas/Sessions.MultiAgentNoUserSession' + multi_agent_single_user: '#/components/schemas/Sessions.MultiAgentSingleUserSession' + multi_agent_multi_user: '#/components/schemas/Sessions.MultiAgentMultiUserSession' + Sessions.SingleAgentMultiUserSession: + type: object + required: + - agent + - users + properties: + agent: + $ref: '#/components/schemas/Common.uuid' + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.SingleAgentNoUserSession: + type: object + required: + - agent + properties: + agent: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.SingleAgentSingleUserSession: + type: object + required: + - agent + - user + properties: + agent: + $ref: '#/components/schemas/Common.uuid' + user: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.UpdateSessionRequest: + type: object + required: + - situation + - render_templates + - token_budget + - context_overflow + - forward_tool_results + properties: + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + description: Payload for updating a session + Tasks.CaseThen: + type: object + required: + - case + - then + properties: + case: + anyOf: + - $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + Tasks.CaseThenUpdateItem: + type: object + required: + - case + - then + properties: + case: + anyOf: + - $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + Tasks.CreateTaskRequest: + type: object + required: + - name + - description + - main + - input_schema + - tools + - inherit_tools + properties: + name: + type: string + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + description: Payload for creating a task + Tasks.EmbedStep: + type: object + required: + - kind_ + - embed + properties: + kind_: + type: string + enum: + - embed + default: embed + readOnly: true + embed: + allOf: + - $ref: '#/components/schemas/Docs.EmbedQueryRequest' + description: The text to embed + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - embed + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ErrorWorkflowStep: + type: object + required: + - kind_ + - error + properties: + kind_: + type: string + enum: + - error + default: error + readOnly: true + error: + type: string + description: The error message + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - error + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.EvaluateStep: + type: object + required: + - kind_ + - evaluate + properties: + kind_: + type: string + enum: + - evaluate + default: evaluate + readOnly: true + evaluate: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: The expression to evaluate + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - evaluate + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ForeachDo: + type: object + required: + - in + - do + properties: + in: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The variable to iterate over. + VALIDATION: Should NOT return more than 1000 elements. + do: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + Tasks.ForeachDoUpdateItem: + type: object + required: + - in + - do + properties: + in: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The variable to iterate over. + VALIDATION: Should NOT return more than 1000 elements. + do: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + Tasks.ForeachStep: + type: object + required: + - kind_ + - foreach + properties: + kind_: + type: string + enum: + - foreach + default: foreach + readOnly: true + foreach: + allOf: + - $ref: '#/components/schemas/Tasks.ForeachDo' + description: The steps to run for each iteration + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - foreach + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ForeachStepUpdateItem: + type: object + required: + - foreach + properties: + foreach: + allOf: + - $ref: '#/components/schemas/Tasks.ForeachDoUpdateItem' + description: The steps to run for each iteration + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.GetStep: + type: object + required: + - kind_ + - get + properties: + kind_: + type: string + enum: + - get + default: get + readOnly: true + get: + type: string + description: The key to get + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - get + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.IfElseWorkflowStep: + type: object + required: + - kind_ + - if + - then + - else + properties: + kind_: + type: string + enum: + - if_else + default: if_else + readOnly: true + if: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + else: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + nullable: true + description: The steps to run if the condition is false + default: null + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - if_else + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.IfElseWorkflowStepUpdateItem: + type: object + required: + - if + - then + - else + properties: + if: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + else: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + nullable: true + description: The steps to run if the condition is false + default: null + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.LogStep: + type: object + required: + - kind_ + - log + properties: + kind_: + type: string + enum: + - log + default: log + readOnly: true + log: + allOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + description: The value to log + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - log + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ParallelStep: + type: object + required: + - kind_ + - parallel + properties: + kind_: + type: string + enum: + - parallel + default: parallel + readOnly: true + parallel: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + maxItems: 100 + description: The steps to run in parallel. Max concurrency will depend on the platform. + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - parallel + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ParallelStepUpdateItem: + type: object + required: + - parallel + properties: + parallel: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + maxItems: 100 + description: The steps to run in parallel. Max concurrency will depend on the platform. + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.PatchTaskRequest: + type: object + properties: + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' + - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ForeachStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ParallelStepUpdateItem' + - type: object + required: + - over + - map + properties: + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' + - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ForeachStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ParallelStepUpdateItem' + - type: object + required: + - over + - map + properties: + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + description: Payload for patching a task + Tasks.PromptStep: + type: object + required: + - kind_ + - prompt + - tools + - forward_tool_results + properties: + kind_: + type: string + enum: + - prompt + default: prompt + readOnly: true + prompt: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + $ref: '#/components/schemas/Common.JinjaTemplate' + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + description: The prompt to run + tools: + anyOf: + - type: string + enum: + - all + - type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.ToolRef' + - $ref: '#/components/schemas/Tools.CreateToolRequest' + description: The tools to use for the prompt + default: [] + tool_choice: + anyOf: + - type: string + enum: + - auto + - none + - $ref: '#/components/schemas/Tools.NamedToolChoice' + description: The tool choice for the prompt + settings: + allOf: + - $ref: '#/components/schemas/Chat.ChatSettings' + description: Settings for the prompt + unwrap: + type: boolean + description: Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` + default: false + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be used as the model's input. + If a tool call is not made, the model's output will be used as the next step's input. + default: null + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - prompt + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.PromptStepUpdateItem: + type: object + required: + - prompt + - tools + - forward_tool_results + properties: + prompt: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + $ref: '#/components/schemas/Common.JinjaTemplate' + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + description: The prompt to run + tools: + anyOf: + - type: string + enum: + - all + - type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.ToolRefUpdateItem' + - $ref: '#/components/schemas/Tools.CreateToolRequest' + description: The tools to use for the prompt + default: [] + tool_choice: + anyOf: + - type: string + enum: + - auto + - none + - $ref: '#/components/schemas/Tools.NamedToolChoice' + description: The tool choice for the prompt + settings: + allOf: + - $ref: '#/components/schemas/Chat.ChatSettings' + description: Settings for the prompt + unwrap: + type: boolean + description: Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` + default: false + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be used as the model's input. + If a tool call is not made, the model's output will be used as the next step's input. + default: null + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ReturnStep: + type: object + required: + - kind_ + - return + properties: + kind_: + type: string + enum: + - return + default: return + readOnly: true + return: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: The value to return + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - return + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SearchStep: + type: object + required: + - kind_ + - search + properties: + kind_: + type: string + enum: + - search + default: search + readOnly: true + search: + anyOf: + - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' + - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' + - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' + description: The search query + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - search + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SetStep: + type: object + required: + - kind_ + - set + properties: + kind_: + type: string + enum: + - set + default: set + readOnly: true + set: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: The value to set + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - set + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SleepFor: + type: object + required: + - seconds + - minutes + - hours + - days + properties: + seconds: + type: integer + format: uint16 + minimum: 0 + maximum: 60 + description: The number of seconds to sleep for + default: 0 + minutes: + type: integer + format: uint16 + minimum: 0 + maximum: 60 + description: The number of minutes to sleep for + default: 0 + hours: + type: integer + format: uint16 + minimum: 0 + maximum: 24 + description: The number of hours to sleep for + default: 0 + days: + type: integer + format: uint16 + minimum: 0 + maximum: 30 + description: The number of days to sleep for + default: 0 + Tasks.SleepStep: + type: object + required: + - kind_ + - sleep + properties: + kind_: + type: string + enum: + - sleep + default: sleep + readOnly: true + sleep: + allOf: + - $ref: '#/components/schemas/Tasks.SleepFor' + description: The duration to sleep for (max 31 days) + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - sleep + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SwitchStep: + type: object + required: + - kind_ + - switch + properties: + kind_: + type: string + enum: + - switch + default: switch + readOnly: true + switch: + type: array + items: + $ref: '#/components/schemas/Tasks.CaseThen' + minItems: 1 + description: The cond tree + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - switch + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SwitchStepUpdateItem: + type: object + required: + - switch + properties: + switch: + type: array + items: + $ref: '#/components/schemas/Tasks.CaseThenUpdateItem' + minItems: 1 + description: The cond tree + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.Task: + type: object + required: + - name + - description + - main + - input_schema + - tools + - inherit_tools + - id + - created_at + - updated_at + properties: + name: + type: string + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + description: Object describing a Task + Tasks.TaskTool: + type: object + properties: + inherited: + type: boolean + description: 'Read-only: Whether the tool was inherited or not. Only applies within tasks.' + default: false + readOnly: true + allOf: + - $ref: '#/components/schemas/Tools.CreateToolRequest' + Tasks.ToolCallStep: + type: object + required: + - kind_ + - tool + - arguments + properties: + kind_: + type: string + enum: + - tool_call + default: tool_call + readOnly: true + tool: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: The tool to run + arguments: + anyOf: + - type: object + additionalProperties: + anyOf: + - $ref: '#/components/schemas/Common.PyExpression' + - type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The input parameters for the tool (defaults to last step output) + default: _ + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - tool_call + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ToolRef: + type: object + required: + - ref + properties: + ref: + anyOf: + - $ref: '#/components/schemas/Tasks.ToolRefById' + - $ref: '#/components/schemas/Tasks.ToolRefByName' + description: Reference to a tool + Tasks.ToolRefById: + type: object + properties: + id: + $ref: '#/components/schemas/Common.uuid' + description: Reference to a tool by id + Tasks.ToolRefByName: + type: object + properties: + name: + $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Reference to a tool by name + Tasks.ToolRefUpdateItem: + type: object + description: Reference to a tool + Tasks.UpdateTaskRequest: + type: object + required: + - description + - main + - input_schema + - tools + - inherit_tools + properties: + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + description: Payload for updating a task + Tasks.WaitForInputInfo: + type: object + required: + - info + properties: + info: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: Any additional info or data + Tasks.WaitForInputStep: + type: object + required: + - kind_ + - wait_for_input + properties: + kind_: + type: string + enum: + - wait_for_input + default: wait_for_input + readOnly: true + wait_for_input: + allOf: + - $ref: '#/components/schemas/Tasks.WaitForInputInfo' + description: Any additional info or data + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - wait_for_input + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.YieldStep: + type: object + required: + - kind_ + - workflow + - arguments + properties: + kind_: + type: string + enum: + - yield + default: yield + readOnly: true + workflow: + type: string + description: |- + The subworkflow to run. + VALIDATION: Should resolve to a defined subworkflow. + arguments: + anyOf: + - type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The input parameters for the subworkflow (defaults to last step output) + default: _ + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - yield + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tools.ApiCallDef: + type: object + required: + - method + - url + properties: + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + - HEAD + - OPTIONS + - CONNECT + - TRACE + description: The HTTP method to use + url: + type: string + format: uri + description: The URL to call + headers: + type: object + additionalProperties: + type: string + description: The headers to send with the request + content: + type: string + description: The content as base64 to send with the request + data: + type: object + additionalProperties: {} + description: The data to send as form data + json: + type: object + additionalProperties: {} + description: JSON body to send with the request + cookies: + type: object + additionalProperties: + type: string + description: Cookies + params: + anyOf: + - type: string + - type: object + additionalProperties: {} + description: The parameters to send with the request + follow_redirects: + type: boolean + description: Follow redirects + timeout: + type: integer + format: uint8 + description: The timeout for the request + description: API call definition + Tools.ApiCallDefUpdate: + type: object + properties: + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + - HEAD + - OPTIONS + - CONNECT + - TRACE + description: The HTTP method to use + url: + type: string + format: uri + description: The URL to call + headers: + type: object + additionalProperties: + type: string + description: The headers to send with the request + content: + type: string + description: The content as base64 to send with the request + data: + type: object + additionalProperties: {} + description: The data to send as form data + json: + type: object + additionalProperties: {} + description: JSON body to send with the request + cookies: + type: object + additionalProperties: + type: string + description: Cookies + params: + anyOf: + - type: string + - type: object + additionalProperties: {} + description: The parameters to send with the request + follow_redirects: + type: boolean + description: Follow redirects + timeout: + type: integer + format: uint8 + description: The timeout for the request + description: API call definition + Tools.ChosenFunctionCall: + type: object + required: + - type + - function + properties: + type: + type: string + enum: + - function + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionCallOption' + description: The function to call + allOf: + - $ref: '#/components/schemas/Tools.ChosenToolCall' + Tools.ChosenToolCall: + type: object + required: + - type + - id + properties: + type: + allOf: + - $ref: '#/components/schemas/Tools.ToolType' + description: Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) + function: + $ref: '#/components/schemas/Tools.FunctionCallOption' + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + discriminator: + propertyName: type + mapping: + function: '#/components/schemas/Tools.ChosenFunctionCall' + description: The response tool value generated by the model + Tools.CreateToolRequest: + type: object + required: + - name + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDef' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDef' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDef' + description: The API call to make + description: Payload for creating a tool + Tools.FunctionCallOption: + type: object + required: + - name + properties: + name: + type: string + description: The name of the function + Tools.FunctionDef: + type: object + properties: + name: + nullable: true + description: 'DO NOT USE: This will be overriden by the tool name. Here only for compatibility reasons.' + default: null + description: + nullable: true + description: 'DO NOT USE: This will be overriden by the tool description. Here only for compatibility reasons.' + default: null + parameters: + type: object + additionalProperties: {} + description: The parameters the function accepts + description: Function definition + Tools.IntegrationDef: + type: object + required: + - provider + properties: + provider: + anyOf: + - type: string + enum: + - dummy + - hacker_news + - weather + - wikipedia + - spider + - brave + - browserbase + - type: string + description: The provider of the integration + method: + type: string + description: The specific method of the integration to call + setup: + type: object + additionalProperties: {} + description: The setup parameters the integration accepts + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the integration call + description: Integration definition + Tools.IntegrationDefUpdate: + type: object + properties: + provider: + anyOf: + - type: string + enum: + - dummy + - hacker_news + - weather + - wikipedia + - spider + - brave + - browserbase + - type: string + description: The provider of the integration + method: + type: string + description: The specific method of the integration to call + setup: + type: object + additionalProperties: {} + description: The setup parameters the integration accepts + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the integration call + description: Integration definition + Tools.NamedToolChoice: + type: object + properties: + function: + $ref: '#/components/schemas/Tools.FunctionCallOption' + Tools.PatchToolRequest: + type: object + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDefUpdate' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDefUpdate' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDefUpdate' + description: The API call to make + description: Payload for patching a tool + Tools.SystemDef: + type: object + required: + - resource + - operation + properties: + resource: + type: string + enum: + - agent + - user + - task + - execution + - doc + - session + - job + description: Resource is the name of the resource to use + operation: + type: string + enum: + - create + - update + - patch + - create_or_update + - embed + - change_status + - search + - chat + - history + - delete + - get + - list + description: Operation is the name of the operation to perform + resource_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Resource id (if applicable) + subresource: + type: string + enum: + - tool + - doc + - execution + - transition + description: Sub-resource type (if applicable) + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the system call + description: System definition + Tools.SystemDefUpdate: + type: object + properties: + resource: + type: string + enum: + - agent + - user + - task + - execution + - doc + - session + - job + description: Resource is the name of the resource to use + operation: + type: string + enum: + - create + - update + - patch + - create_or_update + - embed + - change_status + - search + - chat + - history + - delete + - get + - list + description: Operation is the name of the operation to perform + resource_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Resource id (if applicable) + subresource: + type: string + enum: + - tool + - doc + - execution + - transition + description: Sub-resource type (if applicable) + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the system call + description: System definition + Tools.Tool: + type: object + required: + - name + - created_at + - updated_at + - id + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDef' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDef' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDef' + description: The API call to make + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + Tools.ToolResponse: + type: object + required: + - id + - output + properties: + id: + $ref: '#/components/schemas/Common.uuid' + output: + type: object + additionalProperties: {} + description: The output of the tool + Tools.ToolType: + type: string + enum: + - function + - integration + - system + - api_call + Tools.UpdateToolRequest: + type: object + required: + - name + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDef' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDef' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDef' + description: The API call to make + description: Payload for updating a tool + Users.CreateOrUpdateUserRequest: + type: object + required: + - id + properties: + id: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Users.CreateUserRequest' + Users.CreateUserRequest: + type: object + required: + - name + - about + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + description: Payload for creating a user (and associated documents) + Users.PatchUserRequest: + type: object + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + description: Payload for patching a user + Users.UpdateUserRequest: + type: object + required: + - name + - about + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + description: Payload for updating a user + Users.User: + type: object + required: + - id + - created_at + - updated_at + - name + - about + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: Authorization + ApiKeyAuth_: + type: apiKey + in: header + name: X-Auth-Key +servers: + - url: https://{serverEnv}.julep.ai/api + description: The julep cloud service endpoint + variables: + serverEnv: + default: api-alpha + description: The environment to use + enum: + - api + - api-alpha diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml new file mode 100644 index 000000000..e5a5f99e6 --- /dev/null +++ b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml @@ -0,0 +1,6345 @@ +openapi: 3.0.0 +info: + title: Julep API + termsOfService: https://julep.ai/terms + contact: + name: Julep AI + url: https://julep.ai + email: developers@julep.ai + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + summary: A backend for creating stateful AI apps + description: Julep is a backend for creating stateful AI apps with background tasks and long-term memory easily. + version: 1.0.0 +externalDocs: + url: https://docs.julep.ai + description: Julep API documentation +tags: [] +paths: + /agents: + get: + operationId: AgentsRoute_list + description: List Agents (paginated) + parameters: + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Agents.Agent' + required: + - items + post: + operationId: AgentsRoute_create + description: Create a new Agent + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.CreateAgentRequest' + /agents/{id}: + post: + operationId: AgentsRoute_createOrUpdate + description: Create or update an Agent + parameters: + - $ref: '#/components/parameters/Agents.CreateOrUpdateAgentRequest.id' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.UpdateAgentRequest' + put: + operationId: AgentsRoute_update + description: Update an existing Agent by id (overwrites existing values; use PATCH for merging instead) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.UpdateAgentRequest' + patch: + operationId: AgentsRoute_patch + description: Update an existing Agent by id (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.PatchAgentRequest' + delete: + operationId: AgentsRoute_delete + description: Delete Agent by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: AgentsRoute_get + description: Get an Agent by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.Agent' + /agents/{id}/docs: + get: + operationId: AgentDocsRoute_list + description: List Docs owned by an Agent + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Docs.Doc' + required: + - results + post: + operationId: AgentDocsRoute_create + description: Create a Doc for this Agent + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.CreateDocRequest' + /agents/{id}/docs/{child_id}: + delete: + operationId: AgentDocsRoute_delete + description: Delete a Doc for this Agent + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /agents/{id}/search: + post: + operationId: AgentsDocsSearchRoute_search + description: Search Docs owned by an Agent + parameters: + - name: id + in: path + required: true + description: ID of the parent + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.DocSearchResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + body: + anyOf: + - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' + - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' + - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' + required: + - body + /agents/{id}/tasks: + get: + operationId: TasksRoute_list + description: List tasks (paginated) + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Tasks.Task' + required: + - results + post: + operationId: TasksRoute_create + description: Create a new task + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/x-yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + application/json: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + /agents/{id}/tasks/{child_id}: + put: + operationId: TasksRoute_update + description: Update an existing task (overwrite existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be updated + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tasks.UpdateTaskRequest' + patch: + operationId: TasksRoute_patch + description: Update an existing task (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be patched + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tasks.PatchTaskRequest' + delete: + operationId: TasksRoute_delete + description: Delete a task by its id + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /agents/{id}/tools: + get: + operationId: AgentToolsRoute_list + description: List tools of the given agent + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Tools.Tool' + required: + - results + post: + operationId: AgentToolsRoute_create + description: Create a new tool for this agent + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Agents.CreateAgentRequest' + /agents/{id}/tools/{child_id}: + put: + operationId: AgentToolsRoute_update + description: Update an existing tool (overwrite existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be updated + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tools.UpdateToolRequest' + patch: + operationId: AgentToolsRoute_patch + description: Update an existing tool (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be patched + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Tools.PatchToolRequest' + delete: + operationId: AgentToolsRoute_delete + description: Delete an existing tool by id + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /agents/{parent_id}/tasks/{id}: + post: + operationId: TasksCreateOrUpdateRoute_createOrUpdate + description: Create or update a task + parameters: + - name: parent_id + in: path + required: true + description: ID of the agent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Tasks.CreateOrUpdateTaskRequest.id' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/x-yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + text/yaml: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + application/json: + schema: + $ref: '#/components/schemas/Tasks.CreateTaskRequest' + /docs/{id}: + get: + operationId: IndividualDocsRoute_get + description: Get Doc by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.Doc' + /embed: + post: + operationId: EmbedRoute_embed + description: Embed a query for search + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.EmbedQueryResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + body: + $ref: '#/components/schemas/Docs.EmbedQueryRequest' + required: + - body + /executions: + post: + operationId: ExecutionsRoute_resumeWithTaskToken + description: Resume an execution with a task token + parameters: + - name: task_token + in: query + required: true + description: A Task Token is a unique identifier for a specific Task Execution. + schema: + type: string + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.TaskTokenResumeExecutionRequest' + description: Request to resume an execution with a task token + security: + - {} + /executions/{id}: + get: + operationId: ExecutionsRoute_get + description: Get an Execution by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.Execution' + put: + operationId: ExecutionsRoute_update + description: Update an existing Execution + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.UpdateExecutionRequest' + /executions/{id}/transitions: + get: + operationId: ExecutionTransitionsRoute_list + description: List the Transitions of an Execution by id + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + type: object + properties: + transitions: + type: array + items: + $ref: '#/components/schemas/Executions.Transition' + required: + - transitions + required: + - results + /executions/{id}/transitions.stream: + get: + operationId: ExecutionTransitionsStreamRoute_stream + description: Stream events emitted by the given execution + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - name: next_token + in: query + required: true + description: Next page token + schema: + type: string + nullable: true + default: null + explode: false + responses: + '200': + description: The request has succeeded. + content: + text/event-stream: + schema: + $ref: '#/components/schemas/Executions.TransitionEvent' + /jobs/{id}: + get: + operationId: JobRoute_get + description: Get the status of an existing Job by its id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Jobs.JobStatus' + /sessions: + get: + operationId: SessionsRoute_list + description: List sessions (paginated) + parameters: + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Sessions.Session' + required: + - items + post: + operationId: SessionsRoute_create + description: Create a new session + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.CreateSessionRequest' + /sessions/{id}: + post: + operationId: SessionsRoute_createOrUpdate + description: Create or update a session + parameters: + - $ref: '#/components/parameters/Sessions.CreateOrUpdateSessionRequest.id' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.CreateSessionRequest' + put: + operationId: SessionsRoute_update + description: Update an existing session by its id (overwrites all existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.UpdateSessionRequest' + patch: + operationId: SessionsRoute_patch + description: Update an existing session by its id (merges with existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.PatchSessionRequest' + delete: + operationId: SessionsRoute_delete + description: Delete a session by its id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: SessionsRoute_get + description: Get a session by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions.Session' + /sessions/{id}/chat: + post: + operationId: ChatRoute_generate + description: Generate a response from the model + parameters: + - name: id + in: path + required: true + description: The session ID + schema: + $ref: '#/components/schemas/Common.uuid' + - name: x-custom-api-key + in: header + required: false + description: Custom API key + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/Chat.ChunkChatResponse' + - $ref: '#/components/schemas/Chat.MessageChatResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Chat.ChatInput' + description: Request to generate a response from the model + /sessions/{id}/history: + delete: + operationId: HistoryRoute_delete + description: Clear the history of a Session (resets the Session) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: HistoryRoute_history + description: Get history of a Session + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Entries.History' + /tasks/{id}/executions: + post: + operationId: TaskExecutionsRoute_create + description: Create an execution for the given task + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Executions.CreateExecutionRequest' + get: + operationId: TaskExecutionsRoute_list + description: List executions of the given task + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Executions.Execution' + required: + - results + /users: + get: + operationId: UsersRoute_list + description: List users (paginated) + parameters: + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Users.User' + required: + - items + post: + operationId: UsersRoute_create + description: Create a new user + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.CreateUserRequest' + /users/{id}: + post: + operationId: UsersRoute_createOrUpdate + description: Create or update a user + parameters: + - $ref: '#/components/parameters/Users.CreateOrUpdateUserRequest' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.CreateUserRequest' + put: + operationId: UsersRoute_update + description: Update an existing user by id (overwrite existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.UpdateUserRequest' + patch: + operationId: UsersRoute_patch + description: Update an existing user by id (merge with existing values) + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceUpdatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Users.PatchUserRequest' + delete: + operationId: UsersRoute_delete + description: Delete a user by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + get: + operationId: UsersRoute_get + description: Get a user by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Users.User' + /users/{id}/docs: + get: + operationId: UserDocsRoute_list + description: List Docs owned by a User + parameters: + - name: id + in: path + required: true + description: ID of parent + schema: + $ref: '#/components/schemas/Common.uuid' + - $ref: '#/components/parameters/Common.PaginationOptions.limit' + - $ref: '#/components/parameters/Common.PaginationOptions.offset' + - $ref: '#/components/parameters/Common.PaginationOptions.sort_by' + - $ref: '#/components/parameters/Common.PaginationOptions.direction' + - $ref: '#/components/parameters/Common.PaginationOptions.metadata_filter' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/Docs.Doc' + required: + - results + post: + operationId: UserDocsRoute_create + description: Create a Doc for this User + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceCreatedResponse' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.CreateDocRequest' + /users/{id}/docs/{child_id}: + delete: + operationId: UserDocsRoute_delete + description: Delete a Doc for this User + parameters: + - name: id + in: path + required: true + description: ID of parent resource + schema: + $ref: '#/components/schemas/Common.uuid' + - name: child_id + in: path + required: true + description: ID of the resource to be deleted + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '202': + description: The request has been accepted for processing, but processing has not yet completed. + content: + application/json: + schema: + $ref: '#/components/schemas/Common.ResourceDeletedResponse' + /users/{id}/search: + post: + operationId: UserDocsSearchRoute_search + description: Search Docs owned by a User + parameters: + - name: id + in: path + required: true + description: ID of the parent + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Docs.DocSearchResponse' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + body: + anyOf: + - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' + - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' + - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' + required: + - body +security: + - ApiKeyAuth: [] + - ApiKeyAuth_: [] +components: + parameters: + Agents.CreateOrUpdateAgentRequest.id: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + Common.PaginationOptions.direction: + name: direction + in: query + required: true + description: Sort direction + schema: + type: string + enum: + - asc + - desc + default: asc + explode: false + Common.PaginationOptions.limit: + name: limit + in: query + required: true + description: Limit the number of items returned + schema: + $ref: '#/components/schemas/Common.limit' + default: 100 + explode: false + Common.PaginationOptions.metadata_filter: + name: metadata_filter + in: query + required: true + description: JSON string of object that should be used to filter objects by metadata + schema: + type: string + default: '{}' + explode: false + Common.PaginationOptions.offset: + name: offset + in: query + required: true + description: Offset the items returned + schema: + $ref: '#/components/schemas/Common.offset' + default: 0 + explode: false + Common.PaginationOptions.sort_by: + name: sort_by + in: query + required: true + description: Sort by a field + schema: + type: string + enum: + - created_at + - updated_at + default: created_at + explode: false + Sessions.CreateOrUpdateSessionRequest.id: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + Tasks.CreateOrUpdateTaskRequest.id: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + Users.CreateOrUpdateUserRequest: + name: id + in: path + required: true + schema: + $ref: '#/components/schemas/Common.uuid' + schemas: + Agents.Agent: + type: object + required: + - id + - created_at + - updated_at + - name + - about + - model + - instructions + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + Agents.CreateAgentRequest: + type: object + required: + - name + - about + - model + - instructions + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + description: Payload for creating a agent (and associated documents) + Agents.CreateOrUpdateAgentRequest: + type: object + required: + - id + - name + - about + - model + - instructions + properties: + id: + $ref: '#/components/schemas/Common.uuid' + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + allOf: + - $ref: '#/components/schemas/Agents.CreateAgentRequest' + Agents.PatchAgentRequest: + type: object + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + description: Payload for patching a agent + Agents.UpdateAgentRequest: + type: object + required: + - name + - about + - model + - instructions + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the agent + default: '' + about: + type: string + description: About the agent + default: '' + model: + type: string + description: Model name to use (gpt-4-turbo, gemini-nano etc) + default: '' + instructions: + anyOf: + - type: string + - type: array + items: + type: string + description: Instructions for the agent + default: [] + default_settings: + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + description: Default settings for all sessions created by this agent + description: Payload for updating a agent + Chat.BaseChatOutput: + type: object + required: + - index + - finish_reason + properties: + index: + type: integer + format: uint32 + finish_reason: + allOf: + - $ref: '#/components/schemas/Chat.FinishReason' + description: The reason the model stopped generating tokens + default: stop + logprobs: + allOf: + - $ref: '#/components/schemas/Chat.LogProbResponse' + description: The log probabilities of tokens + Chat.BaseChatResponse: + type: object + required: + - jobs + - docs + - created_at + - id + properties: + usage: + allOf: + - $ref: '#/components/schemas/Chat.CompetionUsage' + description: Usage statistics for the completion request + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: Background job IDs that may have been spawned from this interaction. + default: [] + readOnly: true + docs: + type: array + items: + $ref: '#/components/schemas/Docs.DocReference' + description: Documents referenced for this request (for citation purposes). + default: [] + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + Chat.BaseTokenLogProb: + type: object + required: + - token + - logprob + properties: + token: + type: string + logprob: + type: number + format: float + description: The log probability of the token + bytes: + type: array + items: + type: integer + format: uint16 + Chat.ChatInput: + type: object + required: + - remember + - recall + - save + - stream + - stop + properties: + remember: + type: boolean + description: 'DISABLED: Whether this interaction should form new memories or not (will be enabled in a future release)' + default: false + readOnly: true + recall: + type: boolean + description: Whether previous memories and docs should be recalled or not + default: true + save: + type: boolean + description: Whether this interaction should be stored in the session history or not + default: true + model: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Identifier of the model to be used + stream: + type: boolean + description: Indicates if the server should stream the response as it's generated + default: false + stop: + type: array + items: + type: string + maxItems: 4 + description: Up to 4 sequences where the API will stop generating further tokens. + default: [] + seed: + type: integer + format: int16 + minimum: -1 + maximum: 1000 + description: If specified, the system will make a best effort to sample deterministically for that particular seed value + max_tokens: + type: integer + format: uint32 + minimum: 1 + description: The maximum number of tokens to generate in the chat completion + logit_bias: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.logit_bias' + description: Modify the likelihood of specified tokens appearing in the completion + response_format: + anyOf: + - $ref: '#/components/schemas/Chat.SimpleCompletionResponseFormat' + - $ref: '#/components/schemas/Chat.SchemaCompletionResponseFormat' + description: Response format (set to `json_object` to restrict output to JSON) + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of the agent to use for this interaction. (Only applicable for multi-agent sessions) + repetition_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + length_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. + min_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Minimum probability compared to leading token to be considered + frequency_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + presence_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + temperature: + type: number + format: float + minimum: 0 + maximum: 5 + description: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + top_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. + allOf: + - $ref: '#/components/schemas/Chat.ChatInputData' + Chat.ChatInputData: + type: object + required: + - messages + - tools + properties: + messages: + type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + minItems: 1 + description: A list of new input messages comprising the conversation so far. + tools: + type: array + items: + $ref: '#/components/schemas/Tools.Tool' + description: (Advanced) List of tools that are provided in addition to agent's default set of tools. + default: [] + tool_choice: + anyOf: + - type: string + enum: + - auto + - none + - $ref: '#/components/schemas/Tools.NamedToolChoice' + description: Can be one of existing tools given to the agent earlier or the ones provided in this request. + Chat.ChatOutputChunk: + type: object + required: + - delta + properties: + delta: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + description: The message generated by the model + allOf: + - $ref: '#/components/schemas/Chat.BaseChatOutput' + description: Streaming chat completion output + Chat.ChatSettings: + type: object + required: + - stream + - stop + properties: + model: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Identifier of the model to be used + stream: + type: boolean + description: Indicates if the server should stream the response as it's generated + default: false + stop: + type: array + items: + type: string + maxItems: 4 + description: Up to 4 sequences where the API will stop generating further tokens. + default: [] + seed: + type: integer + format: int16 + minimum: -1 + maximum: 1000 + description: If specified, the system will make a best effort to sample deterministically for that particular seed value + max_tokens: + type: integer + format: uint32 + minimum: 1 + description: The maximum number of tokens to generate in the chat completion + logit_bias: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.logit_bias' + description: Modify the likelihood of specified tokens appearing in the completion + response_format: + anyOf: + - $ref: '#/components/schemas/Chat.SimpleCompletionResponseFormat' + - $ref: '#/components/schemas/Chat.SchemaCompletionResponseFormat' + description: Response format (set to `json_object` to restrict output to JSON) + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of the agent to use for this interaction. (Only applicable for multi-agent sessions) + allOf: + - $ref: '#/components/schemas/Chat.DefaultChatSettings' + Chat.ChunkChatResponse: + type: object + required: + - choices + properties: + choices: + type: array + items: + $ref: '#/components/schemas/Chat.ChatOutputChunk' + description: The deltas generated by the model + allOf: + - $ref: '#/components/schemas/Chat.BaseChatResponse' + Chat.CompetionUsage: + type: object + properties: + completion_tokens: + type: integer + format: uint32 + description: Number of tokens in the generated completion + readOnly: true + prompt_tokens: + type: integer + format: uint32 + description: Number of tokens in the prompt + readOnly: true + total_tokens: + type: integer + format: uint32 + description: Total number of tokens used in the request (prompt + completion) + readOnly: true + description: Usage statistics for the completion request + Chat.DefaultChatSettings: + type: object + properties: + repetition_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + length_penalty: + type: number + format: float + minimum: 0 + maximum: 2 + description: Number between 0 and 2.0. 1.0 is neutral and values larger than that penalize number of tokens generated. + min_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Minimum probability compared to leading token to be considered + allOf: + - $ref: '#/components/schemas/Chat.OpenAISettings' + description: Default settings for the chat session (also used by the agent) + Chat.FinishReason: + type: string + enum: + - stop + - length + - content_filter + - tool_calls + description: |- + The reason the model stopped generating tokens. This will be `stop` + if the model hit a natural stop point or a provided stop sequence, + `length` if the maximum number of tokens specified in the request + was reached, `content_filter` if content was omitted due to a flag + from our content filters, `tool_calls` if the model called a tool. + Chat.LogProbResponse: + type: object + required: + - content + properties: + content: + type: array + items: + $ref: '#/components/schemas/Chat.TokenLogProb' + nullable: true + description: The log probabilities of the tokens + Chat.MessageChatResponse: + type: object + required: + - choices + properties: + choices: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Chat.SingleChatOutput' + - $ref: '#/components/schemas/Chat.MultipleChatOutput' + description: The deltas generated by the model + allOf: + - $ref: '#/components/schemas/Chat.BaseChatResponse' + Chat.MultipleChatOutput: + type: object + required: + - messages + properties: + messages: + type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + tool_calls: + type: array + items: + $ref: '#/components/schemas/Tools.ChosenToolCall' + nullable: true + description: Tool calls generated by the model. + default: [] + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + minItems: 1 + readOnly: true + allOf: + - $ref: '#/components/schemas/Chat.BaseChatOutput' + description: The output returned by the model. Note that, depending on the model provider, they might return more than one message. + Chat.OpenAISettings: + type: object + properties: + frequency_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + presence_penalty: + type: number + format: float + minimum: -2 + maximum: 2 + description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + temperature: + type: number + format: float + minimum: 0 + maximum: 5 + description: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + top_p: + type: number + format: float + minimum: 0 + maximum: 1 + description: Defaults to 1 An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. + Chat.SchemaCompletionResponseFormat: + type: object + required: + - type + - json_schema + properties: + type: + type: string + enum: + - json_schema + description: The format of the response + default: json_schema + json_schema: + type: object + additionalProperties: {} + description: The schema of the response + Chat.SimpleCompletionResponseFormat: + type: object + required: + - type + properties: + type: + type: string + enum: + - text + - json_object + description: The format of the response + default: text + Chat.SingleChatOutput: + type: object + required: + - message + properties: + message: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + tool_calls: + type: array + items: + $ref: '#/components/schemas/Tools.ChosenToolCall' + nullable: true + description: Tool calls generated by the model. + default: [] + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + allOf: + - $ref: '#/components/schemas/Chat.BaseChatOutput' + description: The output returned by the model. Note that, depending on the model provider, they might return more than one message. + Chat.TokenLogProb: + type: object + required: + - top_logprobs + properties: + top_logprobs: + type: array + items: + $ref: '#/components/schemas/Chat.BaseTokenLogProb' + minItems: 1 + description: The log probabilities of the tokens + readOnly: true + allOf: + - $ref: '#/components/schemas/Chat.BaseTokenLogProb' + Common.JinjaTemplate: + type: string + description: A valid jinja template. + Common.PyExpression: + type: string + description: A simple python expression compatible with SimpleEval. + Common.ResourceCreatedResponse: + type: object + required: + - id + - created_at + - jobs + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: ID of created resource + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: IDs (if any) of jobs created as part of this request + default: [] + readOnly: true + Common.ResourceDeletedResponse: + type: object + required: + - id + - deleted_at + - jobs + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: ID of deleted resource + deleted_at: + type: string + format: date-time + description: When this resource was deleted as UTC date-time + readOnly: true + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: IDs (if any) of jobs created as part of this request + default: [] + readOnly: true + Common.ResourceUpdatedResponse: + type: object + required: + - id + - updated_at + - jobs + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: ID of updated resource + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + jobs: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + description: IDs (if any) of jobs created as part of this request + default: [] + readOnly: true + Common.identifierSafeUnicode: + type: string + maxLength: 120 + pattern: ^[\p{L}\p{Nl}\p{Pattern_Syntax}\p{Pattern_White_Space}]+[\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{Pattern_Syntax}\p{Pattern_White_Space}]*$ + description: |- + For Unicode character safety + See: https://unicode.org/reports/tr31/ + See: https://www.unicode.org/reports/tr39/#Identifier_Characters + Common.limit: + type: integer + format: uint16 + minimum: 1 + maximum: 1000 + exclusiveMaximum: true + description: Limit the number of results + Common.logit_bias: + type: number + format: float + minimum: -100 + maximum: 100 + Common.offset: + type: integer + format: uint32 + minimum: 0 + description: Offset to apply to the results + Common.uuid: + type: string + format: uuid + Common.validPythonIdentifier: + type: string + maxLength: 40 + pattern: ^[^\W0-9]\w*$ + description: Valid python identifier names + Docs.BaseDocSearchRequest: + type: object + required: + - limit + - lang + properties: + limit: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + default: 10 + lang: + type: string + enum: + - en-US + description: The language to be used for text-only search. Support for other languages coming soon. + default: en-US + Docs.CreateDocRequest: + type: object + required: + - title + - content + properties: + metadata: + type: object + additionalProperties: {} + title: + type: string + maxLength: 800 + description: Title describing what this document contains + content: + anyOf: + - type: string + - type: array + items: + type: string + description: Contents of the document + description: Payload for creating a doc + Docs.Doc: + type: object + required: + - id + - created_at + - title + - content + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + title: + type: string + maxLength: 800 + description: Title describing what this document contains + content: + anyOf: + - type: string + - type: array + items: + type: string + description: Contents of the document + embeddings: + anyOf: + - type: array + items: + type: number + format: float + - type: array + items: + type: array + items: + type: number + format: float + description: Embeddings for the document + readOnly: true + Docs.DocOwner: + type: object + required: + - id + - role + properties: + id: + anyOf: + - allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + - allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + role: + type: string + enum: + - user + - agent + Docs.DocReference: + type: object + required: + - owner + - id + - snippets + - distance + properties: + owner: + allOf: + - $ref: '#/components/schemas/Docs.DocOwner' + description: The owner of this document. + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + description: ID of the document + title: + type: string + snippets: + type: array + items: + $ref: '#/components/schemas/Docs.Snippet' + minItems: 1 + distance: + type: number + nullable: true + default: null + Docs.DocSearchResponse: + type: object + required: + - docs + - time + properties: + docs: + type: array + items: + $ref: '#/components/schemas/Docs.DocReference' + description: The documents that were found + time: + type: number + minimum: 0 + exclusiveMinimum: true + description: The time taken to search in seconds + Docs.EmbedQueryRequest: + type: object + required: + - text + properties: + text: + anyOf: + - type: string + - type: array + items: + type: string + description: Text or texts to embed + Docs.EmbedQueryResponse: + type: object + required: + - vectors + properties: + vectors: + type: array + items: + type: array + items: + type: number + description: The embedded vectors + Docs.HybridDocSearchRequest: + type: object + required: + - confidence + - alpha + - text + - vector + properties: + confidence: + type: number + minimum: 0 + maximum: 1 + description: The confidence cutoff level + default: 0.5 + alpha: + type: number + minimum: 0 + maximum: 1 + description: The weight to apply to BM25 vs Vector search results. 0 => pure BM25; 1 => pure vector; + default: 0.75 + text: + type: string + description: Text to use in the search. In `hybrid` search mode, either `text` or both `text` and `vector` fields are required. + vector: + type: array + items: + type: number + description: Vector to use in the search. Must be the same dimensions as the embedding model or else an error will be thrown. + allOf: + - $ref: '#/components/schemas/Docs.BaseDocSearchRequest' + Docs.Snippet: + type: object + required: + - index + - content + properties: + index: + type: integer + format: uint16 + content: + type: string + Docs.TextOnlyDocSearchRequest: + type: object + required: + - text + properties: + text: + type: string + description: Text to use in the search. + allOf: + - $ref: '#/components/schemas/Docs.BaseDocSearchRequest' + Docs.VectorDocSearchRequest: + type: object + required: + - confidence + - vector + properties: + confidence: + type: number + minimum: 0 + maximum: 1 + description: The confidence cutoff level + default: 0.5 + vector: + type: array + items: + type: number + description: Vector to use in the search. Must be the same dimensions as the embedding model or else an error will be thrown. + allOf: + - $ref: '#/components/schemas/Docs.BaseDocSearchRequest' + Entries.BaseEntry: + type: object + required: + - role + - name + - content + - source + - tokenizer + - token_count + - timestamp + properties: + role: + $ref: '#/components/schemas/Entries.ChatMLRole' + name: + type: string + nullable: true + default: null + content: + anyOf: + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + - $ref: '#/components/schemas/Tools.Tool' + - $ref: '#/components/schemas/Tools.ChosenToolCall' + - type: string + - $ref: '#/components/schemas/Tools.ToolResponse' + - type: array + items: + anyOf: + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + type: string + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + - $ref: '#/components/schemas/Tools.Tool' + - $ref: '#/components/schemas/Tools.ChosenToolCall' + - type: string + - $ref: '#/components/schemas/Tools.ToolResponse' + source: + type: string + enum: + - api_request + - api_response + - tool_response + - internal + - summarizer + - meta + tokenizer: + type: string + token_count: + type: integer + format: uint16 + timestamp: + type: number + minimum: 0 + description: This is the time that this event refers to. + Entries.ChatMLRole: + type: string + enum: + - user + - assistant + - system + - function + - function_response + - function_call + - auto + description: ChatML role (system|assistant|user|function_call|function|function_response|auto) + Entries.Entry: + type: object + required: + - created_at + - id + properties: + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + allOf: + - $ref: '#/components/schemas/Entries.BaseEntry' + Entries.History: + type: object + required: + - entries + - relations + - session_id + - created_at + properties: + entries: + type: array + items: + $ref: '#/components/schemas/Entries.Entry' + relations: + type: array + items: + $ref: '#/components/schemas/Entries.Relation' + session_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + Entries.ImageDetail: + type: string + enum: + - low + - high + - auto + description: Image detail level + Entries.Relation: + type: object + required: + - head + - relation + - tail + properties: + head: + $ref: '#/components/schemas/Common.uuid' + relation: + type: string + tail: + $ref: '#/components/schemas/Common.uuid' + Executions.CreateExecutionRequest: + type: object + required: + - input + properties: + input: + type: object + additionalProperties: {} + description: The input to the execution + output: + description: The output of the execution if it succeeded + error: + type: string + description: The error of the execution if it failed + metadata: + type: object + additionalProperties: {} + description: Payload for creating an execution + Executions.Execution: + type: object + required: + - task_id + - status + - input + - created_at + - updated_at + - id + properties: + task_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + description: The ID of the task that the execution is running + status: + type: string + enum: + - queued + - starting + - running + - awaiting_input + - succeeded + - failed + - cancelled + description: The status of the execution + readOnly: true + input: + type: object + additionalProperties: {} + description: The input to the execution + output: + description: The output of the execution if it succeeded + error: + type: string + description: The error of the execution if it failed + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + metadata: + type: object + additionalProperties: {} + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + Executions.ResumeExecutionRequest: + type: object + required: + - status + properties: + status: + type: string + enum: + - running + default: running + input: + type: object + additionalProperties: {} + description: The input to resume the execution with + allOf: + - $ref: '#/components/schemas/Executions.UpdateExecutionRequest' + Executions.StopExecutionRequest: + type: object + required: + - status + - reason + properties: + status: + type: string + enum: + - cancelled + default: cancelled + reason: + type: string + nullable: true + description: The reason for stopping the execution + default: null + allOf: + - $ref: '#/components/schemas/Executions.UpdateExecutionRequest' + Executions.TaskTokenResumeExecutionRequest: + type: object + required: + - status + properties: + status: + type: string + enum: + - running + default: running + input: + type: object + additionalProperties: {} + description: The input to resume the execution with + Executions.Transition: + type: object + required: + - execution_id + - current + - next + - id + properties: + execution_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + current: + allOf: + - $ref: '#/components/schemas/Executions.TransitionTarget' + readOnly: true + next: + type: object + allOf: + - $ref: '#/components/schemas/Executions.TransitionTarget' + nullable: true + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + allOf: + - $ref: '#/components/schemas/Executions.TransitionEvent' + Executions.TransitionEvent: + type: object + required: + - type + - output + - created_at + - updated_at + properties: + type: + type: string + enum: + - init + - init_branch + - finish + - finish_branch + - wait + - resume + - error + - step + - cancelled + readOnly: true + output: + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + Executions.TransitionTarget: + type: object + required: + - workflow + - step + properties: + workflow: + $ref: '#/components/schemas/Common.identifierSafeUnicode' + step: + type: integer + format: uint16 + Executions.UpdateExecutionRequest: + type: object + required: + - status + properties: + status: + type: string + enum: + - queued + - starting + - running + - awaiting_input + - succeeded + - failed + - cancelled + discriminator: + propertyName: status + mapping: + cancelled: '#/components/schemas/Executions.StopExecutionRequest' + running: '#/components/schemas/Executions.ResumeExecutionRequest' + Jobs.JobState: + type: string + enum: + - pending + - in_progress + - retrying + - succeeded + - aborted + - failed + - unknown + description: 'Current state (one of: pending, in_progress, retrying, succeeded, aborted, failed)' + Jobs.JobStatus: + type: object + required: + - id + - created_at + - updated_at + - name + - reason + - has_progress + - progress + - state + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the job + default: '' + reason: + type: string + description: Reason for the current state of the job + default: '' + has_progress: + type: boolean + description: Whether this Job supports progress updates + default: false + progress: + type: number + format: float + minimum: 0 + maximum: 100 + description: Progress percentage + default: 0 + state: + allOf: + - $ref: '#/components/schemas/Jobs.JobState' + description: Current state of the job + default: pending + Sessions.ContextOverflowType: + type: string + enum: + - truncate + - adaptive + Sessions.CreateOrUpdateSessionRequest: + type: object + required: + - id + - situation + - render_templates + - token_budget + - context_overflow + - forward_tool_results + properties: + id: + $ref: '#/components/schemas/Common.uuid' + user: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: User ID of user associated with this session + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of agent associated with this session + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + allOf: + - $ref: '#/components/schemas/Sessions.CreateSessionRequest' + Sessions.CreateSessionRequest: + type: object + required: + - situation + - render_templates + - token_budget + - context_overflow + - forward_tool_results + properties: + user: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: User ID of user associated with this session + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + agent: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Agent ID of agent associated with this session + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + description: Payload for creating a session + Sessions.MultiAgentMultiUserSession: + type: object + required: + - agents + - users + properties: + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.MultiAgentNoUserSession: + type: object + required: + - agents + properties: + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.MultiAgentSingleUserSession: + type: object + required: + - agents + - user + properties: + agents: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + user: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.PatchSessionRequest: + type: object + properties: + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + description: Payload for patching a session + Sessions.Session: + type: object + required: + - situation + - summary + - render_templates + - token_budget + - context_overflow + - forward_tool_results + - id + - created_at + - updated_at + properties: + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + summary: + type: string + nullable: true + description: Summary (null at the beginning) - generated automatically after every interaction + default: null + readOnly: true + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + kind: + type: string + description: Discriminator property for Session. + discriminator: + propertyName: kind + mapping: + single_agent_no_user: '#/components/schemas/Sessions.SingleAgentNoUserSession' + single_agent_single_user: '#/components/schemas/Sessions.SingleAgentSingleUserSession' + single_agent_multi_user: '#/components/schemas/Sessions.SingleAgentMultiUserSession' + multi_agent_no_user: '#/components/schemas/Sessions.MultiAgentNoUserSession' + multi_agent_single_user: '#/components/schemas/Sessions.MultiAgentSingleUserSession' + multi_agent_multi_user: '#/components/schemas/Sessions.MultiAgentMultiUserSession' + Sessions.SingleAgentMultiUserSession: + type: object + required: + - agent + - users + properties: + agent: + $ref: '#/components/schemas/Common.uuid' + users: + type: array + items: + $ref: '#/components/schemas/Common.uuid' + minItems: 2 + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.SingleAgentNoUserSession: + type: object + required: + - agent + properties: + agent: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.SingleAgentSingleUserSession: + type: object + required: + - agent + - user + properties: + agent: + $ref: '#/components/schemas/Common.uuid' + user: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Sessions.Session' + Sessions.UpdateSessionRequest: + type: object + required: + - situation + - render_templates + - token_budget + - context_overflow + - forward_tool_results + properties: + situation: + type: string + description: A specific situation that sets the background for this session + default: |- + {%- if agent.name -%} + You are {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if agent.about -%} + About you: {{agent.name}}.{{" "}} + {%- endif -%} + + {%- if user -%} + You are talking to a user + {%- if user.name -%}{{" "}} and their name is {{user.name}} + {%- if user.about -%}. About the user: {{user.about}}.{%- else -%}.{%- endif -%} + {%- endif -%} + {%- endif -%} + + {{" + + "}} + + {%- if agent.instructions -%} + Instructions:{{" + "}} + {%- if agent.instructions is string -%} + {{agent.instructions}}{{" + "}} + {%- else -%} + {%- for instruction in agent.instructions -%} + - {{instruction}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{" + "}} + {%- endif -%} + + {%- if tools -%} + Tools:{{" + "}} + {%- for tool in tools -%} + {%- if tool.type == "function" -%} + - {{tool.function.name}} + {%- if tool.function.description -%}: {{tool.function.description}}{%- endif -%}{{" + "}} + {%- else -%} + - {{ 0/0 }} {# Error: Other tool types aren't supported yet. #} + {%- endif -%} + {%- endfor -%} + {{" + + "}} + {%- endif -%} + + {%- if docs -%} + Relevant documents:{{" + "}} + {%- for doc in docs -%} + {{doc.title}}{{" + "}} + {%- if doc.content is string -%} + {{doc.content}}{{" + "}} + {%- else -%} + {%- for snippet in doc.content -%} + {{snippet}}{{" + "}} + {%- endfor -%} + {%- endif -%} + {{"---"}} + {%- endfor -%} + {%- endif -%} + render_templates: + type: boolean + description: Render system and assistant message content as jinja templates + default: true + token_budget: + type: integer + format: uint16 + nullable: true + description: Threshold value for the adaptive context functionality + default: null + context_overflow: + oneOf: + - $ref: '#/components/schemas/Sessions.ContextOverflowType' + nullable: true + description: Action to start on context window overflow + default: null + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be sent back to the model as the model's input. + If a tool call is not made, the model's output will be returned as is. + default: null + metadata: + type: object + additionalProperties: {} + description: Payload for updating a session + Tasks.CaseThen: + type: object + required: + - case + - then + properties: + case: + anyOf: + - $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + Tasks.CaseThenUpdateItem: + type: object + required: + - case + - then + properties: + case: + anyOf: + - $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + Tasks.CreateTaskRequest: + type: object + required: + - name + - description + - main + - input_schema + - tools + - inherit_tools + properties: + name: + type: string + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + description: Payload for creating a task + Tasks.EmbedStep: + type: object + required: + - kind_ + - embed + properties: + kind_: + type: string + enum: + - embed + default: embed + readOnly: true + embed: + allOf: + - $ref: '#/components/schemas/Docs.EmbedQueryRequest' + description: The text to embed + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - embed + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ErrorWorkflowStep: + type: object + required: + - kind_ + - error + properties: + kind_: + type: string + enum: + - error + default: error + readOnly: true + error: + type: string + description: The error message + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - error + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.EvaluateStep: + type: object + required: + - kind_ + - evaluate + properties: + kind_: + type: string + enum: + - evaluate + default: evaluate + readOnly: true + evaluate: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: The expression to evaluate + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - evaluate + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ForeachDo: + type: object + required: + - in + - do + properties: + in: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The variable to iterate over. + VALIDATION: Should NOT return more than 1000 elements. + do: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + Tasks.ForeachDoUpdateItem: + type: object + required: + - in + - do + properties: + in: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The variable to iterate over. + VALIDATION: Should NOT return more than 1000 elements. + do: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + Tasks.ForeachStep: + type: object + required: + - kind_ + - foreach + properties: + kind_: + type: string + enum: + - foreach + default: foreach + readOnly: true + foreach: + allOf: + - $ref: '#/components/schemas/Tasks.ForeachDo' + description: The steps to run for each iteration + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - foreach + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ForeachStepUpdateItem: + type: object + required: + - foreach + properties: + foreach: + allOf: + - $ref: '#/components/schemas/Tasks.ForeachDoUpdateItem' + description: The steps to run for each iteration + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.GetStep: + type: object + required: + - kind_ + - get + properties: + kind_: + type: string + enum: + - get + default: get + readOnly: true + get: + type: string + description: The key to get + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - get + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.IfElseWorkflowStep: + type: object + required: + - kind_ + - if + - then + - else + properties: + kind_: + type: string + enum: + - if_else + default: if_else + readOnly: true + if: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + else: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + nullable: true + description: The steps to run if the condition is false + default: null + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - if_else + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.IfElseWorkflowStepUpdateItem: + type: object + required: + - if + - then + - else + properties: + if: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The condition to evaluate + then: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + description: The steps to run if the condition is true + else: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + nullable: true + description: The steps to run if the condition is false + default: null + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.LogStep: + type: object + required: + - kind_ + - log + properties: + kind_: + type: string + enum: + - log + default: log + readOnly: true + log: + allOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + description: The value to log + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - log + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ParallelStep: + type: object + required: + - kind_ + - parallel + properties: + kind_: + type: string + enum: + - parallel + default: parallel + readOnly: true + parallel: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + maxItems: 100 + description: The steps to run in parallel. Max concurrency will depend on the platform. + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - parallel + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ParallelStepUpdateItem: + type: object + required: + - parallel + properties: + parallel: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + maxItems: 100 + description: The steps to run in parallel. Max concurrency will depend on the platform. + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.PatchTaskRequest: + type: object + properties: + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' + - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ForeachStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ParallelStepUpdateItem' + - type: object + required: + - over + - map + properties: + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' + - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ForeachStepUpdateItem' + - $ref: '#/components/schemas/Tasks.ParallelStepUpdateItem' + - type: object + required: + - over + - map + properties: + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + description: Payload for patching a task + Tasks.PromptStep: + type: object + required: + - kind_ + - prompt + - tools + - forward_tool_results + properties: + kind_: + type: string + enum: + - prompt + default: prompt + readOnly: true + prompt: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + $ref: '#/components/schemas/Common.JinjaTemplate' + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + description: The prompt to run + tools: + anyOf: + - type: string + enum: + - all + - type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.ToolRef' + - $ref: '#/components/schemas/Tools.CreateToolRequest' + description: The tools to use for the prompt + default: [] + tool_choice: + anyOf: + - type: string + enum: + - auto + - none + - $ref: '#/components/schemas/Tools.NamedToolChoice' + description: The tool choice for the prompt + settings: + allOf: + - $ref: '#/components/schemas/Chat.ChatSettings' + description: Settings for the prompt + unwrap: + type: boolean + description: Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` + default: false + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be used as the model's input. + If a tool call is not made, the model's output will be used as the next step's input. + default: null + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - prompt + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.PromptStepUpdateItem: + type: object + required: + - prompt + - tools + - forward_tool_results + properties: + prompt: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + type: object + required: + - role + - content + properties: + role: + allOf: + - $ref: '#/components/schemas/Entries.ChatMLRole' + description: The role of the message + content: + anyOf: + - $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + $ref: '#/components/schemas/Common.JinjaTemplate' + - type: array + items: + anyOf: + - type: object + required: + - text + - type + properties: + text: + $ref: '#/components/schemas/Common.JinjaTemplate' + type: + type: string + enum: + - text + description: The type (fixed to 'text') + default: text + - type: object + required: + - image_url + - type + properties: + image_url: + type: object + required: + - url + - detail + properties: + url: + type: string + description: Image URL or base64 data url (e.g. `data:image/jpeg;base64,`) + detail: + allOf: + - $ref: '#/components/schemas/Entries.ImageDetail' + description: The detail level of the image + default: auto + description: The image URL + type: + type: string + enum: + - image_url + description: The type (fixed to 'image_url') + default: image_url + description: The content parts of the message + name: + type: string + description: Name + continue: + type: boolean + description: Whether to continue this message or return a new one + description: The prompt to run + tools: + anyOf: + - type: string + enum: + - all + - type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.ToolRefUpdateItem' + - $ref: '#/components/schemas/Tools.CreateToolRequest' + description: The tools to use for the prompt + default: [] + tool_choice: + anyOf: + - type: string + enum: + - auto + - none + - $ref: '#/components/schemas/Tools.NamedToolChoice' + description: The tool choice for the prompt + settings: + allOf: + - $ref: '#/components/schemas/Chat.ChatSettings' + description: Settings for the prompt + unwrap: + type: boolean + description: Whether to unwrap the output of the prompt step, equivalent to `response.choices[0].message.content` + default: false + forward_tool_results: + type: boolean + nullable: true + description: |- + Whether to forward the tool results to the model when available. + "true" => always forward + "false" => never forward + null => forward if applicable (default) + + If a tool call is made, the tool's output will be used as the model's input. + If a tool call is not made, the model's output will be used as the next step's input. + default: null + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ReturnStep: + type: object + required: + - kind_ + - return + properties: + kind_: + type: string + enum: + - return + default: return + readOnly: true + return: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: The value to return + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - return + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SearchStep: + type: object + required: + - kind_ + - search + properties: + kind_: + type: string + enum: + - search + default: search + readOnly: true + search: + anyOf: + - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' + - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' + - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' + description: The search query + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - search + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SetStep: + type: object + required: + - kind_ + - set + properties: + kind_: + type: string + enum: + - set + default: set + readOnly: true + set: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: The value to set + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - set + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SleepFor: + type: object + required: + - seconds + - minutes + - hours + - days + properties: + seconds: + type: integer + format: uint16 + minimum: 0 + maximum: 60 + description: The number of seconds to sleep for + default: 0 + minutes: + type: integer + format: uint16 + minimum: 0 + maximum: 60 + description: The number of minutes to sleep for + default: 0 + hours: + type: integer + format: uint16 + minimum: 0 + maximum: 24 + description: The number of hours to sleep for + default: 0 + days: + type: integer + format: uint16 + minimum: 0 + maximum: 30 + description: The number of days to sleep for + default: 0 + Tasks.SleepStep: + type: object + required: + - kind_ + - sleep + properties: + kind_: + type: string + enum: + - sleep + default: sleep + readOnly: true + sleep: + allOf: + - $ref: '#/components/schemas/Tasks.SleepFor' + description: The duration to sleep for (max 31 days) + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - sleep + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SwitchStep: + type: object + required: + - kind_ + - switch + properties: + kind_: + type: string + enum: + - switch + default: switch + readOnly: true + switch: + type: array + items: + $ref: '#/components/schemas/Tasks.CaseThen' + minItems: 1 + description: The cond tree + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - switch + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.SwitchStepUpdateItem: + type: object + required: + - switch + properties: + switch: + type: array + items: + $ref: '#/components/schemas/Tasks.CaseThenUpdateItem' + minItems: 1 + description: The cond tree + allOf: + - type: object + properties: + kind_: + type: string + description: Discriminator property for BaseWorkflowStep. + discriminator: + propertyName: kind_ + mapping: {} + Tasks.Task: + type: object + required: + - name + - description + - main + - input_schema + - tools + - inherit_tools + - id + - created_at + - updated_at + properties: + name: + type: string + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + description: Object describing a Task + Tasks.TaskTool: + type: object + properties: + inherited: + type: boolean + description: 'Read-only: Whether the tool was inherited or not. Only applies within tasks.' + default: false + readOnly: true + allOf: + - $ref: '#/components/schemas/Tools.CreateToolRequest' + Tasks.ToolCallStep: + type: object + required: + - kind_ + - tool + - arguments + properties: + kind_: + type: string + enum: + - tool_call + default: tool_call + readOnly: true + tool: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: The tool to run + arguments: + anyOf: + - type: object + additionalProperties: + anyOf: + - $ref: '#/components/schemas/Common.PyExpression' + - type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The input parameters for the tool (defaults to last step output) + default: _ + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - tool_call + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.ToolRef: + type: object + required: + - ref + properties: + ref: + anyOf: + - $ref: '#/components/schemas/Tasks.ToolRefById' + - $ref: '#/components/schemas/Tasks.ToolRefByName' + description: Reference to a tool + Tasks.ToolRefById: + type: object + properties: + id: + $ref: '#/components/schemas/Common.uuid' + description: Reference to a tool by id + Tasks.ToolRefByName: + type: object + properties: + name: + $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Reference to a tool by name + Tasks.ToolRefUpdateItem: + type: object + description: Reference to a tool + Tasks.UpdateTaskRequest: + type: object + required: + - description + - main + - input_schema + - tools + - inherit_tools + properties: + description: + type: string + default: '' + main: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + minItems: 1 + description: The entrypoint of the task. + input_schema: + type: object + additionalProperties: {} + nullable: true + description: The schema for the input to the task. `null` means all inputs are valid. + default: null + tools: + type: array + items: + $ref: '#/components/schemas/Tasks.TaskTool' + description: Tools defined specifically for this task not included in the Agent itself. + default: [] + inherit_tools: + type: boolean + description: Whether to inherit tools from the parent agent or not. Defaults to true. + default: true + metadata: + type: object + additionalProperties: {} + additionalProperties: + type: array + items: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.ReturnStep' + - $ref: '#/components/schemas/Tasks.SleepStep' + - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + - $ref: '#/components/schemas/Tasks.WaitForInputStep' + - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' + - $ref: '#/components/schemas/Tasks.SwitchStep' + - $ref: '#/components/schemas/Tasks.ForeachStep' + - $ref: '#/components/schemas/Tasks.ParallelStep' + - type: object + required: + - kind_ + - over + - map + properties: + kind_: + type: string + enum: + - map_reduce + default: map_reduce + readOnly: true + over: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: The variable to iterate over + map: + anyOf: + - $ref: '#/components/schemas/Tasks.EvaluateStep' + - $ref: '#/components/schemas/Tasks.ToolCallStep' + - $ref: '#/components/schemas/Tasks.PromptStep' + - $ref: '#/components/schemas/Tasks.GetStep' + - $ref: '#/components/schemas/Tasks.SetStep' + - $ref: '#/components/schemas/Tasks.LogStep' + - $ref: '#/components/schemas/Tasks.EmbedStep' + - $ref: '#/components/schemas/Tasks.SearchStep' + - $ref: '#/components/schemas/Tasks.YieldStep' + description: The steps to run for each iteration + reduce: + allOf: + - $ref: '#/components/schemas/Common.PyExpression' + description: |- + The expression to reduce the results. + If not provided, the results are collected and returned as a list. + A special parameter named `results` is the accumulator and `_` is the current value. + initial: + description: The initial value of the reduce expression + default: [] + parallelism: + type: integer + format: uint16 + minimum: 1 + maximum: 100 + description: Whether to run the reduce expression in parallel and how many items to run in each batch + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - map_reduce + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + description: Payload for updating a task + Tasks.WaitForInputInfo: + type: object + required: + - info + properties: + info: + type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + description: Any additional info or data + Tasks.WaitForInputStep: + type: object + required: + - kind_ + - wait_for_input + properties: + kind_: + type: string + enum: + - wait_for_input + default: wait_for_input + readOnly: true + wait_for_input: + allOf: + - $ref: '#/components/schemas/Tasks.WaitForInputInfo' + description: Any additional info or data + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - wait_for_input + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tasks.YieldStep: + type: object + required: + - kind_ + - workflow + - arguments + properties: + kind_: + type: string + enum: + - yield + default: yield + readOnly: true + workflow: + type: string + description: |- + The subworkflow to run. + VALIDATION: Should resolve to a defined subworkflow. + arguments: + anyOf: + - type: object + additionalProperties: + $ref: '#/components/schemas/Common.PyExpression' + - type: string + enum: + - _ + description: The input parameters for the subworkflow (defaults to last step output) + default: _ + allOf: + - type: object + required: + - kind_ + properties: + kind_: + type: string + enum: + - yield + description: The kind of step + readOnly: true + discriminator: + propertyName: kind_ + mapping: {} + Tools.ApiCallDef: + type: object + required: + - method + - url + properties: + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + - HEAD + - OPTIONS + - CONNECT + - TRACE + description: The HTTP method to use + url: + type: string + format: uri + description: The URL to call + headers: + type: object + additionalProperties: + type: string + description: The headers to send with the request + content: + type: string + description: The content as base64 to send with the request + data: + type: object + additionalProperties: {} + description: The data to send as form data + json: + type: object + additionalProperties: {} + description: JSON body to send with the request + cookies: + type: object + additionalProperties: + type: string + description: Cookies + params: + anyOf: + - type: string + - type: object + additionalProperties: {} + description: The parameters to send with the request + follow_redirects: + type: boolean + description: Follow redirects + timeout: + type: integer + format: uint8 + description: The timeout for the request + description: API call definition + Tools.ApiCallDefUpdate: + type: object + properties: + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + - HEAD + - OPTIONS + - CONNECT + - TRACE + description: The HTTP method to use + url: + type: string + format: uri + description: The URL to call + headers: + type: object + additionalProperties: + type: string + description: The headers to send with the request + content: + type: string + description: The content as base64 to send with the request + data: + type: object + additionalProperties: {} + description: The data to send as form data + json: + type: object + additionalProperties: {} + description: JSON body to send with the request + cookies: + type: object + additionalProperties: + type: string + description: Cookies + params: + anyOf: + - type: string + - type: object + additionalProperties: {} + description: The parameters to send with the request + follow_redirects: + type: boolean + description: Follow redirects + timeout: + type: integer + format: uint8 + description: The timeout for the request + description: API call definition + Tools.ChosenFunctionCall: + type: object + required: + - type + - function + properties: + type: + type: string + enum: + - function + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionCallOption' + description: The function to call + allOf: + - $ref: '#/components/schemas/Tools.ChosenToolCall' + Tools.ChosenToolCall: + type: object + required: + - type + - id + properties: + type: + allOf: + - $ref: '#/components/schemas/Tools.ToolType' + description: Whether this tool is a `function`, `api_call`, `system` etc. (Only `function` tool supported right now) + function: + $ref: '#/components/schemas/Tools.FunctionCallOption' + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + discriminator: + propertyName: type + mapping: + function: '#/components/schemas/Tools.ChosenFunctionCall' + description: The response tool value generated by the model + Tools.CreateToolRequest: + type: object + required: + - name + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDef' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDef' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDef' + description: The API call to make + description: Payload for creating a tool + Tools.FunctionCallOption: + type: object + required: + - name + properties: + name: + type: string + description: The name of the function + Tools.FunctionDef: + type: object + properties: + name: + nullable: true + description: 'DO NOT USE: This will be overriden by the tool name. Here only for compatibility reasons.' + default: null + description: + nullable: true + description: 'DO NOT USE: This will be overriden by the tool description. Here only for compatibility reasons.' + default: null + parameters: + type: object + additionalProperties: {} + description: The parameters the function accepts + description: Function definition + Tools.IntegrationDef: + type: object + required: + - provider + properties: + provider: + anyOf: + - type: string + enum: + - dummy + - hacker_news + - weather + - wikipedia + - spider + - brave + - browserbase + - type: string + description: The provider of the integration + method: + type: string + description: The specific method of the integration to call + setup: + type: object + additionalProperties: {} + description: The setup parameters the integration accepts + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the integration call + description: Integration definition + Tools.IntegrationDefUpdate: + type: object + properties: + provider: + anyOf: + - type: string + enum: + - dummy + - hacker_news + - weather + - wikipedia + - spider + - brave + - browserbase + - type: string + description: The provider of the integration + method: + type: string + description: The specific method of the integration to call + setup: + type: object + additionalProperties: {} + description: The setup parameters the integration accepts + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the integration call + description: Integration definition + Tools.NamedToolChoice: + type: object + properties: + function: + $ref: '#/components/schemas/Tools.FunctionCallOption' + Tools.PatchToolRequest: + type: object + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDefUpdate' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDefUpdate' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDefUpdate' + description: The API call to make + description: Payload for patching a tool + Tools.SystemDef: + type: object + required: + - resource + - operation + properties: + resource: + type: string + enum: + - agent + - user + - task + - execution + - doc + - session + - job + description: Resource is the name of the resource to use + operation: + type: string + enum: + - create + - update + - patch + - create_or_update + - embed + - change_status + - search + - chat + - history + - delete + - get + - list + description: Operation is the name of the operation to perform + resource_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Resource id (if applicable) + subresource: + type: string + enum: + - tool + - doc + - execution + - transition + description: Sub-resource type (if applicable) + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the system call + description: System definition + Tools.SystemDefUpdate: + type: object + properties: + resource: + type: string + enum: + - agent + - user + - task + - execution + - doc + - session + - job + description: Resource is the name of the resource to use + operation: + type: string + enum: + - create + - update + - patch + - create_or_update + - embed + - change_status + - search + - chat + - history + - delete + - get + - list + description: Operation is the name of the operation to perform + resource_id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + description: Resource id (if applicable) + subresource: + type: string + enum: + - tool + - doc + - execution + - transition + description: Sub-resource type (if applicable) + arguments: + type: object + additionalProperties: {} + description: The arguments to pre-apply to the system call + description: System definition + Tools.Tool: + type: object + required: + - name + - created_at + - updated_at + - id + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDef' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDef' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDef' + description: The API call to make + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + Tools.ToolResponse: + type: object + required: + - id + - output + properties: + id: + $ref: '#/components/schemas/Common.uuid' + output: + type: object + additionalProperties: {} + description: The output of the tool + Tools.ToolType: + type: string + enum: + - function + - integration + - system + - api_call + Tools.UpdateToolRequest: + type: object + required: + - name + properties: + name: + allOf: + - $ref: '#/components/schemas/Common.validPythonIdentifier' + description: Name of the tool (must be unique for this agent and a valid python identifier string ) + description: + type: string + description: Description of the tool + function: + allOf: + - $ref: '#/components/schemas/Tools.FunctionDef' + description: The function to call + integration: + allOf: + - $ref: '#/components/schemas/Tools.IntegrationDef' + description: The integration to call + system: + allOf: + - $ref: '#/components/schemas/Tools.SystemDef' + description: The system to call + api_call: + allOf: + - $ref: '#/components/schemas/Tools.ApiCallDef' + description: The API call to make + description: Payload for updating a tool + Users.CreateOrUpdateUserRequest: + type: object + required: + - id + properties: + id: + $ref: '#/components/schemas/Common.uuid' + allOf: + - $ref: '#/components/schemas/Users.CreateUserRequest' + Users.CreateUserRequest: + type: object + required: + - name + - about + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + description: Payload for creating a user (and associated documents) + Users.PatchUserRequest: + type: object + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + description: Payload for patching a user + Users.UpdateUserRequest: + type: object + required: + - name + - about + properties: + metadata: + type: object + additionalProperties: {} + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + description: Payload for updating a user + Users.User: + type: object + required: + - id + - created_at + - updated_at + - name + - about + properties: + id: + allOf: + - $ref: '#/components/schemas/Common.uuid' + readOnly: true + metadata: + type: object + additionalProperties: {} + created_at: + type: string + format: date-time + description: When this resource was created as UTC date-time + readOnly: true + updated_at: + type: string + format: date-time + description: When this resource was updated as UTC date-time + readOnly: true + name: + allOf: + - $ref: '#/components/schemas/Common.identifierSafeUnicode' + description: Name of the user + default: '' + about: + type: string + description: About the user + default: '' + securitySchemes: + ApiKeyAuth: + type: apiKey + in: header + name: Authorization + ApiKeyAuth_: + type: apiKey + in: header + name: X-Auth-Key +servers: + - url: https://{serverEnv}.julep.ai/api + description: The julep cloud service endpoint + variables: + serverEnv: + default: api-alpha + description: The environment to use + enum: + - api + - api-alpha diff --git a/typespec/versions.tsp b/typespec/versions.tsp index 590e07a59..4739bbdf2 100644 --- a/typespec/versions.tsp +++ b/typespec/versions.tsp @@ -2,4 +2,5 @@ namespace Versions; enum ApiVersions { v0_4: "0.4.0", + v1_0: "1.0.0", } From 80984b6e3c078c2140431cb1db6276d1e5dc09ce Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 4 Oct 2024 19:32:01 -0400 Subject: [PATCH 043/113] fix(.github): Fix github actions to run on correct conditions Signed-off-by: Diwank Singh Tomer --- .../bandit-security-check-python-agents-api.yml | 11 ++++++++--- .github/workflows/lint-agents-api-pr.yml | 17 ++++++++++------- .github/workflows/test-agents-api-pr.yml | 11 +++++++---- .github/workflows/typecheck-agents-api-pr.yml | 11 +++++++---- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/.github/workflows/bandit-security-check-python-agents-api.yml b/.github/workflows/bandit-security-check-python-agents-api.yml index f2981efbc..b6d4e828d 100644 --- a/.github/workflows/bandit-security-check-python-agents-api.yml +++ b/.github/workflows/bandit-security-check-python-agents-api.yml @@ -1,8 +1,13 @@ +name: Bandit security check python agents-api +run-name: ${{ github.actor }} is checking the security of the code + on: pull_request: - branches: - - main - - dev + paths: + - 'agents-api/**' + push: + paths: + - 'agents-api/**' jobs: bandit_check: diff --git a/.github/workflows/lint-agents-api-pr.yml b/.github/workflows/lint-agents-api-pr.yml index 90fdd0a4b..3721a8b59 100644 --- a/.github/workflows/lint-agents-api-pr.yml +++ b/.github/workflows/lint-agents-api-pr.yml @@ -1,10 +1,13 @@ -name: Lint and typecheck agents-api -run-name: ${{ github.actor }} is linting and typechecking the code - -# TODO: Fix CI github actions -# SCRUM-26 - -on: [pull_request] +name: Lint agents-api +run-name: ${{ github.actor }} is linting the code + +on: + pull_request: + paths: + - 'agents-api/**' + push: + paths: + - 'agents-api/**' jobs: Lint-And-Format: diff --git a/.github/workflows/test-agents-api-pr.yml b/.github/workflows/test-agents-api-pr.yml index b0f815634..95e676657 100644 --- a/.github/workflows/test-agents-api-pr.yml +++ b/.github/workflows/test-agents-api-pr.yml @@ -1,10 +1,13 @@ name: Test agents-api run-name: ${{ github.actor }} is testing the code -# TODO: Fix CI github actions -# SCRUM-26 - -on: [pull_request] +on: + pull_request: + paths: + - 'agents-api/**' + push: + paths: + - 'agents-api/**' jobs: Test: diff --git a/.github/workflows/typecheck-agents-api-pr.yml b/.github/workflows/typecheck-agents-api-pr.yml index 513390883..9fbc5d95c 100644 --- a/.github/workflows/typecheck-agents-api-pr.yml +++ b/.github/workflows/typecheck-agents-api-pr.yml @@ -1,10 +1,13 @@ name: Typecheck agents-api run-name: ${{ github.actor }} is typechecking the code -# TODO: Fix CI github actions -# SCRUM-26 - -on: [pull_request] +on: + pull_request: + paths: + - 'agents-api/**' + push: + paths: + - 'agents-api/**' jobs: Typecheck: From 5ee3e7a0e9b68b4f5141c16b6a7712f98f6960fb Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 4 Oct 2024 19:32:22 -0400 Subject: [PATCH 044/113] feat(gateway): Redirect to api docs on GET / Signed-off-by: Diwank Singh Tomer --- gateway/traefik.yml.template | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/gateway/traefik.yml.template b/gateway/traefik.yml.template index 7423e3fde..4ab3b4367 100644 --- a/gateway/traefik.yml.template +++ b/gateway/traefik.yml.template @@ -36,7 +36,16 @@ http: middlewares: - agents-api-strip-prefix-api service: service-agents-api - priority: 2 + priority: 2 + + agents-api-redirect-to-docs: + entryPoints: + - web + rule: Path(`/`) + middlewares: + - agents-api-redirect-to-docs + service: service-agents-api + priority: 3 middlewares: corsHeaders: @@ -46,6 +55,11 @@ http: accessControlAllowOriginList: "*" addVaryHeader: true + agents-api-redirect-to-docs: + redirectRegex: + regex: "^(.*)$" + replacement: "/api/docs" + agents-api-add-headers: headers: customrequestheaders: From 8033549d92d7355e7d12912d69f8e9fff70afee7 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 4 Oct 2024 21:36:59 -0400 Subject: [PATCH 045/113] fix(typespec,agents-api): Update metadata_filter to have object type (#586) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Refactors metadata filtering by introducing `FilterModel` and `create_filter_extractor`, updating API endpoints and typespec for structured metadata filtering. > > - **Behavior**: > - Introduces `FilterModel` and `create_filter_extractor` in `query_filter.py` for structured metadata filtering. > - Updates `list_agents`, `list_user_docs`, `list_agent_docs`, and `list_sessions` to use `FilterModel` for `metadata_filter`. > - Removes JSON string parsing for `metadata_filter` in `list_agents.py`, `list_docs.py`, and `list_sessions.py`. > - **Types**: > - Adds `concreteType` alias in `scalars.tsp`. > - Updates `MetadataFilter` alias in `types.tsp` to use `concreteType`. > - Changes `metadata_filter` in `PaginationOptions` model in `types.tsp` to use `MetadataFilter`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 63eda8b9da45b5200862c799e7d9da97299f0029. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: creatorrr --- .../agents_api/dependencies/query_filter.py | 54 +++++++++++++++++++ .../agents_api/models/docs/list_docs.py | 4 +- .../agents_api/routers/agents/list_agents.py | 22 ++++---- .../agents_api/routers/docs/list_docs.py | 33 ++++-------- .../routers/sessions/list_sessions.py | 19 +++---- typespec/common/interfaces.tsp | 2 +- typespec/common/scalars.tsp | 2 + typespec/common/types.tsp | 5 +- .../@typespec/openapi3/openapi-0.4.0.yaml | 35 ++++++------ .../@typespec/openapi3/openapi-1.0.0.yaml | 35 ++++++------ 10 files changed, 127 insertions(+), 84 deletions(-) create mode 100644 agents-api/agents_api/dependencies/query_filter.py diff --git a/agents-api/agents_api/dependencies/query_filter.py b/agents-api/agents_api/dependencies/query_filter.py new file mode 100644 index 000000000..c100f1489 --- /dev/null +++ b/agents-api/agents_api/dependencies/query_filter.py @@ -0,0 +1,54 @@ +from typing import Any, Callable + +from fastapi import Request + + +def convert_value(value: str) -> Any: + """ + Attempts to convert a string value to an int or float. Returns the original string if conversion fails. + """ + for convert in (int, float): + try: + return convert(value) + except ValueError: + continue + return value + + +def create_filter_extractor( + prefix: str = "filter", +) -> Callable[[Request], dict[str, Any]]: + """ + Creates a dependency function to extract filter parameters with a given prefix. + + Args: + prefix (str): The prefix to identify filter parameters. + + Returns: + Callable[[Request], dict[str, Any]]: The dependency function. + """ + + # Add a dot to the prefix to allow for nested filters + prefix += "." + + def extract_filters(request: Request) -> dict[str, Any]: + """ + Extracts query parameters that start with the specified prefix and returns them as a dictionary. + + Args: + request (Request): The incoming HTTP request. + + Returns: + dict[str, Any]: A dictionary containing the filter parameters. + """ + + filters: dict[str, Any] = {} + + for key, value in request.query_params.items(): + if key.startswith(prefix): + filter_key = key[len(prefix) :] + filters[filter_key] = convert_value(value) + + return filters + + return extract_filters diff --git a/agents-api/agents_api/models/docs/list_docs.py b/agents-api/agents_api/models/docs/list_docs.py index 3c095c2db..4dad7ec06 100644 --- a/agents-api/agents_api/models/docs/list_docs.py +++ b/agents-api/agents_api/models/docs/list_docs.py @@ -90,7 +90,8 @@ def list_docs( created_at, metadata, }}, - snippets[id, snippet_data] + snippets[id, snippet_data], + {metadata_filter_str} :limit $limit :offset $offset @@ -112,6 +113,5 @@ def list_docs( "owner_type": owner_type, "limit": limit, "offset": offset, - "metadata_filter": metadata_filter_str, }, ) diff --git a/agents-api/agents_api/routers/agents/list_agents.py b/agents-api/agents_api/routers/agents/list_agents.py index 21cd736b5..ef9bb09db 100644 --- a/agents-api/agents_api/routers/agents/list_agents.py +++ b/agents-api/agents_api/routers/agents/list_agents.py @@ -1,12 +1,11 @@ -import json -from json import JSONDecodeError from typing import Annotated, Literal from uuid import UUID -from fastapi import Depends, HTTPException, status +from fastapi import Depends from ...autogen.openapi_model import Agent, ListResponse from ...dependencies.developer_id import get_developer_id +from ...dependencies.query_filter import create_filter_extractor from ...models.agent.list_agents import list_agents as list_agents_query from .router import router @@ -14,27 +13,24 @@ @router.get("/agents", tags=["agents"]) async def list_agents( x_developer_id: Annotated[UUID, Depends(get_developer_id)], + # Expects the dot notation of object in query params + # Example: + # > ?metadata_filter.name=John&metadata_filter.age=30 + metadata_filter: Annotated[ + dict, Depends(create_filter_extractor("metadata_filter")) + ], limit: int = 100, offset: int = 0, sort_by: Literal["created_at", "updated_at"] = "created_at", direction: Literal["asc", "desc"] = "desc", - metadata_filter: str = "{}", ) -> ListResponse[Agent]: - try: - metadata_filter = json.loads(metadata_filter) - except JSONDecodeError: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="metadata_filter is not a valid JSON", - ) - agents = list_agents_query( developer_id=x_developer_id, limit=limit, offset=offset, sort_by=sort_by, direction=direction, - metadata_filter=metadata_filter, + metadata_filter=metadata_filter or {}, ) return ListResponse[Agent](items=agents) diff --git a/agents-api/agents_api/routers/docs/list_docs.py b/agents-api/agents_api/routers/docs/list_docs.py index 2ba99a932..a4701646d 100644 --- a/agents-api/agents_api/routers/docs/list_docs.py +++ b/agents-api/agents_api/routers/docs/list_docs.py @@ -1,12 +1,11 @@ -import json -from json import JSONDecodeError from typing import Annotated, Literal from uuid import UUID -from fastapi import Depends, HTTPException, status +from fastapi import Depends from ...autogen.openapi_model import Doc, ListResponse from ...dependencies.developer_id import get_developer_id +from ...dependencies.query_filter import create_filter_extractor from ...models.docs.list_docs import list_docs as list_docs_query from .router import router @@ -14,21 +13,15 @@ @router.get("/users/{user_id}/docs", tags=["docs"]) async def list_user_docs( x_developer_id: Annotated[UUID, Depends(get_developer_id)], + metadata_filter: Annotated[ + dict, Depends(create_filter_extractor("metadata_filter")) + ], user_id: UUID, limit: int = 100, offset: int = 0, sort_by: Literal["created_at", "updated_at"] = "created_at", direction: Literal["asc", "desc"] = "desc", - metadata_filter: str = "{}", ) -> ListResponse[Doc]: - try: - metadata_filter = json.loads(metadata_filter) - except JSONDecodeError: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="metadata_filter is not a valid JSON", - ) - docs = list_docs_query( developer_id=x_developer_id, owner_type="user", @@ -37,7 +30,7 @@ async def list_user_docs( offset=offset, sort_by=sort_by, direction=direction, - metadata_filter=metadata_filter, + metadata_filter=metadata_filter or {}, ) return ListResponse[Doc](items=docs) @@ -46,21 +39,15 @@ async def list_user_docs( @router.get("/agents/{agent_id}/docs", tags=["docs"]) async def list_agent_docs( x_developer_id: Annotated[UUID, Depends(get_developer_id)], + metadata_filter: Annotated[ + dict, Depends(create_filter_extractor("metadata_filter")) + ], agent_id: UUID, limit: int = 100, offset: int = 0, sort_by: Literal["created_at", "updated_at"] = "created_at", direction: Literal["asc", "desc"] = "desc", - metadata_filter: str = "{}", ) -> ListResponse[Doc]: - try: - metadata_filter = json.loads(metadata_filter) - except JSONDecodeError: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="metadata_filter is not a valid JSON", - ) - docs = list_docs_query( developer_id=x_developer_id, owner_type="agent", @@ -69,7 +56,7 @@ async def list_agent_docs( offset=offset, sort_by=sort_by, direction=direction, - metadata_filter=metadata_filter, + metadata_filter=metadata_filter or {}, ) return ListResponse[Doc](items=docs) diff --git a/agents-api/agents_api/routers/sessions/list_sessions.py b/agents-api/agents_api/routers/sessions/list_sessions.py index 21d7b643b..6a4555e6e 100644 --- a/agents-api/agents_api/routers/sessions/list_sessions.py +++ b/agents-api/agents_api/routers/sessions/list_sessions.py @@ -1,12 +1,11 @@ -import json -from json import JSONDecodeError from typing import Annotated, Literal from uuid import UUID -from fastapi import Depends, HTTPException, status +from fastapi import Depends from ...autogen.openapi_model import ListResponse, Session from ...dependencies.developer_id import get_developer_id +from ...dependencies.query_filter import create_filter_extractor from ...models.session.list_sessions import list_sessions as list_sessions_query from .router import router @@ -14,27 +13,21 @@ @router.get("/sessions", tags=["sessions"]) async def list_sessions( x_developer_id: Annotated[UUID, Depends(get_developer_id)], + metadata_filter: Annotated[ + dict, Depends(create_filter_extractor("metadata_filter")) + ] = {}, limit: int = 100, offset: int = 0, sort_by: Literal["created_at", "updated_at"] = "created_at", direction: Literal["asc", "desc"] = "desc", - metadata_filter: str = "{}", ) -> ListResponse[Session]: - try: - metadata_filter = json.loads(metadata_filter) - except JSONDecodeError: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="metadata_filter is not a valid JSON", - ) - sessions = list_sessions_query( developer_id=x_developer_id, limit=limit, offset=offset, sort_by=sort_by, direction=direction, - metadata_filter=metadata_filter, + metadata_filter=metadata_filter or {}, ) return ListResponse[Session](items=sessions) diff --git a/typespec/common/interfaces.tsp b/typespec/common/interfaces.tsp index d44d8aab0..d9e4a9e2e 100644 --- a/typespec/common/interfaces.tsp +++ b/typespec/common/interfaces.tsp @@ -136,7 +136,7 @@ interface ChildLimitOffsetPagination< ...PaginationOptions, ): { - results: T[]; + items: T[]; }; } diff --git a/typespec/common/scalars.tsp b/typespec/common/scalars.tsp index 8dc07cbbc..dc206fa02 100644 --- a/typespec/common/scalars.tsp +++ b/typespec/common/scalars.tsp @@ -7,6 +7,8 @@ namespace Common; @format("uuid") scalar uuid extends string; +alias concreteType = numeric | string | boolean | null; + /** * For Unicode character safety * See: https://unicode.org/reports/tr31/ diff --git a/typespec/common/types.tsp b/typespec/common/types.tsp index 7d954a80e..dd331e98c 100644 --- a/typespec/common/types.tsp +++ b/typespec/common/types.tsp @@ -11,6 +11,7 @@ namespace Common; // alias Metadata = Record; +alias MetadataFilter = Record; model ResourceCreatedResponse { @doc("ID of created resource") @@ -48,6 +49,6 @@ model PaginationOptions { /** Sort direction */ @query direction: sortDirection = "asc", - /** JSON string of object that should be used to filter objects by metadata */ - @query metadata_filter: string = "{}", + /** Object to filter results by metadata */ + @query metadata_filter: MetadataFilter, } \ No newline at end of file diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml index e578d26d9..7a7afc3e9 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml @@ -181,12 +181,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Docs.Doc' required: - - results + - items post: operationId: AgentDocsRoute_create description: Create a Doc for this Agent @@ -290,12 +290,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Tasks.Task' required: - - results + - items post: operationId: TasksRoute_create description: Create a new task @@ -434,12 +434,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Tools.Tool' required: - - results + - items post: operationId: AgentToolsRoute_create description: Create a new tool for this agent @@ -713,7 +713,7 @@ paths: schema: type: object properties: - results: + items: type: array items: type: object @@ -725,7 +725,7 @@ paths: required: - transitions required: - - results + - items /executions/{id}/transitions.stream: get: operationId: ExecutionTransitionsStreamRoute_stream @@ -1026,12 +1026,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Executions.Execution' required: - - results + - items /users: get: operationId: UsersRoute_list @@ -1196,12 +1196,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Docs.Doc' required: - - results + - items post: operationId: UserDocsRoute_create description: Create a Doc for this User @@ -1317,10 +1317,15 @@ components: name: metadata_filter in: query required: true - description: JSON string of object that should be used to filter objects by metadata + description: Object to filter results by metadata schema: - type: string - default: '{}' + type: object + additionalProperties: + anyOf: + - type: number + - type: string + - type: boolean + nullable: true explode: false Common.PaginationOptions.offset: name: offset diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml index e5a5f99e6..d82540194 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml @@ -181,12 +181,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Docs.Doc' required: - - results + - items post: operationId: AgentDocsRoute_create description: Create a Doc for this Agent @@ -290,12 +290,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Tasks.Task' required: - - results + - items post: operationId: TasksRoute_create description: Create a new task @@ -434,12 +434,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Tools.Tool' required: - - results + - items post: operationId: AgentToolsRoute_create description: Create a new tool for this agent @@ -713,7 +713,7 @@ paths: schema: type: object properties: - results: + items: type: array items: type: object @@ -725,7 +725,7 @@ paths: required: - transitions required: - - results + - items /executions/{id}/transitions.stream: get: operationId: ExecutionTransitionsStreamRoute_stream @@ -1026,12 +1026,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Executions.Execution' required: - - results + - items /users: get: operationId: UsersRoute_list @@ -1196,12 +1196,12 @@ paths: schema: type: object properties: - results: + items: type: array items: $ref: '#/components/schemas/Docs.Doc' required: - - results + - items post: operationId: UserDocsRoute_create description: Create a Doc for this User @@ -1317,10 +1317,15 @@ components: name: metadata_filter in: query required: true - description: JSON string of object that should be used to filter objects by metadata + description: Object to filter results by metadata schema: - type: string - default: '{}' + type: object + additionalProperties: + anyOf: + - type: number + - type: string + - type: boolean + nullable: true explode: false Common.PaginationOptions.offset: name: offset From 2e0108e517728e12e938ff785f46dafdc19040b6 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Sat, 5 Oct 2024 04:39:17 +0300 Subject: [PATCH 046/113] feat(agents-api): Add retry policies to temporal workflows/activities (#551) > [!IMPORTANT] > Introduces `DEFAULT_RETRY_POLICY` for consistent retry behavior in Temporal workflows and activities, updating workflows, activities, and tests accordingly. > > - **Retry Policy**: > - Introduces `DEFAULT_RETRY_POLICY` in `retry_policies.py` with specific retry configurations. > - Applies `DEFAULT_RETRY_POLICY` to `run_task_execution_workflow()` in `temporal.py` and `run_embed_docs_task()` in `create_doc.py`. > - **Workflows**: > - Adds `retry_policy=DEFAULT_RETRY_POLICY` to `DemoWorkflow`, `EmbedDocsWorkflow`, `MemRatingWorkflow`, `SummarizationWorkflow`, `TruncationWorkflow`. > - Updates `TaskExecutionWorkflow` in `task_execution/__init__.py` to use `DEFAULT_RETRY_POLICY` for activities. > - **Activities**: > - Updates `raise_complete_async()` in `raise_complete_async.py` to use consistent string formatting. > - Updates `transition()` in `transition.py` to use `DEFAULT_RETRY_POLICY`. > - **Tests**: > - Updates `test_activities.py` to use `DEFAULT_RETRY_POLICY` in workflow execution tests. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 2d945d3934c154487211cc8d50d5e8f532987e01. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: Diwank Singh Tomer Co-authored-by: creatorrr --- agents-api/agents_api/clients/temporal.py | 2 + .../agents_api/common/retry_policies.py | 63 +++++++++++++++++++ .../agents_api/routers/docs/create_doc.py | 2 + agents-api/agents_api/workflows/demo.py | 3 + agents-api/agents_api/workflows/embed_docs.py | 2 + agents-api/agents_api/workflows/mem_rating.py | 2 + .../agents_api/workflows/summarization.py | 2 + .../workflows/task_execution/__init__.py | 8 +++ .../workflows/task_execution/helpers.py | 5 ++ .../workflows/task_execution/transition.py | 2 + agents-api/agents_api/workflows/truncation.py | 2 + agents-api/tests/test_activities.py | 11 +++- 12 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 agents-api/agents_api/common/retry_policies.py diff --git a/agents-api/agents_api/clients/temporal.py b/agents-api/agents_api/clients/temporal.py index 5f14b84f6..4bb25cbc9 100644 --- a/agents-api/agents_api/clients/temporal.py +++ b/agents-api/agents_api/clients/temporal.py @@ -5,6 +5,7 @@ from ..autogen.openapi_model import TransitionTarget from ..common.protocol.tasks import ExecutionInput +from ..common.retry_policies import DEFAULT_RETRY_POLICY from ..env import ( temporal_client_cert, temporal_namespace, @@ -54,6 +55,7 @@ async def run_task_execution_workflow( task_queue=temporal_task_queue, id=str(job_id), run_timeout=timedelta(days=31), + retry_policy=DEFAULT_RETRY_POLICY, # TODO: Should add search_attributes for queryability ) diff --git a/agents-api/agents_api/common/retry_policies.py b/agents-api/agents_api/common/retry_policies.py new file mode 100644 index 000000000..fc343553c --- /dev/null +++ b/agents-api/agents_api/common/retry_policies.py @@ -0,0 +1,63 @@ +from datetime import timedelta + +from temporalio.common import RetryPolicy + +DEFAULT_RETRY_POLICY = RetryPolicy( + initial_interval=timedelta(seconds=1), + backoff_coefficient=2, + maximum_attempts=25, + maximum_interval=timedelta(seconds=300), + non_retryable_error_types=[ + # Temporal-specific errors + "WorkflowExecutionAlreadyStarted", + "temporalio.exceptions.TerminalFailure", + "temporalio.exceptions.CanceledError", + # + # Built-in Python exceptions + "TypeError", + "AssertionError", + "SyntaxError", + "ValueError", + "ZeroDivisionError", + "IndexError", + "AttributeError", + "LookupError", + "BufferError", + "ArithmeticError", + "KeyError", + "NameError", + "NotImplementedError", + "RecursionError", + "RuntimeError", + "StopIteration", + "StopAsyncIteration", + "IndentationError", + "TabError", + # + # Unicode-related errors + "UnicodeError", + "UnicodeEncodeError", + "UnicodeDecodeError", + "UnicodeTranslateError", + # + # HTTP and API-related errors + "HTTPException", + "fastapi.exceptions.HTTPException", + "fastapi.exceptions.RequestValidationError", + "httpx.RequestError", + "httpx.HTTPStatusError", + # + # Asynchronous programming errors + "asyncio.CancelledError", + "asyncio.InvalidStateError", + "GeneratorExit", + # + # Third-party library exceptions + "jinja2.exceptions.TemplateSyntaxError", + "jinja2.exceptions.TemplateNotFound", + "jsonschema.exceptions.ValidationError", + "pydantic.ValidationError", + "requests.exceptions.InvalidURL", + "requests.exceptions.MissingSchema", + ], +) diff --git a/agents-api/agents_api/routers/docs/create_doc.py b/agents-api/agents_api/routers/docs/create_doc.py index 0ba22c8d5..16754dbe3 100644 --- a/agents-api/agents_api/routers/docs/create_doc.py +++ b/agents-api/agents_api/routers/docs/create_doc.py @@ -8,6 +8,7 @@ from ...activities.types import EmbedDocsPayload from ...autogen.openapi_model import CreateDocRequest, ResourceCreatedResponse from ...clients import temporal +from ...common.retry_policies import DEFAULT_RETRY_POLICY from ...dependencies.developer_id import get_developer_id from ...env import temporal_task_queue, testing from ...models.docs.create_doc import create_doc as create_doc_query @@ -41,6 +42,7 @@ async def run_embed_docs_task( embed_payload, task_queue=temporal_task_queue, id=str(job_id), + retry_policy=DEFAULT_RETRY_POLICY, ) # TODO: Remove this conditional once we have a way to run workflows in diff --git a/agents-api/agents_api/workflows/demo.py b/agents-api/agents_api/workflows/demo.py index 61ad9d4a8..0599a4392 100644 --- a/agents-api/agents_api/workflows/demo.py +++ b/agents-api/agents_api/workflows/demo.py @@ -2,6 +2,8 @@ from temporalio import workflow +from ..common.retry_policies import DEFAULT_RETRY_POLICY + with workflow.unsafe.imports_passed_through(): from ..activities.demo import demo_activity @@ -14,4 +16,5 @@ async def run(self, a: int, b: int) -> int: demo_activity, args=[a, b], start_to_close_timeout=timedelta(seconds=30), + retry_policy=DEFAULT_RETRY_POLICY, ) diff --git a/agents-api/agents_api/workflows/embed_docs.py b/agents-api/agents_api/workflows/embed_docs.py index 62e0e65ae..83eefe907 100644 --- a/agents-api/agents_api/workflows/embed_docs.py +++ b/agents-api/agents_api/workflows/embed_docs.py @@ -8,6 +8,7 @@ with workflow.unsafe.imports_passed_through(): from ..activities.embed_docs import embed_docs from ..activities.types import EmbedDocsPayload + from ..common.retry_policies import DEFAULT_RETRY_POLICY @workflow.defn @@ -18,4 +19,5 @@ async def run(self, embed_payload: EmbedDocsPayload) -> None: embed_docs, embed_payload, schedule_to_close_timeout=timedelta(seconds=600), + retry_policy=DEFAULT_RETRY_POLICY, ) diff --git a/agents-api/agents_api/workflows/mem_rating.py b/agents-api/agents_api/workflows/mem_rating.py index 4b68a7198..0a87fd787 100644 --- a/agents-api/agents_api/workflows/mem_rating.py +++ b/agents-api/agents_api/workflows/mem_rating.py @@ -7,6 +7,7 @@ with workflow.unsafe.imports_passed_through(): from ..activities.mem_rating import mem_rating + from ..common.retry_policies import DEFAULT_RETRY_POLICY @workflow.defn @@ -17,4 +18,5 @@ async def run(self, memory: str) -> None: mem_rating, memory, schedule_to_close_timeout=timedelta(seconds=600), + retry_policy=DEFAULT_RETRY_POLICY, ) diff --git a/agents-api/agents_api/workflows/summarization.py b/agents-api/agents_api/workflows/summarization.py index 7946e9109..96ce4c460 100644 --- a/agents-api/agents_api/workflows/summarization.py +++ b/agents-api/agents_api/workflows/summarization.py @@ -7,6 +7,7 @@ with workflow.unsafe.imports_passed_through(): from ..activities.summarization import summarization + from ..common.retry_policies import DEFAULT_RETRY_POLICY @workflow.defn @@ -17,4 +18,5 @@ async def run(self, session_id: str) -> None: summarization, session_id, schedule_to_close_timeout=timedelta(seconds=600), + retry_policy=DEFAULT_RETRY_POLICY, ) diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index 3c6106267..d26a3d999 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -47,6 +47,7 @@ StepContext, StepOutcome, ) + from ...common.retry_policies import DEFAULT_RETRY_POLICY from ...env import debug, testing from .helpers import ( continue_as_child, @@ -58,6 +59,7 @@ ) from .transition import transition + # Supported steps # --------------- @@ -204,6 +206,7 @@ async def run( schedule_to_close_timeout=timedelta( seconds=30 if debug or testing else 600 ), + retry_policy=DEFAULT_RETRY_POLICY, ) workflow.logger.debug( f"Step {context.cursor.step} completed successfully" @@ -389,6 +392,7 @@ async def run( task_steps.raise_complete_async, args=[context, output], schedule_to_close_timeout=timedelta(days=31), + retry_policy=DEFAULT_RETRY_POLICY, ) state = PartialTransition(type="resume", output=result) @@ -421,6 +425,7 @@ async def run( task_steps.raise_complete_async, args=[context, tool_calls_input], schedule_to_close_timeout=timedelta(days=31), + retry_policy=DEFAULT_RETRY_POLICY, ) # Feed the tool call results back to the model @@ -432,6 +437,7 @@ async def run( schedule_to_close_timeout=timedelta( seconds=30 if debug or testing else 600 ), + retry_policy=DEFAULT_RETRY_POLICY, ) state = PartialTransition(output=new_response.output, type="resume") @@ -475,6 +481,7 @@ async def run( task_steps.raise_complete_async, args=[context, tool_call], schedule_to_close_timeout=timedelta(days=31), + retry_policy=DEFAULT_RETRY_POLICY, ) state = PartialTransition(output=tool_call_response, type="resume") @@ -505,6 +512,7 @@ async def run( schedule_to_close_timeout=timedelta( seconds=30 if debug or testing else 600 ), + retry_policy=DEFAULT_RETRY_POLICY, ) state = PartialTransition(output=tool_call_response) diff --git a/agents-api/agents_api/workflows/task_execution/helpers.py b/agents-api/agents_api/workflows/task_execution/helpers.py index 88828b31b..04449db58 100644 --- a/agents-api/agents_api/workflows/task_execution/helpers.py +++ b/agents-api/agents_api/workflows/task_execution/helpers.py @@ -5,6 +5,8 @@ from temporalio import workflow from temporalio.exceptions import ApplicationError +from ...common.retry_policies import DEFAULT_RETRY_POLICY + with workflow.unsafe.imports_passed_through(): from ...activities import task_steps from ...autogen.openapi_model import ( @@ -33,6 +35,7 @@ async def continue_as_child( previous_inputs, user_state, ], + retry_policy=DEFAULT_RETRY_POLICY, ) @@ -169,6 +172,7 @@ async def execute_map_reduce_step( task_steps.base_evaluate, args=[reduce, {"results": result, "_": output}], schedule_to_close_timeout=timedelta(seconds=30), + retry_policy=DEFAULT_RETRY_POLICY, ) return result @@ -244,6 +248,7 @@ async def execute_map_reduce_step_parallel( extra_lambda_strs, ], schedule_to_close_timeout=timedelta(seconds=30), + retry_policy=DEFAULT_RETRY_POLICY, ) except BaseException as e: diff --git a/agents-api/agents_api/workflows/task_execution/transition.py b/agents-api/agents_api/workflows/task_execution/transition.py index dbcd776e4..035322dad 100644 --- a/agents-api/agents_api/workflows/task_execution/transition.py +++ b/agents-api/agents_api/workflows/task_execution/transition.py @@ -10,6 +10,7 @@ TransitionTarget, ) from ...common.protocol.tasks import PartialTransition, StepContext +from ...common.retry_policies import DEFAULT_RETRY_POLICY async def transition( @@ -44,6 +45,7 @@ async def transition( task_steps.transition_step, args=[context, transition_request], schedule_to_close_timeout=timedelta(seconds=30), + retry_policy=DEFAULT_RETRY_POLICY, ) except Exception as e: diff --git a/agents-api/agents_api/workflows/truncation.py b/agents-api/agents_api/workflows/truncation.py index d3646ccbe..d12a186b9 100644 --- a/agents-api/agents_api/workflows/truncation.py +++ b/agents-api/agents_api/workflows/truncation.py @@ -7,6 +7,7 @@ with workflow.unsafe.imports_passed_through(): from ..activities.truncation import truncation + from ..common.retry_policies import DEFAULT_RETRY_POLICY @workflow.defn @@ -17,4 +18,5 @@ async def run(self, session_id: str, token_count_threshold: int) -> None: truncation, args=[session_id, token_count_threshold], schedule_to_close_timeout=timedelta(seconds=600), + retry_policy=DEFAULT_RETRY_POLICY, ) diff --git a/agents-api/tests/test_activities.py b/agents-api/tests/test_activities.py index a2f15d179..6f65cd034 100644 --- a/agents-api/tests/test_activities.py +++ b/agents-api/tests/test_activities.py @@ -7,8 +7,14 @@ from agents_api.clients import temporal from agents_api.env import temporal_task_queue from agents_api.workflows.demo import DemoWorkflow -from tests.fixtures import cozo_client, test_developer_id, test_doc -from tests.utils import patch_testing_temporal +from agents_api.workflows.task_execution.helpers import DEFAULT_RETRY_POLICY + +from .fixtures import ( + cozo_client, + test_developer_id, + test_doc, +) +from .utils import patch_testing_temporal @test("activity: call direct embed_docs") @@ -44,6 +50,7 @@ async def _(): args=[1, 2], id=str(uuid4()), task_queue=temporal_task_queue, + retry_policy=DEFAULT_RETRY_POLICY, ) assert result == 3 From 196b827f211fc774ca1ba99cc29c7e79c3643725 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sat, 5 Oct 2024 09:38:32 -0400 Subject: [PATCH 047/113] fix(agents-api): Add metadata_filter change to users/list route as well Signed-off-by: Diwank Singh Tomer --- .../agents_api/routers/users/list_users.py | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/agents-api/agents_api/routers/users/list_users.py b/agents-api/agents_api/routers/users/list_users.py index 3f6b93cb2..a17c55994 100644 --- a/agents-api/agents_api/routers/users/list_users.py +++ b/agents-api/agents_api/routers/users/list_users.py @@ -1,12 +1,11 @@ -import json -from json import JSONDecodeError from typing import Annotated, Literal from uuid import UUID -from fastapi import Depends, HTTPException, status +from fastapi import Depends from ...autogen.openapi_model import ListResponse, User from ...dependencies.developer_id import get_developer_id +from ...dependencies.query_filter import create_filter_extractor from ...models.user.list_users import list_users as list_users_query from .router import router @@ -14,28 +13,22 @@ @router.get("/users", tags=["users"]) async def list_users( x_developer_id: Annotated[UUID, Depends(get_developer_id)], + metadata_filter: Annotated[ + dict, Depends(create_filter_extractor("metadata_filter")) + ], limit: int = 100, offset: int = 0, sort_by: Literal["created_at", "updated_at"] = "created_at", direction: Literal["asc", "desc"] = "desc", - metadata_filter: str = "{}", ) -> ListResponse[User]: - try: - metadata_filter = json.loads(metadata_filter) - except JSONDecodeError: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="metadata_filter is not a valid JSON", - ) - users = list_users_query( developer_id=x_developer_id, limit=limit, offset=offset, sort_by=sort_by, direction=direction, - metadata_filter=metadata_filter, + metadata_filter=metadata_filter or {}, ) - result = ListResponse[User](items=users) - return result + return ListResponse[User](items=users) + From f67023fe34c78247b8c64a60ce184a66b2b2e515 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sat, 5 Oct 2024 13:39:48 +0000 Subject: [PATCH 048/113] refactor: Lint agents-api (CI) --- agents-api/agents_api/routers/users/list_users.py | 1 - 1 file changed, 1 deletion(-) diff --git a/agents-api/agents_api/routers/users/list_users.py b/agents-api/agents_api/routers/users/list_users.py index a17c55994..a234d8a5f 100644 --- a/agents-api/agents_api/routers/users/list_users.py +++ b/agents-api/agents_api/routers/users/list_users.py @@ -31,4 +31,3 @@ async def list_users( ) return ListResponse[User](items=users) - From b7593314854804fd028d1e2a95b9a3e3ff59765d Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Mon, 7 Oct 2024 01:00:27 +0900 Subject: [PATCH 049/113] docs: add Japanese README (#598) I created Japanese translated README. ---- > [!IMPORTANT] > Add Japanese translation of README and update language links in existing READMEs. > > - **Documentation**: > - Add `README-JP.md` for Japanese translation of the README. > - Update language navigation links in `README.md` and `README-CN.md` to include Japanese translation. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for f6dc4d29691e889113dd6ab555cabbec34437c4e. It will automatically update as commits are pushed. --- README-CN.md | 4 +- README-JP.md | 667 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 3 files changed, 670 insertions(+), 3 deletions(-) create mode 100644 README-JP.md diff --git a/README-CN.md b/README-CN.md index 8dca6dcbb..437faf13b 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,4 +1,4 @@ -[English](README.md) | 中文 +[English](README.md) | 中文 | [日本語](README-JP.md)
julep @@ -661,4 +661,4 @@ results = client.documents.search( ## 致谢 -我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 \ No newline at end of file +我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 diff --git a/README-JP.md b/README-JP.md new file mode 100644 index 000000000..6110c5601 --- /dev/null +++ b/README-JP.md @@ -0,0 +1,667 @@ +[English](README.md) | [中文](README-CN.md) | 日本語 + +
+ julep +
+ +

+
+ ドキュメントを探索する + · + Discord + · + 𝕏 + · + LinkedIn +

+ + +

+ NPM Version +   + PyPI - Version +   + Docker Image Version +   + GitHub License +

+ +***** + +## 🌟 コントリビューター募集! + +Julepプロジェクトに新しいコントリビューターを歓迎します!スタートに役立つ「初心者向けの問題」をいくつか作成しました。以下は、貢献する方法です: + +1. [CONTRIBUTING.md](CONTRIBUTING.md)ファイルを確認して、貢献のガイドラインを確認してください。 +2. [初心者向けの問題](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)を閲覧して、興味のあるタスクを見つけてください。 +3. 質問がある場合や助けが必要な場合は、[Discord](https://discord.com/invite/JTSBGRZrzj)チャンネルでお気軽にお問い合わせください。 + +あなたの貢献、大きいものでも小さいものでも、私たちにとっては貴重です。一緒に素晴らしいものを作りましょう!🚀 + +### 🎉 DevFest.AI 2024年10月 + +エキサイティングなニュース!2024年10月中、DevFest.AIに参加します!🗓️ + +- このイベント中にJulepに貢献し、素晴らしいJulepのグッズや景品を獲得するチャンスを得ましょう!🎁 +- 世界中の開発者と一緒にAIリポジトリに貢献し、素晴らしいイベントに参加しましょう。 +- この素晴らしいイニシアチブを組織してくれたDevFest.AIに大きな感謝を! + +> [!TIP] +> 楽しみに参加する準備はできましたか?**[ツイートして参加を開始](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)**し、コーディングを始めましょう!🖥️ + +![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) + +***** + +## 🎉🚀 **エキサイティングなニュース:Julep 1.0 Alphaリリース!** 🚀🎉 + +**Julep 1.0**の**アルファ**リリースを発表できることを嬉しく思います!🥳 + +🌟 **新機能:** +- 強化されたワークフロー機能 +- 改善されたエージェントの持続性 +- 多数の組み込みツール統合(dalle、google検索、sendgridなど) +- 簡素化されたAPI + +🧪 試してみて、AIワークフローの未来を形作る手助けをしましょう! + +> [!NOTE] +> ベータ版の間、APIキーを取得するには[Discord](https://discord.com/invite/JTSBGRZrzj)でお問い合わせください。 + +> [!TIP] +> 🐛 バグを見つけましたか?提案がありますか?私たちはあなたの意見を聞きたいです! +> [Discord](https://discord.com/invite/JTSBGRZrzj)に参加するか、[issue](https://github.com/julep-ai/julep/issues)を開いてください。 + +安定版リリースに向けて、さらに多くの更新情報をお楽しみに!📢 + +***** + +## 紹介 + +Julepは、カスタマイズ可能なワークフローを持つ持続可能なAIエージェントを作成するためのオープンソースプラットフォームです。柔軟性と使いやすさに重点を置いて、AI駆動のアプリケーションを開発、管理、展開するためのツールを提供します。 + +Julepを使用すると、次のことができます: +- 複数のインタラクションにわたってコンテキストと状態を保持するAIエージェントを迅速に開発する +- AIエージェントに合わせた洗練されたワークフローを設計および実行する +- さまざまなツールやAPIをAIワークフローにシームレスに統合する +- 持続的なセッションとユーザーインタラクションを簡単に管理する + +チャットボットの開発、タスクの自動化、または複雑なAIアシスタントの構築を行う場合でも、Julepはアイデアを迅速かつ効率的に現実に変えるために必要な柔軟性と機能を提供します。 + + + +
+ここに簡単なPythonの例があります: + + + +

+from julep import Julep, AsyncJulep
+
+# 🔑 Julepクライアントを初期化する
+#     または、非同期操作のためにAsyncJulepを使用する
+client = Julep(api_key="your_api_key")
+
+##################
+## 🤖 エージェント 🤖 ##
+##################
+
+# 研究エージェントを作成する
+agent = client.agents.create(
+    name="Research Agent",
+    model="claude-3.5-sonnet",
+    about="You are a research agent designed to handle research inquiries.",
+)
+
+# 🔍 エージェントにウェブ検索ツールを追加する
+client.agents.tools.create(
+    agent_id=agent.id,
+    name="web_search",  # Pythonの有効な変数名である必要があります
+    description="Use this tool to research inquiries.",
+    integration={
+        "provider": "brave",
+        "method": "search",
+        "setup": {
+            "api_key": "your_brave_api_key",
+        },
+    },
+)
+
+#################
+## 💬 チャット 💬 ##
+#################
+
+# エージェントとのインタラクティブなチャットセッションを開始する
+session = client.sessions.create(
+    agent_id=agent.id,
+    context_overflow="adaptive",  # 🧠 必要に応じてJulepがコンテキストウィンドウを動的に計算します
+)
+
+# 🔄 チャットループ
+while (user_input := input("You: ")) != "exit":
+    response = client.sessions.chat(
+        session_id=session.id,
+        message=user_input,
+    )
+
+    print("Agent: ", response.choices[0].message.content)
+
+
+#################
+## 📋 タスク 📋 ##
+#################
+
+# エージェントのための定期的な研究タスクを作成する
+task = client.tasks.create(
+    agent_id=agent.id,
+    name="Research Task",
+    description="Research the given topic every 24 hours.",
+    #
+    # 🛠️ タスク固有のツール
+    tools=[
+        {
+            "name": "send_email",
+            "description": "Send an email to the user with the results.",
+            "api_call": {
+                "method": "post",
+                "url": "https://api.sendgrid.com/v3/mail/send",
+                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
+            },
+        }
+    ],
+    #
+    # 🔢 タスクの主なステップ
+    main=[
+        #
+        # ステップ1:トピックを調査する
+        {
+            # `_`(アンダースコア)変数は前のステップの出力を指します
+            # ここでは、ユーザーからのトピック入力を指します
+            "prompt": "Look up topic '{{_.topic}}' and summarize the results.",
+            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 エージェントのウェブ検索ツールを使用する
+            "unwrap": True,
+        },
+        #
+        # ステップ2:研究結果を含むメールを送信する
+        {
+            "tool": "send_email",
+            "arguments": {
+                "subject": "Research Results",
+                "body": "'Here are the research results for today: ' + _.content",
+                "to": "inputs[0].email",  # ユーザーの入力からメールを参照する
+            },
+        },
+        #
+        # ステップ3:繰り返す前に24時間待つ
+        {"sleep": "24 * 60 * 60"},
+    ],
+)
+
+# 🚀 定期的なタスクを開始する
+client.executions.create(task_id=task.id, input={"topic": "Python"})
+
+# 🔁 これにより、タスクは24時間ごとに実行され、
+#    "Python"のトピックを調査し、
+#    結果をユーザーのメールに送信します
+
+
+ + +## 特徴 + +Julepは、カスタマイズ可能なワークフローを持つ持続可能なAIエージェントの構築プロセスを簡素化します。主な特徴は次のとおりです: + +- **持続可能なAIエージェント**:複数のインタラクションにわたってコンテキストを保持するAIエージェントを作成および管理します。 +- **カスタマイズ可能なワークフロー**:タスクを使用して複雑な多段階のAIワークフローを設計します。 +- **ツール統合**:さまざまなツールやAPIをAIワークフローにシームレスに統合します。 +- **ドキュメント管理**:エージェントのためのドキュメントを効率的に管理および検索します。 +- **セッション管理**:継続的なインタラクションのための持続的なセッションを処理します。 +- **柔軟な実行**:ワークフローでの並行処理、条件ロジック、およびエラー処理をサポートします。 + +## インストール + +Julepを始めるには、[npm](https://www.npmjs.com/package/@julep/sdk)または[pip](https://pypi.org/project/julep/)を使用してインストールします: + +```bash +npm install @julep/sdk +``` + +または + +```bash +pip install julep +``` + +> [!TIP] +> ~~APIキーを[こちら](https://app.julep.ai/api-keys)から取得してください。~~ +> +> ベータ版の間、APIキーを取得するには[Discord](https://discord.com/invite/JTSBGRZrzj)でお問い合わせください。 + +## クイックスタートガイド + +### ステップ1:Julepをインポートする + +まず、Julep SDKをプロジェクトにインポートします: + +```javascript +const Julep = require('@julep/sdk'); +``` + +または + +```python +from julep import AsyncJulep +``` + +### ステップ2:エージェントを初期化する + +基本設定で新しいエージェントを作成します: + +```javascript +const julep = new Julep({ apiKey: 'your-api-key' }); + +const agent = await julep.agents.create({ + name: 'ResearchAssistant', + model: 'gpt-4-turbo', + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +}); +``` + +または + +```python +client = AsyncJulep(api_key="your_api_key") + +agent = await client.agents.create( + name="Storytelling Agent", + model="gpt-4-turbo", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +) +``` + +### ステップ3:エージェントとチャットする + +エージェントとのインタラクティブなチャットセッションを開始します: + +```javascript +const session = await julep.sessions.create({ + agentId: agent.id, +}); + +// エージェントにメッセージを送信する +const response = await julep.sessions.chat({ + sessionId: session.id, + message: 'Hello, can you tell me a story?', +}); + +console.log(response); +``` + +または + +```python +session = await client.sessions.create(agent_id=agent.id) + +# エージェントにメッセージを送信する +response = await client.sessions.chat( + session_id=session.id, + message="Hello, can you tell me a story?", +) + +print(response) +``` + + +### ステップ4:多段階タスクを作成する + +入力されたアイデアに基づいてストーリーを作成し、パネル化されたコミックストリップを生成する多段階タスクを定義しましょう: + +```python +# 🛠️ エージェントに画像生成ツール(DALL·E)を追加する +await client.agents.tools.create( + agent_id=agent.id, + name="image_generator", + description="Use this tool to generate images based on descriptions.", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_dalle_api_key", + }, + }, +) + +# 📋 タスク +# アイデアを受け取り、ストーリーと4コマ漫画を作成するタスクを作成する +task = await client.tasks.create( + agent_id=agent.id, + name="Story and Comic Creator", + description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.", + main=[ + # ステップ1:ストーリーを生成し、4つのパネルに要約する + { + "prompt": [ + { + "role": "system", + "content": "You are {{agent.name}}. {{agent.about}}" + }, + { + "role": "user", + "content": ( + "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. " + "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story." + ), + }, + ], + "unwrap": True, + }, + # ステップ2:パネルの説明とストーリーを抽出する + { + "evaluate": { + "story": "_.split('1. ')[0].strip()", + "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", + } + }, + # ステップ3:画像生成ツールを使用して各パネルの画像を生成する + { + "foreach": { + "in": "_.panels", + "do": { + "tool": "image_generator", + "arguments": { + "description": "_", + }, + }, + }, + }, + # ステップ4:ストーリーのキャッチーなタイトルを生成する + { + "prompt": [ + { + "role": "system", + "content": "You are {{agent.name}}. {{agent.about}}" + }, + { + "role": "user", + "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}", + }, + ], + "unwrap": True, + }, + # ステップ5:ストーリー、生成された画像、およびタイトルを返す + { + "return": { + "title": "outputs[3]", + "story": "outputs[1].story", + "comic_panels": "[output.image.url for output in outputs[2]]", + } + }, + ], +) +``` + +> [!TIP] +> これのnode.jsバージョンは似ています。 + +### ステップ5:タスクを実行する + +```python +# 🚀 アイデアを入力してタスクを実行する +execution = await client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} +) + +# 🎉 ストーリーとコミックパネルが生成される様子を見守る +await client.executions.stream(execution_id=execution.id) +``` + +この例は、カスタムツールを持つエージェントを作成し、複数のステップを持つ複雑なタスクを定義し、それを実行してクリエイティブな出力を生成する方法を示しています。 + + + +> [!TIP] +> もう一つのnode.jsの例は[こちら](example.ts)またはpythonの例は[こちら](example.py)にあります。 + +## 概念 + +Julepは、強力なAIワークフローを作成するために連携するいくつかの主要な技術コンポーネントに基づいて構築されています: + +### エージェント +タスクを実行し、ユーザーと対話する大規模な言語モデル(LLM)に支えられたAIエンティティ。エージェントはJulepのコア機能ユニットです。 + +```mermaid +graph TD + Agent[Agent] --> LLM[Large Language Model] + Agent --> Tasks[Tasks] + Agent --> Users[Users] + Tasks --> Tools[Tools] +``` + +### ユーザー +エージェントと対話するエンティティ。ユーザーはセッションに関連付けられ、独自のメタデータを持つことができ、個別の対話が可能になります。 + +```mermaid +graph LR + User[User] --> Sessions[Sessions] + Sessions --> Agents[Agents] + Sessions --> Metadata[Metadata] +``` + +### セッション +エージェントとユーザーの間の有状態の対話。セッションは複数の交換にわたってコンテキストを保持し、コンテキスト管理やオーバーフロー処理などの異なる動作に対して構成できます。 + +```mermaid +graph LR + Sessions[Sessions] --> Agents[Agents] + Sessions --> Users[Users] + Sessions --> ContextManagement[Context Management] + Sessions --> OverflowHandling[Overflow Handling] +``` + +### タスク +エージェントが実行できる多段階のプログラムワークフロー。タスクは複雑な操作を定義し、プロンプト、ツール呼び出し、条件ロジックなどのさまざまなタイプのステップを含むことができます。 + +```mermaid +graph TD + Tasks[Tasks] --> Steps[Workflow Steps] + Steps --> Prompt[Prompt] + Steps --> ToolCalls[Tool Calls] + Steps --> ConditionalLogic[Conditional Logic] +``` + +### ツール +エージェントの能力を拡張する統合。ツールはユーザー定義の関数、システムツール、またはサードパーティのAPI統合である可能性があります。これにより、エージェントはテキスト生成を超えたアクションを実行できます。 + +```mermaid +graph LR + Tools[Tools] --> UserDefinedFunctions[User-Defined Functions] + Tools --> SystemTools[System Tools] + Tools --> ThirdPartyAPIs[Third-Party APIs] +``` + +### ドキュメント +エージェントまたはユーザーに関連付けることができるテキストまたはデータオブジェクト。ドキュメントはベクトル化され、エージェントの対話中にセマンティック検索と取得を可能にするベクトルデータベースに保存されます。 + +```mermaid +graph LR + Documents[Documents] --> VectorDatabase[Vector Database] + Documents --> SemanticSearch[Semantic Search] + Documents --> AgentsOrUsers[Agents or Users] +``` + +### 実行 +特定の入力で開始されたタスクのインスタンス。実行には独自のライフサイクルと状態マシンがあり、長時間実行されるプロセスの監視、管理、および再開が可能です。 + +```mermaid +graph LR + Executions[Executions] --> Tasks[Tasks] + Executions --> Lifecycle[Lifecycle] + Executions --> Monitoring[Monitoring] + Executions --> Management[Management] + Executions --> Resumption[Resumption] +``` + +これらの概念とその相互作用の詳細な説明については、[概念ドキュメント](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)を参照してください。 + +## タスクの理解 + +タスクはJulepのワークフローシステムのコアです。これにより、エージェントが実行できる複雑な多段階のAIワークフローを定義できます。タスクコンポーネントの概要は次のとおりです: + +- **名前と説明**:各タスクには、簡単に識別できるように一意の名前と説明があります。 +- **主要なステップ**:タスクのコアであり、実行されるアクションのシーケンスを定義します。 +- **ツール**:タスク実行中にエージェントの能力を拡張するオプションの統合。 + +### ワークフローステップの種類 + +Julepのタスクには、さまざまな種類のステップを含めることができます: + +1. **プロンプト**:AIモデルにメッセージを送信し、応答を受け取ります。 + ```python + {"prompt": "Analyze the following data: {{data}}"} + ``` + +2. **ツール呼び出し**:統合されたツールまたはAPIを実行します。 + ```python + {"tool": "web_search", "arguments": {"query": "Latest AI developments"}} + ``` + +3. **評価**:計算を実行するか、データを操作します。 + ```python + {"evaluate": {"average_score": "sum(scores) / len(scores)"}} + ``` + +4. **条件ロジック**:条件に基づいてステップを実行します。 + ```python + {"if": "score > 0.8", "then": [...], "else": [...]} + ``` + +5. **ループ**:データを反復処理するか、ステップを繰り返します。 + ```python + {"foreach": {"in": "data_list", "do": [...]}} + ``` + +| ステップ名 | 説明 | 入力 | +|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------| +| **プロンプト** | AIモデルにメッセージを送信し、応答を受け取ります。 | プロンプトテキストまたはテンプレート | +| **ツール呼び出し** | 統合されたツールまたはAPIを実行します。 | ツール名と引数 | +| **評価** | 計算を実行するか、データを操作します。 | 評価する式または変数 | +| **入力待ち** | 入力が受信されるまでワークフローを一時停止します。 | 必要なユーザーまたはシステム入力 | +| **ログ** | 指定された値またはメッセージを記録します。 | 記録するメッセージまたは値 | +| **埋め込み** | テキストを特定の形式またはシステムに埋め込みます。 | 埋め込むテキストまたはコンテンツ | +| **検索** | クエリに基づいてドキュメント検索を実行します。 | 検索クエリ | +| **取得** | キー値ストアから値を取得します。 | キー識別子 | +| **設定** | キー値ストアのキーに値を割り当てます。 | 割り当てるキーと値 | +| **並列** | 複数のステップを並行して実行します。 | 同時に実行するステップのリスト | +| **反復** | コレクションを反復処理し、各アイテムに対してステップを実行します。 | 反復するコレクションまたはリスト | +| **マップリデュース** | コレクションをマップし、式に基づいて結果をリデュースします。 | マップおよびリデュースするコレクションと式 | +| **条件分岐** | 条件に基づいてステップを実行します。 | 評価する条件 | +| **スイッチ** | 複数の条件に基づいてステップを実行します。スイッチケース文に似ています。 | 複数の条件と対応するステップ | +| **生成** | サブワークフローを実行し、その完了を待ちます。 | サブワークフロー識別子と入力データ | +| **エラー** | エラーメッセージを指定してエラーを処理します。 | エラーメッセージまたは処理指示 | +| **スリープ** | 指定された期間ワークフローを一時停止します。 | 期間(秒、分など) | +| **リターン** | ワークフローから値を返します。 | 返す値 | + +各ステップタイプの詳細情報と高度な使用法については、[タスクドキュメント](https://docs.julep.ai/tasks)を参照してください。 + +## 高度な機能 + +Julepは、AIワークフローを強化するための高度な機能を提供します: + +### エージェントにツールを追加する + +外部ツールやAPIを統合してエージェントの能力を拡張します: + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "google", + "method": "search", + "setup": {"api_key": "your_google_api_key"}, + }, +) +``` + +### セッションとユーザーの管理 + +Julepは、持続的なインタラクションのための強力なセッション管理を提供します: + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id="user123", + context_overflow="adaptive" +) + +# 同じセッションで会話を続ける +response = client.sessions.chat( + session_id=session.id, + message="Follow up on our previous conversation." +) +``` + +### ドキュメントの統合と検索 + +エージェントのためのドキュメントを簡単に管理および検索します: + +```python +# ドキュメントをアップロードする +document = client.documents.create( + file="path/to/document.pdf", + metadata={"category": "research_paper"} +) + +# ドキュメントを検索する +results = client.documents.search( + query="AI advancements", + filter={"category": "research_paper"} +) +``` + +高度な機能と詳細な使用法については、[高度な機能ドキュメント](https://docs.julep.ai/advanced-features)を参照してください。 + +## SDKリファレンス + +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## APIリファレンス + +エージェント、タスク、および実行について詳しく学ぶために、包括的なAPIドキュメントを探索してください: + +- [エージェントAPI](https://api.julep.ai/api/docs#tag/agents) +- [タスクAPI](https://api.julep.ai/api/docs#tag/tasks) +- [実行API](https://api.julep.ai/api/docs#tag/executions) + +## 例とチュートリアル + +提供された例を基にして始めるのに役立つ例のプロジェクトとチュートリアルを見つけてください: + +- [例のプロジェクト](https://github.com/julep-ai/julep/tree/main/examples) +- [チュートリアル](https://docs.julep.ai/tutorials) + +## 貢献 + +プロジェクトへの貢献を歓迎します!貢献方法と行動規範を学びましょう: + +- [貢献ガイドライン](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) +- [行動規範](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) + +## サポートとコミュニティ + +コミュニティに参加して、助けを得たり、質問したり、アイデアを共有したりしましょう: + +- [Discord](https://discord.com/invite/JTSBGRZrzj) +- [GitHub Discussions](https://github.com/julep-ai/julep/discussions) +- [Twitter](https://twitter.com/julep_ai) + +## ライセンス + +このプロジェクトは[Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE)の下でライセンスされています。 + +## 謝辞 + +貴重なリソースと貢献を提供してくれたすべての貢献者とオープンソースコミュニティに感謝します。 diff --git a/README.md b/README.md index af87426b1..1a2657966 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The **Quick Start Guide Focused README** is the most promising for optimizing th * **Tone:** Maintain an encouraging and helpful tone throughout the README --> -English | [中文翻译](/README-CN.md) +English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md)
julep From 35ec6af06b57db8131402a9f95e9092b3493d33d Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 6 Oct 2024 12:04:56 -0400 Subject: [PATCH 050/113] fix: Minor html fixes in READMEs Signed-off-by: Diwank Singh Tomer --- README-JP.md | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README-JP.md b/README-JP.md index 6110c5601..9aa04480c 100644 --- a/README-JP.md +++ b/README-JP.md @@ -1,7 +1,7 @@ -[English](README.md) | [中文](README-CN.md) | 日本語 +[English](README.md) | [中文翻译](/README-CN.md) | 日本語
- julep + julep

diff --git a/README.md b/README.md index 1a2657966..ca6e48531 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ The **Quick Start Guide Focused README** is the most promising for optimizing th English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md)

- julep + julep

From d26c977493c13675e79198fbe3abca82c377d181 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 6 Oct 2024 19:15:20 -0400 Subject: [PATCH 051/113] doc: Update README according to feedback, add TOC and collapse devfest callout (#599) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Enhances `README` files by adding TOC and collapsing DevFest.AI callout, and introduces a GitHub Action for TOC generation. > > - **GitHub Actions**: > - Adds `.github/workflows/doctoc-on-dev-push.yml` to generate TOC on push to `dev` branch using `technote-space/toc-generator@v4`. > - **README Updates**: > - Collapses "Contributors and DevFest.AI Participants" section in `README.md`, `README-CN.md`, and `README-JP.md` using `

` and `` tags. > - Removes Julep 1.0 Alpha release announcement from `README.md`, `README-CN.md`, and `README-JP.md`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for b65a1f0f1bfe713220648d08ab20e8ef93087024. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: vedantsahai18 Co-authored-by: creatorrr --- .github/workflows/doctoc-on-dev-push.yml | 15 + README-CN.md | 51 +- README-JP.md | 50 +- README.md | 856 +++++----- agents-api/poetry.lock | 301 ++-- agents-api/pyproject.toml | 1 + cookbooks/01-Website_Crawler_using_Spider.py | 71 + .../02-Sarcastic_News_Headline_Generator.py | 89 ++ .../03-SmartResearcher_With_WebSearch.py | 104 ++ ...4-TripPlanner_With_Weather_And_WikiInfo.py | 123 ++ ...05-Basic_Agent_Creation_and_Interaction.py | 71 + cookbooks/06-Designing_Multi-Step_Tasks.py | 138 ++ .../07-Integrating_External_Tools_and_APIs.py | 126 ++ cookbooks/08-Managing_Persistent_Sessions.py | 137 ++ .../09-User_Management_and_Personalization.py | 188 +++ .../10-Document_Management_and_Search.py | 156 ++ cookbooks/11-Advanced_Chat_Interactions.py | 177 +++ cookbooks/12-Monitoring_Task_Executions.py | 160 ++ cookbooks/13-Error_Handling_and_Recovery.py | 163 ++ cookbooks/IDEAS.md | 1377 +++++++++++++++++ cookbooks/README.md | 9 +- sdks/node-sdk | 2 +- sdks/python-sdk | 2 +- 23 files changed, 3779 insertions(+), 588 deletions(-) create mode 100644 .github/workflows/doctoc-on-dev-push.yml create mode 100644 cookbooks/01-Website_Crawler_using_Spider.py create mode 100644 cookbooks/02-Sarcastic_News_Headline_Generator.py create mode 100644 cookbooks/03-SmartResearcher_With_WebSearch.py create mode 100644 cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py create mode 100644 cookbooks/05-Basic_Agent_Creation_and_Interaction.py create mode 100644 cookbooks/06-Designing_Multi-Step_Tasks.py create mode 100644 cookbooks/07-Integrating_External_Tools_and_APIs.py create mode 100644 cookbooks/08-Managing_Persistent_Sessions.py create mode 100644 cookbooks/09-User_Management_and_Personalization.py create mode 100644 cookbooks/10-Document_Management_and_Search.py create mode 100644 cookbooks/11-Advanced_Chat_Interactions.py create mode 100644 cookbooks/12-Monitoring_Task_Executions.py create mode 100644 cookbooks/13-Error_Handling_and_Recovery.py create mode 100644 cookbooks/IDEAS.md diff --git a/.github/workflows/doctoc-on-dev-push.yml b/.github/workflows/doctoc-on-dev-push.yml new file mode 100644 index 000000000..f70807245 --- /dev/null +++ b/.github/workflows/doctoc-on-dev-push.yml @@ -0,0 +1,15 @@ +on: push + +name: TOC Generator +jobs: + generateTOC: + name: TOC Generator + runs-on: ubuntu-latest + steps: + - uses: technote-space/toc-generator@v4 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAX_HEADER_LEVEL: 2 + TOC_TITLE: '📖 Table of Contents' + FOLDING: true + diff --git a/README-CN.md b/README-CN.md index 437faf13b..55ea307ca 100644 --- a/README-CN.md +++ b/README-CN.md @@ -28,6 +28,12 @@ ***** +> [!TIP] +> 👨‍💻 来参加 devfest.ai 活动?加入我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 并查看下方详情。 + +
+🌟 贡献者和 DevFest.AI 参与者: + ## 🌟 诚邀贡献者! 我们很高兴欢迎新的贡献者加入 Julep 项目!我们创建了几个"适合新手的问题"来帮助您入门。以下是您可以贡献的方式: @@ -51,31 +57,30 @@ ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) -***** - -## 🎉🚀 **激动人心的消息:Julep 1.0 Alpha 版发布!** 🚀🎉 - -我们很高兴地宣布 **Julep 1.0** 的 **alpha** 版本发布!🥳 - -🌟 **新特性:** -- 增强的工作流功能 -- 改进的代理持久性 -- 大量内置工具集成(如 DALL·E、Google 搜索、SendGrid 等) -- 简化的 API - -🧪 尝试使用并帮助塑造 AI 工作流的未来! - -> [!NOTE] -> 在测试阶段,您可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 获取 API 密钥。 - -> [!TIP] -> 🐛 发现了 bug?有建议?我们很乐意听取您的意见! -> 加入我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 或提交 [issue](https://github.com/julep-ai/julep/issues)。 - -请继续关注我们即将发布的稳定版本的更多更新!📢 +
+ + +
+📖 Table of Contents + +- [简介](#%E7%AE%80%E4%BB%8B) +- [特性](#%E7%89%B9%E6%80%A7) +- [安装](#%E5%AE%89%E8%A3%85) +- [快速入门指南](#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97) +- [概念](#%E6%A6%82%E5%BF%B5) +- [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1) +- [高级功能](#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD) +- [SDK 参考](#sdk-%E5%8F%82%E8%80%83) +- [API 参考](#api-%E5%8F%82%E8%80%83) +- [示例和教程](#%E7%A4%BA%E4%BE%8B%E5%92%8C%E6%95%99%E7%A8%8B) +- [贡献](#%E8%B4%A1%E7%8C%AE) +- [支持和社区](#%E6%94%AF%E6%8C%81%E5%92%8C%E7%A4%BE%E5%8C%BA) +- [许可证](#%E8%AE%B8%E5%8F%AF%E8%AF%81) +- [致谢](#%E8%87%B4%E8%B0%A2) -***** +
+ ## 简介 diff --git a/README-JP.md b/README-JP.md index 9aa04480c..8f9e49cc2 100644 --- a/README-JP.md +++ b/README-JP.md @@ -28,6 +28,12 @@ ***** +> [!TIP] +> 👨‍💻 devfest.aiイベントに参加されましたか?私たちの[Discord](https://discord.com/invite/JTSBGRZrzj)に参加して、以下の詳細をご確認ください。 + +
+🌟 コントリビューターとDevFest.AI参加者の皆様へ: + ## 🌟 コントリビューター募集! Julepプロジェクトに新しいコントリビューターを歓迎します!スタートに役立つ「初心者向けの問題」をいくつか作成しました。以下は、貢献する方法です: @@ -51,30 +57,30 @@ Julepプロジェクトに新しいコントリビューターを歓迎します ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) -***** - -## 🎉🚀 **エキサイティングなニュース:Julep 1.0 Alphaリリース!** 🚀🎉 - -**Julep 1.0**の**アルファ**リリースを発表できることを嬉しく思います!🥳 - -🌟 **新機能:** -- 強化されたワークフロー機能 -- 改善されたエージェントの持続性 -- 多数の組み込みツール統合(dalle、google検索、sendgridなど) -- 簡素化されたAPI - -🧪 試してみて、AIワークフローの未来を形作る手助けをしましょう! - -> [!NOTE] -> ベータ版の間、APIキーを取得するには[Discord](https://discord.com/invite/JTSBGRZrzj)でお問い合わせください。 - -> [!TIP] -> 🐛 バグを見つけましたか?提案がありますか?私たちはあなたの意見を聞きたいです! -> [Discord](https://discord.com/invite/JTSBGRZrzj)に参加するか、[issue](https://github.com/julep-ai/julep/issues)を開いてください。 +
-安定版リリースに向けて、さらに多くの更新情報をお楽しみに!📢 + + +
+📖 Table of Contents + +- [紹介](#%E7%B4%B9%E4%BB%8B) +- [特徴](#%E7%89%B9%E5%BE%B4) +- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) +- [クイックスタートガイド](#%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%AC%E3%82%A4%E3%83%89) +- [概念](#%E6%A6%82%E5%BF%B5) +- [タスクの理解](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%90%86%E8%A7%A3) +- [高度な機能](#%E9%AB%98%E5%BA%A6%E3%81%AA%E6%A9%9F%E8%83%BD) +- [SDKリファレンス](#sdk%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) +- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) +- [例とチュートリアル](#%E4%BE%8B%E3%81%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB) +- [貢献](#%E8%B2%A2%E7%8C%AE) +- [サポートとコミュニティ](#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3) +- [ライセンス](#%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9) +- [謝辞](#%E8%AC%9D%E8%BE%9E) -***** +
+ ## 紹介 diff --git a/README.md b/README.md index ca6e48531..37baacbc6 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,3 @@ - - English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md)
@@ -46,6 +28,12 @@ The **Quick Start Guide Focused README** is the most promising for optimizing th ***** +> [!TIP] +> 👨‍💻 Here for the devfest.ai event? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below. + +
+🌟 Contributors and DevFest.AI Participants + ## 🌟 Call for Contributors! We're excited to welcome new contributors to the Julep project! We've created several "good first issues" to help you get started. Here's how you can contribute: @@ -65,176 +53,210 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - A big thank you to DevFest.AI for organizing this fantastic initiative! > [!TIP] -> Ready to join the fun? **[Tweet to start participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️ +> Ready to join the fun? **[Tweet that you are participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️ ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) -***** +
-## 🎉🚀 **Exciting News: Julep 1.0 Alpha Release!** 🚀🎉 + + +
+📖 Table of Contents + +- [Quick Intro](#quick-intro) +- [Key Features](#key-features) +- [Why Julep vs. LangChain?](#why-julep-vs-langchain) +- [Installation](#installation) +- [Python Quick Start 🐍](#python-quick-start-) +- [Node.js Quick Start 🟩](#nodejs-quick-start-) +- [Components](#components) +- [Concepts](#concepts) +- [Understanding Tasks](#understanding-tasks) +- [Advanced Features](#advanced-features) +- [SDK Reference](#sdk-reference) +- [API Reference](#api-reference) -We're thrilled to announce the **alpha** release of Julep 1.0! 🥳 +
+ -🌟 **What's New:** -- Enhanced workflow capabilities -- Improved agent persistence -- Tons of in-built tool integrations (like dalle, google search, sendgrid, etc.) -- Streamlined API +## Quick Intro -🧪 Try it out and help shape the future of AI workflows! + -> [!NOTE] -> While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. +Julep is a platform for creating AI agents that maintain state and execute complex workflows. It offers long-term context and orchestrates multi-step tasks. + +Imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. + +Julep lets you define multi-step tasks that can include conditional logic, loops, parallel processing, and built-in integration with 100s of external tools and APIs. Typically AI applications tend to be linear and have simple chains of a handful of prompts and API calls without much branching or decision-making. + +Imagine a Research AI agent that can do the following: + 1. Take a topic, + 2. Come up with 100 search queries for that topic, + 3. Perform those web searches in parallel, + 4. Collect and compile the results, + 5. Come up with 5 follow-up questions, + 6. Repeat the process with new queries, + 7. Summarize the results, + 8. Send the summary to Discord + +In julep, this would be a single task under 80 lines of code and run fully managed all on its own. Here's a working example: + +```yaml +name: Research Agent + +# Optional: Define the input schema for the task +input_schema: + type: object + properties: + topic: + type: string + description: The main topic to research + +# Define the tools that the agent can use +tools: +- name: web_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +- name: discord_webhook + type: api_call + api_call: + url: "YOUR_DISCORD_WEBHOOK_URL" + method: POST + headers: + Content-Type: application/json + +# Special variables: +# - inputs: for accessing the input to the task +# - outputs: for accessing the output of previous steps +# - _: for accessing the output of the previous step + +# Define the main workflow +main: +- prompt: + - role: system + content: >- + You are a research assistant. + Generate 100 diverse search queries related to the topic: + {{inputs[0].topic}} + + Write one query per line. + unwrap: true + +# Evaluate the search queries using a simple python expression +- evaluate: + search_queries: "_.split('\n')" + +# Run the web search in parallel for each query +- over: "_.search_queries" + map: + tool: web_search + arguments: + query: "_" + on_error: + parallelism: 100 + +# Collect the results from the web search +- evaluate: + results: "'\n'.join([item.result for item in _])" + +# Generate follow-up questions based on the results +- prompt: + - role: system + content: >- + Based on the following research results, generate 5 follow-up questions that would deepen our understanding of {{inputs[0].topic}}: + {{_.results}} + + Write one question per line. + unwrap: true + +- evaluate: + follow_up_queries: "_.split('\n')" + +# Run the web search in parallel for each follow-up query +- over: "_.follow_up_queries" + map: + tool: web_search + arguments: + query: "_" + + parallelism: 5 + +- evaluate: + all_results: "outputs[3].results + '\n'.join([item.result for item in _])" + +# Summarize the results +- prompt: + - role: system + content: > + You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. + The summary should be well-structured, informative, and highlight key findings and insights: + {{_.all_results}} + unwrap: true + +# Send the summary to Discord +- tool: discord_webhook + arguments: + content: > + **Research Summary for {{inputs[0].topic}}** + + {{_}} +``` > [!TIP] -> 🐛 Found a bug? Have a suggestion? We'd love to hear from you! -> Join our [Discord](https://discord.com/invite/JTSBGRZrzj) or open an [issue](https://github.com/julep-ai/julep/issues). +> Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. -Stay tuned for more updates as we approach our stable release! 📢 -***** +## Key Features -## Introduction +1. **Persistent AI Agents**: Persist context and state over long-term interactions. +2. **Stateful Sessions**: Remember past interactions for personalized responses. +3. **Multi-Step Workflows**: Build complex, multi-step processes with loops and conditional logic. +4. **Task Orchestration**: Manage long-running tasks that can run indefinitely. +5. **Built-in Tools**: Integrate built-in tools and external APIs into workflows. +6. **Self-Healing**: Julep will automatically retry failed steps, resend messages, and generally keep your workflows running smoothly. +7. **RAG**: Use Julep's document store to build a RAG system for your own data. -Julep is an open-source platform for creating persistent AI agents with customizable workflows. It provides tools to develop, manage, and deploy AI-driven applications, focusing on flexibility and ease of use. +Julep is ideal for applications that require AI use cases beyond simple prompt-response models. -With Julep, you can: -- Quickly develop AI agents that retain context and state across interactions -- Design and execute sophisticated workflows tailored to your AI agents -- Seamlessly integrate various tools and APIs into your AI workflows -- Effortlessly manage persistent sessions and user interactions +## Why Julep vs. LangChain? -Whether you're developing a chatbot, automating tasks, or building a complex AI assistant, Julep provides the flexibility and features you need to turn your ideas into reality swiftly and efficiently. +### Different Use Cases - - -
-Here's a quick python example: +Think of LangChain and Julep as tools with different focuses within the AI development stack. - +LangChain is great for creating sequences of prompts and managing interactions with LLMs. It has a large ecosystem with lots of pre-built integrations, which makes it convenient if you want to get something up and running quickly. LangChain fits well with simple use cases that involve a linear chain of prompts and API calls. -

-from julep import Julep, AsyncJulep
+Julep, on the other hand, is more about building persistent AI agents that can maintain context over long-term interactions. It shines when you need complex workflows that involve multi-step tasks, conditional logic, and integration with various tools or APIs directly within the agent's process. It's designed from the ground up to manage persistent sessions and complex workflows.
 
-# 🔑 Initialize the Julep client
-#     Or alternatively, use AsyncJulep for async operations
-client = Julep(api_key="your_api_key")
-
-##################
-## 🤖 Agent 🤖 ##
-##################
-
-# Create a research agent
-agent = client.agents.create(
-    name="Research Agent",
-    model="claude-3.5-sonnet",
-    about="You are a research agent designed to handle research inquiries.",
-)
-
-# 🔍 Add a web search tool to the agent
-client.agents.tools.create(
-    agent_id=agent.id,
-    name="web_search",  # Should be python valid variable name
-    description="Use this tool to research inquiries.",
-    integration={
-        "provider": "brave",
-        "method": "search",
-        "setup": {
-            "api_key": "your_brave_api_key",
-        },
-    },
-)
-
-#################
-## 💬 Chat 💬 ##
-#################
-
-# Start an interactive chat session with the agent
-session = client.sessions.create(
-    agent_id=agent.id,
-    context_overflow="adaptive",  # 🧠 Julep will dynamically compute the context window if needed
-)
-
-# 🔄 Chat loop
-while (user_input := input("You: ")) != "exit":
-    response = client.sessions.chat(
-        session_id=session.id,
-        message=user_input,
-    )
+Use Julep if you imagine building a complex AI assistant that needs to:
 
-    print("Agent: ", response.choices[0].message.content)
+- Keep track of user interactions over days or weeks.
+- Perform scheduled tasks, like sending daily summaries or monitoring data sources.
+- Make decisions based on prior interactions or stored data.
+- Interact with multiple external services as part of its workflow.
 
+Then Julep provides the infrastructure to support all that without you having to build it from scratch.
 
-#################
-## 📋 Task 📋 ##
-#################
+### Different Form Factor
 
-# Create a recurring research task for the agent
-task = client.tasks.create(
-    agent_id=agent.id,
-    name="Research Task",
-    description="Research the given topic every 24 hours.",
-    #
-    # 🛠️ Task specific tools
-    tools=[
-        {
-            "name": "send_email",
-            "description": "Send an email to the user with the results.",
-            "api_call": {
-                "method": "post",
-                "url": "https://api.sendgrid.com/v3/mail/send",
-                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
-            },
-        }
-    ],
-    #
-    # 🔢 Task main steps
-    main=[
-        #
-        # Step 1: Research the topic
-        {
-            # `_` (underscore) variable refers to the previous step's output
-            # Here, it points to the topic input from the user
-            "prompt": "Look up topic '{{_.topic}}' and summarize the results.",
-            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 Use the web search tool from the agent
-            "unwrap": True,
-        },
-        #
-        # Step 2: Send email with research results
-        {
-            "tool": "send_email",
-            "arguments": {
-                "subject": "Research Results",
-                "body": "'Here are the research results for today: ' + _.content",
-                "to": "inputs[0].email",  # Reference the email from the user's input
-            },
-        },
-        #
-        # Step 3: Wait for 24 hours before repeating
-        {"sleep": "24 * 60 * 60"},
-    ],
-)
+Julep is a **platform** that includes a language for describing workflows, a server for running those workflows, and an SDK for interacting with the platform. In order to build something with Julep, you write a description of the workflow in `YAML`, and then run the workflow in the cloud.
 
-# 🚀 Start the recurring task
-client.executions.create(task_id=task.id, input={"topic": "Python"})
+Julep is built for heavy-lifting, multi-step, and long-running workflows and there's no limit to how complex the workflow can be.
 
-# 🔁 This will run the task every 24 hours,
-#    research for the topic "Python", and
-#    send the results to the user's email
-
-
+LangChain is a **library** that includes a few tools and a framework for building linear chains of prompts and tools. In order to build something with LangChain, you typically write Python code that configures and runs the model chains you want to use. +LangChain might be sufficient and quicker to implement for simple use cases that involve a linear chain of prompts and API calls. -## Features +### In Summary -Julep simplifies the process of building persistent AI agents with customizable workflows. Key features include: +Use LangChain when you need to manage LLM interactions and prompt sequences in a stateless or short-term context. -- **Persistent AI Agents**: Create and manage AI agents that maintain context across interactions. -- **Customizable Workflows**: Design complex, multi-step AI workflows using Tasks. -- **Tool Integration**: Seamlessly integrate various tools and APIs into your AI workflows. -- **Document Management**: Efficiently manage and search through documents for your agents. -- **Session Management**: Handle persistent sessions for continuous interactions. -- **Flexible Execution**: Support for parallel processing, conditional logic, and error handling in workflows. +Choose Julep when you need a robust framework for stateful agents with advanced workflow capabilities, persistent sessions, and complex task orchestration. ## Installation @@ -250,93 +272,34 @@ or pip install julep ``` -> [!TIP] +> [!NOTE] > ~~Get your API key [here](https://app.julep.ai/api-keys).~~ > > While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. -## Quick Start Guide - -### Step 1: Import Julep +> [!TIP] +> 💻 Are you a _show me the code!™_ kind of person? We have created a ton of cookbooks for you to get started with. **Check out the [cookbooks](/cookbooks)** to browse through examples. +> +> 💡 There's also lots of ideas that you can build on top of Julep. **Check out the [list of ideas](/cookbooks/IDEAS.md)** to get some inspiration. -First, import the Julep SDK into your project: +## Python Quick Start 🐍 -```javascript -const Julep = require('@julep/sdk'); -``` - -or +### Step 1: Create an Agent ```python -from julep import AsyncJulep -``` - -### Step 2: Initialize the Agent +import yaml +from julep import Julep # or AsyncJulep -Create a new agent with basic settings: +client = Julep(api_key="your_julep_api_key") -```javascript -const julep = new Julep({ apiKey: 'your-api-key' }); - -const agent = await julep.agents.create({ - name: 'ResearchAssistant', - model: 'gpt-4-turbo', - about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", -}); -``` - -or - -```python -client = AsyncJulep(api_key="your_api_key") - -agent = await client.agents.create( +agent = client.agents.create( name="Storytelling Agent", - model="gpt-4-turbo", + model="gpt-4o", about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", ) -``` - -### Step 3: Chat with the Agent - -Start an interactive chat session with the agent: -```javascript -const session = await julep.sessions.create({ - agentId: agent.id, -}); - -// Send messages to the agent -const response = await julep.sessions.chat({ - sessionId: session.id, - message: 'Hello, can you tell me a story?', -}); - -console.log(response); -``` - -or - -```python -session = await client.sessions.create(agent_id=agent.id) - -# Send messages to the agent -response = await client.sessions.chat( - session_id=session.id, - message="Hello, can you tell me a story?", -) - -print(response) -``` - - -### Step 4: Create a multi-step Task - -Let's define a multi-step task to create a story and generate a paneled comic strip based on an input idea: - -```python # 🛠️ Add an image generation tool (DALL·E) to the agent -await client.agents.tools.create( +client.agents.tools.create( agent_id=agent.id, name="image_generator", description="Use this tool to generate images based on descriptions.", @@ -344,183 +307,317 @@ await client.agents.tools.create( "provider": "dalle", "method": "generate_image", "setup": { - "api_key": "your_dalle_api_key", + "api_key": "your_openai_api_key", }, }, ) +``` +### Step 2: Create a Task that generates a story and comic strip + +Let's define a multi-step task to create a story and generate a paneled comic strip based on an input idea: + +```python # 📋 Task # Create a task that takes an idea and creates a story and a 4-panel comic strip -task = await client.tasks.create( +task_yaml = """ +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].strip() + panels: re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: "[output.image.url for output in outputs[2]]" +""" + +task = client.tasks.create( agent_id=agent.id, - name="Story and Comic Creator", - description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.", - main=[ - # Step 1: Generate a story and outline into 4 panels - { - "prompt": [ - { - "role": "system", - "content": "You are {{agent.name}}. {{agent.about}}" - }, - { - "role": "user", - "content": ( - "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. " - "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story." - ), - }, - ], - "unwrap": True, - }, - # Step 2: Extract the panel descriptions and story - { - "evaluate": { - "story": "_.split('1. ')[0].strip()", - "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", - } - }, - # Step 3: Generate images for each panel using the image generator tool - { - "foreach": { - "in": "_.panels", - "do": { - "tool": "image_generator", - "arguments": { - "description": "_", - }, - }, - }, - }, - # Step 4: Generate a catchy title for the story - { - "prompt": [ - { - "role": "system", - "content": "You are {{agent.name}}. {{agent.about}}" - }, - { - "role": "user", - "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}", - }, - ], - "unwrap": True, - }, - # Step 5: Return the story, the generated images, and the title - { - "return": { - "title": "outputs[3]", - "story": "outputs[1].story", - "comic_panels": "[output.image.url for output in outputs[2]]", - } - }, - ], + **yaml.safe_load(task_yaml) ) ``` -> [!TIP] -> node.js version of this is similar. - -### Step 5: Execute the Task +### Step 3: Execute the Task ```python # 🚀 Execute the task with an input idea -execution = await client.executions.create( +execution = client.executions.create( task_id=task.id, input={"idea": "A cat who learns to fly"} ) # 🎉 Watch as the story and comic panels are generated -await client.executions.stream(execution_id=execution.id) +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) + +# 📦 Once the execution is finished, retrieve the results +result = client.executions.get(execution_id=execution.id) ``` -This example demonstrates how to create an agent with a custom tool, define a complex task with multiple steps, and execute it to generate a creative output. +### Step 4: Chat with the Agent + +Start an interactive chat session with the agent: + +```python +session = client.sessions.create(agent_id=agent.id) + +# 💬 Send messages to the agent +while (message := input("Enter a message: ")) != "quit": + response = client.sessions.chat( + session_id=session.id, + message=message, + ) - + print(response) +``` > [!TIP] -> You can find another node.js example [here](example.ts) or python example [here](example.py). +> You can find the full python example [here](example.py). -## Concepts -Julep is built on several key technical components that work together to create powerful AI workflows: +## Node.js Quick Start 🟩 -### Agents -AI-powered entities backed by large language models (LLMs) that execute tasks and interact with users. Agents are the core functional units of Julep. +### Step 1: Create an Agent -```mermaid -graph TD - Agent[Agent] --> LLM[Large Language Model] - Agent --> Tasks[Tasks] - Agent --> Users[Users] - Tasks --> Tools[Tools] +```javascript +import { Julep } from '@julep/sdk'; +import yaml from 'js-yaml'; + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +async function createAgent() { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", + }); + + // 🛠️ Add an image generation tool (DALL·E) to the agent + await client.agents.tools.create(agent.id, { + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", + integration: { + provider: "dalle", + method: "generate_image", + setup: { + api_key: "your_openai_api_key", + }, + }, + }); + + return agent; +} ``` -### Users -Entities that interact with agents. Users can be associated with sessions and have their own metadata, allowing for personalized interactions. +### Step 2: Create a Task that generates a story and comic strip -```mermaid -graph LR - User[User] --> Sessions[Sessions] - Sessions --> Agents[Agents] - Sessions --> Metadata[Metadata] +```javascript +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent) { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} ``` -### Sessions -Stateful interactions between agents and users. Sessions maintain context across multiple exchanges and can be configured for different behaviors, including context management and overflow handling. +### Step 3: Execute the Task -```mermaid -graph LR - Sessions[Sessions] --> Agents[Agents] - Sessions --> Users[Users] - Sessions --> ContextManagement[Context Management] - Sessions --> OverflowHandling[Overflow Handling] +```javascript +async function executeTask(task) { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } + }); + + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } + + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} ``` -### Tasks -Multi-step, programmatic workflows that agents can execute. Tasks define complex operations and can include various types of steps, such as prompts, tool calls, and conditional logic. +### Step 4: Chat with the Agent -```mermaid -graph TD - Tasks[Tasks] --> Steps[Workflow Steps] - Steps --> Prompt[Prompt] - Steps --> ToolCalls[Tool Calls] - Steps --> ConditionalLogic[Conditional Logic] +```javascript +async function chatWithAgent(agent) { + const session = await client.sessions.create({ agent_id: agent.id }); + + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} + +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); +} + +runExample().catch(console.error); ``` -### Tools -Integrations that extend an agent's capabilities. Tools can be user-defined functions, system tools, or third-party API integrations. They allow agents to perform actions beyond text generation. +> [!TIP] +> You can find the full Node.js example [here](example.js). + +## Components -```mermaid -graph LR - Tools[Tools] --> UserDefinedFunctions[User-Defined Functions] - Tools --> SystemTools[System Tools] - Tools --> ThirdPartyAPIs[Third-Party APIs] -``` +Julep is made up of the following components: -### Documents -Text or data objects that can be associated with agents or users. Documents are vectorized and stored in a vector database, enabling semantic search and retrieval during agent interactions. +- **Julep Platform**: The Julep platform is a cloud service that runs your workflows. It includes a language for describing workflows, a server for running those workflows, and an SDK for interacting with the platform. +- **Julep SDKs**: Julep SDKs are a set of libraries for building workflows. There are SDKs for Python and JavaScript, with more on the way. +- **Julep API**: The Julep API is a RESTful API that you can use to interact with the Julep platform. -```mermaid -graph LR - Documents[Documents] --> VectorDatabase[Vector Database] - Documents --> SemanticSearch[Semantic Search] - Documents --> AgentsOrUsers[Agents or Users] -``` +### Mental Model + +Think of Julep as a platform that combines both client-side and server-side components to help you build advanced AI agents. Here's how to visualize it: + +1. **Your Application Code:** + - You use the Julep SDK in your application to define agents, tasks, and workflows. + - The SDK provides functions and classes that make it easy to set up and manage these components. + +2. **Julep Backend Service:** + - The SDK communicates with the Julep backend over the network. + - The backend handles execution of tasks, maintains session state, stores documents, and orchestrates workflows. + +3. **Integration with Tools and APIs:** + - Within your workflows, you can integrate external tools and services. + - The backend facilitates these integrations, so your agents can, for example, perform web searches, access databases, or call third-party APIs. + +In simpler terms: +- Julep is a platform for building stateful AI agents. +- You use the SDK (like a toolkit) in your code to define what your agents do. +- The backend service (which you can think of as the engine) runs these definitions, manages state, and handles complexity. -### Executions -Instances of tasks that have been initiated with specific inputs. Executions have their own lifecycle and state machine, allowing for monitoring, management, and resumption of long-running processes. +## Concepts + +Julep is built on several key technical components that work together to create powerful AI workflows: ```mermaid -graph LR - Executions[Executions] --> Tasks[Tasks] - Executions --> Lifecycle[Lifecycle] - Executions --> Monitoring[Monitoring] - Executions --> Management[Management] - Executions --> Resumption[Resumption] +graph TD + User[User] --> Session[Session] + Session --> Agent[Agent] + Agent --> Tasks[Tasks] + Agent --> LLM[Large Language Model] + Tasks --> Tools[Tools] + Tasks --> Documents[Documents] + Documents --> VectorDB[Vector Database] + Agent --> Executions[Executions] + + classDef core fill:#f9f,stroke:#333,stroke-width:2px; + class Agent,Tasks,Session core; ``` -For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md). +- **Agents**: AI-powered entities backed by large language models (LLMs) that execute tasks and interact with users. +- **Users**: Entities that interact with agents through sessions. +- **Sessions**: Stateful interactions between agents and users, maintaining context across multiple exchanges. +- **Tasks**: Multi-step, programmatic workflows that agents can execute, including various types of steps like prompts, tool calls, and conditional logic. +- **Tools**: Integrations that extend an agent's capabilities, including user-defined functions, system tools, or third-party API integrations. +- **Documents**: Text or data objects associated with agents or users, vectorized and stored for semantic search and retrieval. +- **Executions**: Instances of tasks that have been initiated with specific inputs, with their own lifecycle and state machine. + +For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](/docs/julep-concepts.md). ## Understanding Tasks @@ -628,14 +725,15 @@ Easily manage and search through documents for your agents: ```python # Upload a document document = client.documents.create( - file="path/to/document.pdf", + title="AI advancements", + content="AI is changing the world...", metadata={"category": "research_paper"} ) # Search documents results = client.documents.search( query="AI advancements", - filter={"category": "research_paper"} + metadata_filter={"category": "research_paper"} ) ``` @@ -652,34 +750,4 @@ Explore our comprehensive API documentation to learn more about agents, tasks, a - [Agents API](https://api.julep.ai/api/docs#tag/agents) - [Tasks API](https://api.julep.ai/api/docs#tag/tasks) -- [Executions API](https://api.julep.ai/api/docs#tag/executions) - -## Examples and Tutorials - -Discover example projects and tutorials to help you get started and build upon provided examples: - -- [Example Projects](https://github.com/julep-ai/julep/tree/main/examples) -- [Tutorials](https://docs.julep.ai/tutorials) - -## Contributing - -We welcome contributions to the project! Learn how to contribute and our code of conduct: - -- [Contributing Guidelines](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) -- [Code of Conduct](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) - -## Support and Community - -Join our community to get help, ask questions, and share your ideas: - -- [Discord](https://discord.com/invite/JTSBGRZrzj) -- [GitHub Discussions](https://github.com/julep-ai/julep/discussions) -- [Twitter](https://twitter.com/julep_ai) - -## License - -This project is licensed under the [Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE). - -## Acknowledgements - -We would like to express our gratitude to all contributors and the open-source community for their valuable resources and contributions. +- [Executions API](https://api.julep.ai/api/docs#tag/executions) \ No newline at end of file diff --git a/agents-api/poetry.lock b/agents-api/poetry.lock index e4cc58c7b..608a8e665 100644 --- a/agents-api/poetry.lock +++ b/agents-api/poetry.lock @@ -2,113 +2,113 @@ [[package]] name = "aiohappyeyeballs" -version = "2.4.2" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, - {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.6" +version = "3.10.9" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:682836fc672972cc3101cc9e30d49c5f7e8f1d010478d46119fe725a4545acfd"}, - {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:289fa8a20018d0d5aa9e4b35d899bd51bcb80f0d5f365d9a23e30dac3b79159b"}, - {file = "aiohttp-3.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8617c96a20dd57e7e9d398ff9d04f3d11c4d28b1767273a5b1a018ada5a654d3"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbeff1b062751c2a2a55b171f7050fb7073633c699299d042e962aacdbe1a07"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea35d849cdd4a9268f910bff4497baebbc1aa3f2f625fd8ccd9ac99c860c621"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473961b3252f3b949bb84873d6e268fb6d8aa0ccc6eb7404fa58c76a326bb8e1"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d2665c5df629eb2f981dab244c01bfa6cdc185f4ffa026639286c4d56fafb54"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d92f794f1332f656e3765841fc2b7ad5c26c3f3d01e8949eeb3495691cf9f4"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9bd6b2033993d5ae80883bb29b83fb2b432270bbe067c2f53cc73bb57c46065f"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d7f408c43f5e75ea1edc152fb375e8f46ef916f545fb66d4aebcbcfad05e2796"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cf8b8560aa965f87bf9c13bf9fed7025993a155ca0ce8422da74bf46d18c2f5f"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14477c4e52e2f17437b99893fd220ffe7d7ee41df5ebf931a92b8ca82e6fd094"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb138fbf9f53928e779650f5ed26d0ea1ed8b2cab67f0ea5d63afa09fdc07593"}, - {file = "aiohttp-3.10.6-cp310-cp310-win32.whl", hash = "sha256:9843d683b8756971797be171ead21511d2215a2d6e3c899c6e3107fbbe826791"}, - {file = "aiohttp-3.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:f8b8e49fe02f744d38352daca1dbef462c3874900bd8166516f6ea8e82b5aacf"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52e54fd776ad0da1006708762213b079b154644db54bcfc62f06eaa5b896402"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ab1a238fd0d19dc65f2d222e5eb064e409665c6426a3e51d5101c1979ee84"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0749c4d5a08a802dd66ecdf59b2df4d76b900004017468a7bb736c3b5a3dd902"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e05b39158f2af0e2438cc2075cfc271f4ace0c3cc4a81ec95b27a0432e161951"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f196c970db2dcde4f24317e06615363349dc357cf4d7a3b0716c20ac6d7bcd"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47647c8af04a70e07a2462931b0eba63146a13affa697afb4ecbab9d03a480ce"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c0efe7e99f6d94d63274c06344bd0e9c8daf184ce5602a29bc39e00a18720"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9721cdd83a994225352ca84cd537760d41a9da3c0eacb3ff534747ab8fba6d0"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b82c8ebed66ce182893e7c0b6b60ba2ace45b1df104feb52380edae266a4850"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b169f8e755e541b72e714b89a831b315bbe70db44e33fead28516c9e13d5f931"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0be3115753baf8b4153e64f9aa7bf6c0c64af57979aa900c31f496301b374570"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e1f80cd17d81a404b6e70ef22bfe1870bafc511728397634ad5f5efc8698df56"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6419728b08fb6380c66a470d2319cafcec554c81780e2114b7e150329b9a9a7f"}, - {file = "aiohttp-3.10.6-cp311-cp311-win32.whl", hash = "sha256:bd294dcdc1afdc510bb51d35444003f14e327572877d016d576ac3b9a5888a27"}, - {file = "aiohttp-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:bf861da9a43d282d6dd9dcd64c23a0fccf2c5aa5cd7c32024513c8c79fb69de3"}, - {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2708baccdc62f4b1251e59c2aac725936a900081f079b88843dabcab0feeeb27"}, - {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7475da7a5e2ccf1a1c86c8fee241e277f4874c96564d06f726d8df8e77683ef7"}, - {file = "aiohttp-3.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02108326574ff60267b7b35b17ac5c0bbd0008ccb942ce4c48b657bb90f0b8aa"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:029a019627b37fa9eac5c75cc54a6bb722c4ebbf5a54d8c8c0fb4dd8facf2702"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a637d387db6fdad95e293fab5433b775fd104ae6348d2388beaaa60d08b38c4"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1a16f3fc1944c61290d33c88dc3f09ba62d159b284c38c5331868425aca426"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b292f37969f9cc54f4643f0be7dacabf3612b3b4a65413661cf6c350226787"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0754690a3a26e819173a34093798c155bafb21c3c640bff13be1afa1e9d421f9"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:164ecd32e65467d86843dbb121a6666c3deb23b460e3f8aefdcaacae79eb718a"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438c5863feb761f7ca3270d48c292c334814459f61cc12bab5ba5b702d7c9e56"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ba18573bb1de1063d222f41de64a0d3741223982dcea863b3f74646faf618ec7"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c82a94ddec996413a905f622f3da02c4359952aab8d817c01cf9915419525e95"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92351aa5363fc3c1f872ca763f86730ced32b01607f0c9662b1fa711087968d0"}, - {file = "aiohttp-3.10.6-cp312-cp312-win32.whl", hash = "sha256:3e15e33bfc73fa97c228f72e05e8795e163a693fd5323549f49367c76a6e5883"}, - {file = "aiohttp-3.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:fe517113fe4d35d9072b826c3e147d63c5f808ca8167d450b4f96c520c8a1d8d"}, - {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:482f74057ea13d387a7549d7a7ecb60e45146d15f3e58a2d93a0ad2d5a8457cd"}, - {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:03fa40d1450ee5196e843315ddf74a51afc7e83d489dbfc380eecefea74158b1"}, - {file = "aiohttp-3.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e52e59ed5f4cc3a3acfe2a610f8891f216f486de54d95d6600a2c9ba1581f4d"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b3935a22c9e41a8000d90588bed96cf395ef572dbb409be44c6219c61d900d"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bef1480ee50f75abcfcb4b11c12de1005968ca9d0172aec4a5057ba9f2b644f"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:671745ea7db19693ce867359d503772177f0b20fa8f6ee1e74e00449f4c4151d"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50b367308ca8c12e0b50cba5773bc9abe64c428d3fd2bbf5cd25aab37c77bf"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a504d7cdb431a777d05a124fd0b21efb94498efa743103ea01b1e3136d2e4fb"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66bc81361131763660b969132a22edce2c4d184978ba39614e8f8f95db5c95f8"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:27cf19a38506e2e9f12fc17e55f118f04897b0a78537055d93a9de4bf3022e3d"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3468b39f977a11271517c6925b226720e148311039a380cc9117b1e2258a721f"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9d26da22a793dfd424be1050712a70c0afd96345245c29aced1e35dbace03413"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:844d48ff9173d0b941abed8b2ea6a412f82b56d9ab1edb918c74000c15839362"}, - {file = "aiohttp-3.10.6-cp313-cp313-win32.whl", hash = "sha256:2dd56e3c43660ed3bea67fd4c5025f1ac1f9ecf6f0b991a6e5efe2e678c490c5"}, - {file = "aiohttp-3.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:c91781d969fbced1993537f45efe1213bd6fccb4b37bfae2a026e20d6fbed206"}, - {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4407a80bca3e694f2d2a523058e20e1f9f98a416619e04f6dc09dc910352ac8b"}, - {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cb045ec5961f51af3e2c08cd6fe523f07cc6e345033adee711c49b7b91bb954"}, - {file = "aiohttp-3.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fabdcdc781a36b8fd7b2ca9dea8172f29a99e11d00ca0f83ffeb50958da84a1"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a9f42efcc2681790595ab3d03c0e52d01edc23a0973ea09f0dc8d295e12b8e"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cca776a440795db437d82c07455761c85bbcf3956221c3c23b8c93176c278ce7"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5582de171f0898139cf51dd9fcdc79b848e28d9abd68e837f0803fc9f30807b1"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:370e2d47575c53c817ee42a18acc34aad8da4dbdaac0a6c836d58878955f1477"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:444d1704e2af6b30766debed9be8a795958029e552fe77551355badb1944012c"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40271a2a375812967401c9ca8077de9368e09a43a964f4dce0ff603301ec9358"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f3af26f86863fad12e25395805bb0babbd49d512806af91ec9708a272b696248"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4752df44df48fd42b80f51d6a97553b482cda1274d9dc5df214a3a1aa5d8f018"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2cd5290ab66cfca2f90045db2cc6434c1f4f9fbf97c9f1c316e785033782e7d2"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3427031064b0d5c95647e6369c4aa3c556402f324a3e18107cb09517abe5f962"}, - {file = "aiohttp-3.10.6-cp38-cp38-win32.whl", hash = "sha256:614fc21e86adc28e4165a6391f851a6da6e9cbd7bb232d0df7718b453a89ee98"}, - {file = "aiohttp-3.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:58c5d7318a136a3874c78717dd6de57519bc64f6363c5827c2b1cb775bea71dd"}, - {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5db26bbca8e7968c4c977a0c640e0b9ce7224e1f4dcafa57870dc6ee28e27de6"}, - {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fb4216e3ec0dbc01db5ba802f02ed78ad8f07121be54eb9e918448cc3f61b7c"}, - {file = "aiohttp-3.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a976ef488f26e224079deb3d424f29144c6d5ba4ded313198169a8af8f47fb82"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a86610174de8a85a920e956e2d4f9945e7da89f29a00e95ac62a4a414c4ef4e"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:217791c6a399cc4f2e6577bb44344cba1f5714a2aebf6a0bea04cfa956658284"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba3662d41abe2eab0eeec7ee56f33ef4e0b34858f38abf24377687f9e1fb00a5"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4dfa5ad4bce9ca30a76117fbaa1c1decf41ebb6c18a4e098df44298941566f9"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0009258e97502936d3bd5bf2ced15769629097d0abb81e6495fba1047824fe0"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a75d5c9fb4f06c41d029ae70ad943c3a844c40c0a769d12be4b99b04f473d3d"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8198b7c002aae2b40b2d16bfe724b9a90bcbc9b78b2566fc96131ef4e382574d"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4611db8c907f90fe86be112efdc2398cd7b4c8eeded5a4f0314b70fdea8feab0"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ff99ae06eef85c7a565854826114ced72765832ee16c7e3e766c5e4c5b98d20e"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7641920bdcc7cd2d3ddfb8bb9133a6c9536b09dbd49490b79e125180b2d25b93"}, - {file = "aiohttp-3.10.6-cp39-cp39-win32.whl", hash = "sha256:e2e7d5591ea868d5ec82b90bbeb366a198715672841d46281b623e23079593db"}, - {file = "aiohttp-3.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:b504c08c45623bf5c7ca41be380156d925f00199b3970efd758aef4a77645feb"}, - {file = "aiohttp-3.10.6.tar.gz", hash = "sha256:d2578ef941be0c2ba58f6f421a703527d08427237ed45ecb091fed6f83305336"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, + {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, + {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, + {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, + {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, + {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, + {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, + {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, + {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, + {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, + {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, + {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, + {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, + {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, ] [package.dependencies] @@ -1189,13 +1189,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -1206,7 +1206,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -1379,13 +1379,13 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.27.0" +version = "8.28.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c"}, - {file = "ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e"}, + {file = "ipython-8.28.0-py3-none-any.whl", hash = "sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35"}, + {file = "ipython-8.28.0.tar.gz", hash = "sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a"}, ] [package.dependencies] @@ -1646,6 +1646,25 @@ files = [ [package.dependencies] referencing = ">=0.31.0" +[[package]] +name = "julep" +version = "1.14.0" +description = "The official Python library for the julep API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "julep-1.14.0-py3-none-any.whl", hash = "sha256:a2770e63e94bc3ee21e4408d5b9e1595b0cb70cf20abecf3088f66b649616ece"}, + {file = "julep-1.14.0.tar.gz", hash = "sha256:22446414c66983d7496f5857a8b57e76394d3c2ce204bfee3cf5c6c68c4663a5"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +typing-extensions = ">=4.7,<5" + [[package]] name = "jupyter-client" version = "8.6.3" @@ -1904,13 +1923,13 @@ dev = ["Sphinx (>=5.1.1)", "black (==23.12.1)", "build (>=0.10.0)", "coverage (> [[package]] name = "litellm" -version = "1.48.3" +version = "1.48.16" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.48.3-py3-none-any.whl", hash = "sha256:bc6f785ac1ce04ca83e734ccc1982f7cce3ed3ab8d3662baba1b636b6fb6789f"}, - {file = "litellm-1.48.3.tar.gz", hash = "sha256:3be0d1b73240c6956cc9212e476c764e9287abc6fd4c7310b1d18699b5f1be93"}, + {file = "litellm-1.48.16-py3-none-any.whl", hash = "sha256:a7bcce83c97cbacdaf89f24d1c51d81117bcf0af2f0f3a41532656c570d23932"}, + {file = "litellm-1.48.16.tar.gz", hash = "sha256:bda6fc7c8429fcd42c3a80618098678dae833990b2347740aadb84886035b31c"}, ] [package.dependencies] @@ -1919,7 +1938,7 @@ click = "*" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" jsonschema = ">=4.22.0,<5.0.0" -openai = ">=1.45.0" +openai = ">=1.51.0" pydantic = ">=2.0.0,<3.0.0" python-dotenv = ">=0.2.0" requests = ">=2.31.0,<3.0.0" @@ -2509,13 +2528,13 @@ files = [ [[package]] name = "openai" -version = "1.50.1" +version = "1.51.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.50.1-py3-none-any.whl", hash = "sha256:7967fc8372d5e005ad61514586fb286d593facafccedbee00416bc38ee07c2e6"}, - {file = "openai-1.50.1.tar.gz", hash = "sha256:80cbdf275488894c70bfbad711dbba6f31ea71d579b97e364bfd99cdf030158e"}, + {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"}, + {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"}, ] [package.dependencies] @@ -3230,25 +3249,29 @@ files = [ [[package]] name = "pywin32" -version = "306" +version = "307" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-307-cp310-cp310-win32.whl", hash = "sha256:f8f25d893c1e1ce2d685ef6d0a481e87c6f510d0f3f117932781f412e0eba31b"}, + {file = "pywin32-307-cp310-cp310-win_amd64.whl", hash = "sha256:36e650c5e5e6b29b5d317385b02d20803ddbac5d1031e1f88d20d76676dd103d"}, + {file = "pywin32-307-cp310-cp310-win_arm64.whl", hash = "sha256:0c12d61e0274e0c62acee79e3e503c312426ddd0e8d4899c626cddc1cafe0ff4"}, + {file = "pywin32-307-cp311-cp311-win32.whl", hash = "sha256:fec5d27cc893178fab299de911b8e4d12c5954e1baf83e8a664311e56a272b75"}, + {file = "pywin32-307-cp311-cp311-win_amd64.whl", hash = "sha256:987a86971753ed7fdd52a7fb5747aba955b2c7fbbc3d8b76ec850358c1cc28c3"}, + {file = "pywin32-307-cp311-cp311-win_arm64.whl", hash = "sha256:fd436897c186a2e693cd0437386ed79f989f4d13d6f353f8787ecbb0ae719398"}, + {file = "pywin32-307-cp312-cp312-win32.whl", hash = "sha256:07649ec6b01712f36debf39fc94f3d696a46579e852f60157a729ac039df0815"}, + {file = "pywin32-307-cp312-cp312-win_amd64.whl", hash = "sha256:00d047992bb5dcf79f8b9b7c81f72e0130f9fe4b22df613f755ab1cc021d8347"}, + {file = "pywin32-307-cp312-cp312-win_arm64.whl", hash = "sha256:b53658acbfc6a8241d72cc09e9d1d666be4e6c99376bc59e26cdb6223c4554d2"}, + {file = "pywin32-307-cp313-cp313-win32.whl", hash = "sha256:ea4d56e48dc1ab2aa0a5e3c0741ad6e926529510516db7a3b6981a1ae74405e5"}, + {file = "pywin32-307-cp313-cp313-win_amd64.whl", hash = "sha256:576d09813eaf4c8168d0bfd66fb7cb3b15a61041cf41598c2db4a4583bf832d2"}, + {file = "pywin32-307-cp313-cp313-win_arm64.whl", hash = "sha256:b30c9bdbffda6a260beb2919f918daced23d32c79109412c2085cbc513338a0a"}, + {file = "pywin32-307-cp37-cp37m-win32.whl", hash = "sha256:5101472f5180c647d4525a0ed289ec723a26231550dbfd369ec19d5faf60e511"}, + {file = "pywin32-307-cp37-cp37m-win_amd64.whl", hash = "sha256:05de55a7c110478dc4b202230e98af5e0720855360d2b31a44bb4e296d795fba"}, + {file = "pywin32-307-cp38-cp38-win32.whl", hash = "sha256:13d059fb7f10792542082f5731d5d3d9645320fc38814759313e5ee97c3fac01"}, + {file = "pywin32-307-cp38-cp38-win_amd64.whl", hash = "sha256:7e0b2f93769d450a98ac7a31a087e07b126b6d571e8b4386a5762eb85325270b"}, + {file = "pywin32-307-cp39-cp39-win32.whl", hash = "sha256:55ee87f2f8c294e72ad9d4261ca423022310a6e79fb314a8ca76ab3f493854c6"}, + {file = "pywin32-307-cp39-cp39-win_amd64.whl", hash = "sha256:e9d5202922e74985b037c9ef46778335c102b74b95cec70f629453dbe7235d87"}, ] [[package]] @@ -3615,13 +3638,13 @@ files = [ [[package]] name = "rich" -version = "13.8.1" +version = "13.9.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, - {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, ] [package.dependencies] @@ -3799,13 +3822,13 @@ win32 = ["pywin32"] [[package]] name = "sentry-sdk" -version = "2.14.0" +version = "2.15.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:b8bc3dc51d06590df1291b7519b85c75e2ced4f28d9ea655b6d54033503b5bf4"}, - {file = "sentry_sdk-2.14.0.tar.gz", hash = "sha256:1e0e2eaf6dad918c7d1e0edac868a7bf20017b177f242cefe2a6bcd47955961d"}, + {file = "sentry_sdk-2.15.0-py2.py3-none-any.whl", hash = "sha256:8fb0d1a4e1a640172f31502e4503543765a1fe8a9209779134a4ac52d4677303"}, + {file = "sentry_sdk-2.15.0.tar.gz", hash = "sha256:a599e7d3400787d6f43327b973e55a087b931ba2c592a7a7afa691f8eb5e75e2"}, ] [package.dependencies] @@ -4267,13 +4290,13 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -4361,13 +4384,13 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20240906" +version = "2.9.0.20241003" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, - {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, ] [[package]] @@ -4664,4 +4687,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "04ddd9ac6f88a4b8339b1d4fb7e44ea0574b340672542a4f6c4725dd7b23d998" +content-hash = "62fd7359138dfd660b6601064b7c3e732e436fbbc9c9281b42ad3e46ff3a6c04" diff --git a/agents-api/pyproject.toml b/agents-api/pyproject.toml index 3904ae394..2ed126d6f 100644 --- a/agents-api/pyproject.toml +++ b/agents-api/pyproject.toml @@ -51,6 +51,7 @@ jupyterlab = "^4.2.4" ipywidgets = "^8.1.3" wat-inspector = "^0.2.1" +julep = ">=1.0,<2.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/cookbooks/01-Website_Crawler_using_Spider.py b/cookbooks/01-Website_Crawler_using_Spider.py new file mode 100644 index 000000000..978fd3286 --- /dev/null +++ b/cookbooks/01-Website_Crawler_using_Spider.py @@ -0,0 +1,71 @@ +import os +import uuid +import yaml +from julep import Client + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = os.getenv("JULEP_API_KEY") +if not api_key: + raise ValueError("JULEP_API_KEY not found in environment variables") + +client = Client(api_key=api_key, environment="dev") + +# Creating an "agent" +name = "Jarvis" +about = "The original AI conscious the Iron Man." + +# Create the agent +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4o", +) + +# Defining a Task +task_def = yaml.safe_load(""" +name: Agent Crawler + +tools: +- name: spider_crawler + type: integration + integration: + provider: spider + setup: + spider_api_key: "{{SPIDER_API_KEY}}" + +main: +- tool: spider_crawler + arguments: + url: '"https://spider.cloud"' +""") + +# Creating/Updating a task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Creating an Execution +execution = client.executions.create( + task_id=TASK_UUID, + input={} +) + +# Getting the execution details +execution = client.executions.get(execution.id) +print("Execution output:", execution.output) + +# Listing all the steps of a defined task +transitions = client.executions.transitions.list(execution_id=execution.id).items +print("Execution transitions:", transitions) + +# Streaming the execution steps +print("Streaming execution transitions:") +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) \ No newline at end of file diff --git a/cookbooks/02-Sarcastic_News_Headline_Generator.py b/cookbooks/02-Sarcastic_News_Headline_Generator.py new file mode 100644 index 000000000..c658a6569 --- /dev/null +++ b/cookbooks/02-Sarcastic_News_Headline_Generator.py @@ -0,0 +1,89 @@ +import os +import uuid +import yaml +from julep import Client + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Create Julep Client with the API Key +api_key = os.getenv("JULEP_API_KEY") +if not api_key: + raise ValueError("JULEP_API_KEY not found in environment variables") + +client = Client(api_key=api_key, environment="dev") + +# Define agent properties +name = "Sarcastic News Bot" +about = "An AI agent specialized in generating sarcastic news headlines." +default_settings = { + "temperature": 0.7, + "top_p": 1, + "min_p": 0.01, + "presence_penalty": 0, + "frequency_penalty": 0, + "length_penalty": 1.0, + "max_tokens": 150, +} + +# Create the agent +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4o", +) + +# Define the task +task_def = yaml.safe_load(""" +name: Sarcasm Headline Generator + +tools: +- name: brave_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +main: +- tool: brave_search + arguments: + query: "_.topic + ' funny'" + +- prompt: + - role: system + content: >- + You are a sarcastic news headline writer. Generate a witty and sarcastic headline + for the topic {{inputs[0].topic}}. Use the following information for context: {{_}} + unwrap: true +""") + +# Creating/Updating a task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Creating an Execution +execution = client.executions.create( + task_id=TASK_UUID, + input={ + "topic": "elon musk" + } +) + +# Getting the execution details +execution = client.executions.get(execution.id) +print("Execution output:", execution.output) + +# Listing all the steps of a defined task +transitions = client.executions.transitions.list(execution_id=execution.id).items +print("Execution transitions:", transitions) + +# Stream the steps of the defined task +print("Streaming execution transitions:") +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) diff --git a/cookbooks/03-SmartResearcher_With_WebSearch.py b/cookbooks/03-SmartResearcher_With_WebSearch.py new file mode 100644 index 000000000..9996a5dd5 --- /dev/null +++ b/cookbooks/03-SmartResearcher_With_WebSearch.py @@ -0,0 +1,104 @@ +import uuid +from julep import Client +import yaml + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an "agent" +name = "Jarvis" +about = "The original AI conscious the Iron Man." +default_settings = { + "temperature": 0.7, + "top_p": 1, + "min_p": 0.01, + "presence_penalty": 0, + "frequency_penalty": 0, + "length_penalty": 1.0, + "max_tokens": 150, +} + +# Create the agent +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4o", +) + +# Defining a Task +task_def = yaml.safe_load(""" +name: Research Assistant to find Wikipedia Keywords + +input_schema: + type: object + properties: + topics: + type: array + items: + type: string + description: The topics to search for. + +tools: +- name: brave_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_API_KEY" + +main: +- over: _.topics + map: + tool: brave_search + arguments: + query: "'the latest news about ' + _" + +- over: _ + parallelism: 2 + map: + prompt: + - role: system + content: >- + You are a research assistant. + I need you to do in-depth research on topics trending in the news currently. + Based on the following latest html news snippet, come up with a list of wikipedia keywords to search: + "{{_}}" + Your response should be a list of keywords, separated by commas. Do not add any other text. + Example: `KEYWORDS: keyword1, keyword2, keyword3` + + unwrap: true +""") + +# Creating/Updating a task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Creating an Execution +execution = client.executions.create( + task_id=task.id, + input={ + "topics": ["Burger King Cup on the Ground Behind a Wendy's", "Forbidden Chemical X", "Finger Bracelets", "Amusing Notions"] + } +) + +print(execution.id) + +# Getting the execution details +execution = client.executions.get(execution.id) +print(execution.output) + +# Listing all the steps of a defined task +transitions = client.executions.transitions.list(execution_id=execution.id).items +print(transitions) + +# Streaming the execution steps +client.executions.transitions.stream(execution_id=execution.id) \ No newline at end of file diff --git a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py new file mode 100644 index 000000000..cde5d71a6 --- /dev/null +++ b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py @@ -0,0 +1,123 @@ +import uuid +import yaml +from julep import Client + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an "agent" +name = "Jarvis" +about = "The original AI conscious the Iron Man." +default_settings = { + "temperature": 0.7, + "top_p": 1, + "min_p": 0.01, + "presence_penalty": 0, + "frequency_penalty": 0, + "length_penalty": 1.0, + "max_tokens": 150, +} + +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4o", +) + +# Defining a Task +task_def = yaml.safe_load(""" +name: Tourist Plan With Weather And Attractions + +input_schema: + type: object + properties: + locations: + type: array + items: + type: string + description: The locations to search for. + +tools: +- name: wikipedia + type: integration + integration: + provider: wikipedia + +- name: weather + type: integration + integration: + provider: weather + setup: + openweathermap_api_key: "YOUR_API_KEY" + +main: +- over: inputs[0].locations + map: + tool: weather + arguments: + location: _ + +- over: inputs[0].locations + map: + tool: wikipedia + arguments: + query: "_ + ' tourist attractions'" + +- evaluate: + zipped: "list(zip(inputs[0].locations, [output['result'] for output in outputs[0]], [output['documents'][0]['page_content'] for output in outputs[1]]))" # [(location, weather, attractions)] + +- over: _['zipped'] + parallelism: 3 + map: + prompt: + - role: system + content: >- + You are a travel assistant. Your task is to create a detailed itinerary for visiting tourist attractions in "{{_[0]}}" based on the weather conditions and the top tourist attractions provided. + + Current weather condition at "{{_[0]}}": + "{{_[1]}}" + + Top tourist attractions in "{{_[0]}}": + "{{_[2]}}" + + Suggest outdoor or indoor activities based on the above information. + unwrap: true +""") + +# Creating/Updating a task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Creating an Execution +execution = client.executions.create( + task_id=task.id, + input={ + "locations": ["New York", "London", "Paris", "Tokyo", "Sydney"] + } +) + +print(f"Execution ID: {execution.id}") + +# Getting the execution details +execution = client.executions.get(execution.id) +print("Execution Output:") +print(execution.output) + +# List all steps of the executed task +print("Execution Steps:") +for item in client.executions.transitions.list(execution_id=execution.id).items: + print(item) + +# Stream the execution steps in real-time +print("Streaming Execution Steps:") +for step in client.executions.transitions.stream(execution_id=execution.id): + print(step) \ No newline at end of file diff --git a/cookbooks/05-Basic_Agent_Creation_and_Interaction.py b/cookbooks/05-Basic_Agent_Creation_and_Interaction.py new file mode 100644 index 000000000..c701471f7 --- /dev/null +++ b/cookbooks/05-Basic_Agent_Creation_and_Interaction.py @@ -0,0 +1,71 @@ +import uuid +from julep import Client + +# Global UUID is generated for agent +AGENT_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an "agent" +name = "Jarvis" +about = "A friendly and knowledgeable AI assistant." +default_settings = { + "temperature": 0.7, + "top_p": 1, + "min_p": 0.01, + "presence_penalty": 0, + "frequency_penalty": 0, + "length_penalty": 1.0, + "max_tokens": 150, +} + +# Create the agent +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4-turbo", +) + +print(f"Agent created with ID: {agent.id}") + +# Create a session for interaction +session = client.sessions.create( + agent=agent.id, + context_overflow="adaptive" +) + +print(f"Session created with ID: {session.id}") + +# Function to chat with the agent +def chat_with_agent(message): + message = { + "role": "user", + "content": message, + } + # TODO: message validation error + response = client.sessions.chat( + session_id=session.id, + messages=[message], + ) + return response.choices[0].message.content + +# Demonstrate basic interaction +print("Agent: Hello! I'm Jarvis, your AI assistant. How can I help you today?") + +while True: + user_input = input("You: ") + if user_input.lower() in ['exit', 'quit', 'bye']: + print("Agent: Goodbye! It was nice chatting with you.") + break + + response = chat_with_agent(user_input) + print(f"Agent: {response}") + +# Optional: Retrieve chat history +history = client.sessions.messages.list(session_id=session.id) +print("\nChat History:") +for message in history.items: + print(f"{message.role}: {message.content}") \ No newline at end of file diff --git a/cookbooks/06-Designing_Multi-Step_Tasks.py b/cookbooks/06-Designing_Multi-Step_Tasks.py new file mode 100644 index 000000000..395f409cf --- /dev/null +++ b/cookbooks/06-Designing_Multi-Step_Tasks.py @@ -0,0 +1,138 @@ +import uuid +import yaml +from julep import Client + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an "agent" +name = "Multi-Step Task Agent" +about = "An agent capable of executing complex multi-step tasks." +default_settings = { + "temperature": 0.7, + "top_p": 1, + "min_p": 0.01, + "presence_penalty": 0, + "frequency_penalty": 0, + "length_penalty": 1.0, + "max_tokens": 150, +} + +# Create the agent +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4-turbo", +) + +# Add a web search tool to the agent +client.agents.tools.create( + agent_id=AGENT_UUID, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) + +# Defining a Task with various step types +task_def = yaml.safe_load(""" +name: Multi-Step Task Demonstration + +input_schema: + type: object + properties: + topic: + type: string + description: The topic to research and summarize. + +tools: +- name: web_search + type: integration + integration: + provider: brave + setup: + api_key: "your_api_key" + +main: +# Step 1: Prompt - Initial research question +- prompt: + - role: system + content: "You are a research assistant. Your task is to formulate three specific research questions about the given topic: {{inputs[0].topic}}" + unwrap: true + +# Step 2: Tool Call - Web search for each question +- foreach: + in: "_.split('\n')" + do: + tool: web_search + arguments: + query: _ + +# Step 3: Evaluate - Extract relevant information +- evaluate: + relevant_info: "[output for output in _]" + +# Step 4: Conditional Logic - Check if enough information is gathered +- if: "len(_.relevant_info) >= 3" + then: + prompt: + - role: system + content: "Summarize the following information about {{inputs[0].topic}}:\n{{_.relevant_info}}" + unwrap: true + else: + prompt: + - role: system + content: "Not enough information gathered. Please provide a brief overview of {{inputs[0].topic}} based on your knowledge." + unwrap: true + +# Step 5: Log - Record the summary +- log: "Summary for {{inputs[0].topic}}: {{_}}" + +# Step 6: Return - Final output +- return: + summary: "_" + topic: "inputs[0].topic" + +""") + +# Creating/Updating a task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Creating an Execution +execution = client.executions.create( + task_id=TASK_UUID, + input={ + "topic": "Artificial Intelligence in Healthcare" + } +) + +print(f"Execution ID: {execution.id}") + +# Getting the execution details +execution = client.executions.get(execution.id) +print("Execution Output:") +print(execution.output) + +# Listing all the steps of a defined task +transitions = client.executions.transitions.list(execution_id=execution.id).items +print("Execution Steps:") +for transition in transitions: + print(transition) + +# Streaming the execution steps +print("Streaming Execution Steps:") +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) \ No newline at end of file diff --git a/cookbooks/07-Integrating_External_Tools_and_APIs.py b/cookbooks/07-Integrating_External_Tools_and_APIs.py new file mode 100644 index 000000000..fa93f687a --- /dev/null +++ b/cookbooks/07-Integrating_External_Tools_and_APIs.py @@ -0,0 +1,126 @@ +import uuid +import yaml +from julep import Client + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an "agent" +name = "Multi-Tool Analyst" +about = "An AI agent capable of using multiple external tools and APIs to gather and analyze information." + +# Create the agent +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name=name, + about=about, + model="gpt-4-turbo", +) + +# Defining a Task +task_def = yaml.safe_load(""" +name: Comprehensive Analysis Report + +input_schema: + type: object + properties: + topic: + type: string + description: The main topic to analyze. + location: + type: string + description: A location related to the topic for weather and news analysis. + +tools: +- name: brave_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +- name: weather + type: integration + integration: + provider: weather + setup: + openweathermap_api_key: "YOUR_OPENWEATHERMAP_API_KEY" + +- name: wikipedia + type: integration + integration: + provider: wikipedia + +main: +- tool: brave_search + arguments: + query: "{{inputs[0].topic}} latest developments" + +- tool: weather + arguments: + location: "{{inputs[0].location}}" + +- tool: wikipedia + arguments: + query: "{{inputs[0].topic}}" + +- prompt: + - role: system + content: >- + You are a comprehensive analyst. Your task is to create a detailed report on the topic "{{inputs[0].topic}}" + using the information gathered from various sources. Include the following sections in your report: + + 1. Overview (based on Wikipedia data) + 2. Latest Developments (based on Brave Search results) + 3. Weather Impact (if applicable, based on weather data for {{inputs[0].location}}) + 4. Analysis and Conclusions + + Use the following data for your report: + + Brave Search Results: {{outputs[0]}} + Weather Data: {{outputs[1]}} + Wikipedia Data: {{outputs[2]}} + + Provide a well-structured, informative report that synthesizes information from all these sources. + unwrap: true + +- return: _ +""") + +# Creating/Updating a task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Creating an Execution +execution = client.executions.create( + task_id=task.id, + input={ + "topic": "Renewable Energy", + "location": "Berlin, Germany" + } +) + +print(f"Execution ID: {execution.id}") + +# Getting the execution details +execution = client.executions.get(execution.id) +print("Execution Output:") +print(execution.output) + +# List all steps of the executed task +print("Execution Steps:") +for item in client.executions.transitions.list(execution_id=execution.id).items: + print(item) + +# Stream the execution steps in real-time +print("Streaming Execution Steps:") +for step in client.executions.transitions.stream(execution_id=execution.id): + print(step) \ No newline at end of file diff --git a/cookbooks/08-Managing_Persistent_Sessions.py b/cookbooks/08-Managing_Persistent_Sessions.py new file mode 100644 index 000000000..40077b7df --- /dev/null +++ b/cookbooks/08-Managing_Persistent_Sessions.py @@ -0,0 +1,137 @@ +# Managing Persistent Sessions Cookbook +# +# Plan: +# 1. Import necessary libraries and set up the Julep client +# 2. Create an agent for handling persistent sessions +# 3. Define a task for managing user context +# 4. Create a function to simulate user interactions +# 5. Implement a loop to demonstrate persistent sessions with context management +# 6. Show how to handle context overflow +# 7. Display the session history and context at the end + +import uuid +import yaml +from julep import Client +import time + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an agent for handling persistent sessions +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name="Session Manager", + about="An AI agent specialized in managing persistent sessions and context.", + model="gpt-4-turbo", +) + +# Defining a task for managing user context +task_def = yaml.safe_load(""" +name: Manage User Context + +input_schema: + type: object + properties: + user_input: + type: string + session_context: + type: object + +main: +- prompt: + role: system + content: >- + You are a session management agent. Your task is to maintain context + across user interactions. Here's the current context: {{inputs[0].session_context}} + + User input: {{inputs[0].user_input}} + + Respond to the user and update the context with any new relevant information. + unwrap: true + +- evaluate: + updated_context: >- + {**inputs[0].session_context, + 'last_interaction': inputs[0].user_input, + 'agent_response': _} + +- return: + response: _ + context: outputs[1].updated_context +""") + +# Creating the task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Function to simulate user interactions +def user_interaction(prompt): + return input(prompt) + +# Create a session +session = client.sessions.create( + agent_id=AGENT_UUID, + context_overflow="adaptive" # Use adaptive context management +) + +# Initialize session context +context = {} + +# Simulate a conversation with persistent context +for i in range(5): + user_input = user_interaction(f"User (Interaction {i+1}): ") + + # Execute the task with user input and current context + execution = client.executions.create( + task_id=TASK_UUID, + input={ + "user_input": user_input, + "session_context": context + } + ) + + # Get the execution result + result = client.executions.get(execution.id) + + # Update the context and print the response + context = result.output['context'] + print(f"Agent: {result.output['response']}") + print(f"Updated Context: {context}") + print() + + # Simulate a delay between interactions + time.sleep(1) + +# Display final session information +print("Final Session Information:") +print(f"Session ID: {session.id}") +print(f"Final Context: {context}") + +# Demonstrate context overflow handling +print("\nDemonstrating Context Overflow Handling:") +large_input = "This is a very large input " * 1000 # Create a large input to trigger overflow +overflow_execution = client.executions.create( + task_id=TASK_UUID, + input={ + "user_input": large_input, + "session_context": context + } +) + +overflow_result = client.executions.get(overflow_execution.id) +print(f"Agent response to large input: {overflow_result.output['response']}") +print(f"Updated context after overflow: {overflow_result.output['context']}") + +# Display session history +print("\nSession History:") +history = client.sessions.messages.list(session_id=session.id) +for message in history.items: + print(f"{message.role}: {message.content}") \ No newline at end of file diff --git a/cookbooks/09-User_Management_and_Personalization.py b/cookbooks/09-User_Management_and_Personalization.py new file mode 100644 index 000000000..18f9df238 --- /dev/null +++ b/cookbooks/09-User_Management_and_Personalization.py @@ -0,0 +1,188 @@ +# User Management and Personalization Cookbook +# +# Plan: +# 1. Import necessary libraries and set up the Julep client +# 2. Create an agent for handling user management and personalization +# 3. Define a task for user registration and profile creation +# 4. Define a task for personalized content recommendation +# 5. Create sample users with different preferences +# 6. Demonstrate user registration and profile creation +# 7. Show personalized content recommendations for different users +# 8. Implement a function to update user preferences +# 9. Display updated personalized recommendations after preference changes + +import uuid +import yaml +from julep import Client + +# Global UUIDs for agent and tasks +AGENT_UUID = uuid.uuid4() +REGISTRATION_TASK_UUID = uuid.uuid4() +RECOMMENDATION_TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an agent for user management and personalization +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name="Personalization Assistant", + about="An AI agent specialized in user management and personalized content recommendations.", + model="gpt-4-turbo", +) + +# Defining a task for user registration and profile creation +registration_task_def = yaml.safe_load(""" +name: User Registration and Profile Creation + +input_schema: + type: object + properties: + username: + type: string + interests: + type: array + items: + type: string + +main: +- prompt: + role: system + content: >- + You are a user registration assistant. Create a user profile based on the following information: + Username: {{inputs[0].username}} + Interests: {{inputs[0].interests}} + + Generate a brief bio and suggest some initial content preferences based on the user's interests. + unwrap: true + +- evaluate: + user_profile: >- + { + "username": inputs[0].username, + "interests": inputs[0].interests, + "bio": _.split('\n\n')[0], + "content_preferences": _.split('\n\n')[1] + } + +- return: outputs[1].user_profile +""") + +# Creating the registration task +registration_task = client.tasks.create_or_update( + task_id=REGISTRATION_TASK_UUID, + agent_id=AGENT_UUID, + **registration_task_def +) + +# Defining a task for personalized content recommendation +recommendation_task_def = yaml.safe_load(""" +name: Personalized Content Recommendation + +input_schema: + type: object + properties: + user_profile: + type: object + +tools: +- name: content_database + type: integration + integration: + provider: mock + setup: + data: [ + {"id": 1, "title": "Introduction to AI", "category": "Technology"}, + {"id": 2, "title": "Healthy Eating Habits", "category": "Health"}, + {"id": 3, "title": "Financial Planning 101", "category": "Finance"}, + {"id": 4, "title": "The Art of Photography", "category": "Art"}, + {"id": 5, "title": "Beginner's Guide to Yoga", "category": "Fitness"} + ] + +main: +- tool: content_database + arguments: {} + +- prompt: + role: system + content: >- + You are a content recommendation system. Based on the user's profile and the available content, + recommend 3 pieces of content that best match the user's interests and preferences. + + User Profile: + {{inputs[0].user_profile}} + + Available Content: + {{outputs[0]}} + + Provide your recommendations in the following format: + 1. [Content ID] - [Content Title] - Reason for recommendation + 2. [Content ID] - [Content Title] - Reason for recommendation + 3. [Content ID] - [Content Title] - Reason for recommendation + unwrap: true + +- return: _ +""") + +# Creating the recommendation task +recommendation_task = client.tasks.create_or_update( + task_id=RECOMMENDATION_TASK_UUID, + agent_id=AGENT_UUID, + **recommendation_task_def +) + +# Function to register a user and create their profile +def register_user(username, interests): + execution = client.executions.create( + task_id=REGISTRATION_TASK_UUID, + input={ + "username": username, + "interests": interests + } + ) + result = client.executions.get(execution.id) + return result.output + +# Function to get personalized content recommendations +def get_recommendations(user_profile): + execution = client.executions.create( + task_id=RECOMMENDATION_TASK_UUID, + input={ + "user_profile": user_profile + } + ) + result = client.executions.get(execution.id) + return result.output + +# Function to update user preferences +def update_user_preferences(user_profile, new_interests): + user_profile["interests"] = list(set(user_profile["interests"] + new_interests)) + return user_profile + +# Demonstrate user registration and personalization +print("Demonstrating User Management and Personalization:") + +# Register users +user1 = register_user("alice", ["technology", "finance"]) +user2 = register_user("bob", ["health", "fitness"]) + +print("\nUser Profiles:") +print(f"Alice: {user1}") +print(f"Bob: {user2}") + +# Get personalized recommendations +print("\nPersonalized Recommendations:") +print("Alice's Recommendations:") +print(get_recommendations(user1)) +print("\nBob's Recommendations:") +print(get_recommendations(user2)) + +# Update user preferences +print("\nUpdating User Preferences:") +updated_alice = update_user_preferences(user1, ["art"]) +print(f"Alice's Updated Profile: {updated_alice}") + +# Get updated recommendations +print("\nUpdated Personalized Recommendations for Alice:") +print(get_recommendations(updated_alice)) \ No newline at end of file diff --git a/cookbooks/10-Document_Management_and_Search.py b/cookbooks/10-Document_Management_and_Search.py new file mode 100644 index 000000000..87cc492aa --- /dev/null +++ b/cookbooks/10-Document_Management_and_Search.py @@ -0,0 +1,156 @@ +# Document Management and Search Cookbook +# +# Plan: +# 1. Import necessary libraries and set up the Julep client +# 2. Create an agent for document management +# 3. Define a task for document upload and indexing +# 4. Define a task for document search +# 5. Create sample documents +# 6. Execute the document upload and indexing task +# 7. Execute the document search task +# 8. Display the search results + +import uuid +import yaml +from julep import Client + +# Global UUID is generated for agent and tasks +AGENT_UUID = uuid.uuid4() +UPLOAD_TASK_UUID = uuid.uuid4() +SEARCH_TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an agent for document management +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name="Document Manager", + about="An AI agent specialized in document management and search.", + model="gpt-4o", +) + +# Defining a task for document upload and indexing +upload_task_def = yaml.safe_load(""" +name: Document Upload and Indexing + +input_schema: + type: object + properties: + documents: + type: array + items: + type: object + properties: + content: + type: string + metadata: + type: object + +main: +- over: inputs[0].documents + map: + tool: document_upload + arguments: + content: _.content + metadata: _.metadata + +- prompt: + role: system + content: >- + You have successfully uploaded and indexed {{len(outputs[0])}} documents. + Provide a summary of the uploaded documents. +""") + +# Creating the upload task +upload_task = client.tasks.create_or_update( + task_id=UPLOAD_TASK_UUID, + agent_id=AGENT_UUID, + **upload_task_def +) + +# Defining a task for document search +search_task_def = yaml.safe_load(""" +name: Document Search + +input_schema: + type: object + properties: + query: + type: string + filters: + type: object + +main: +- tool: document_search + arguments: + query: inputs[0].query + filters: inputs[0].filters + +- prompt: + role: system + content: >- + Based on the search results, provide a summary of the most relevant documents found. + Search query: {{inputs[0].query}} + Number of results: {{len(outputs[0])}} + + Results: + {{outputs[0]}} +""") + +# Creating the search task +search_task = client.tasks.create_or_update( + task_id=SEARCH_TASK_UUID, + agent_id=AGENT_UUID, + **search_task_def +) + +# Sample documents +sample_documents = [ + { + "content": "Artificial Intelligence (AI) is revolutionizing various industries, including healthcare, finance, and transportation.", + "metadata": {"category": "technology", "author": "John Doe"} + }, + { + "content": "Climate change is a pressing global issue that requires immediate action from governments, businesses, and individuals.", + "metadata": {"category": "environment", "author": "Jane Smith"} + }, + { + "content": "The COVID-19 pandemic has accelerated the adoption of remote work and digital technologies across many organizations.", + "metadata": {"category": "business", "author": "Alice Johnson"} + } +] + +# Execute the document upload and indexing task +upload_execution = client.executions.create( + task_id=UPLOAD_TASK_UUID, + input={"documents": sample_documents} +) + +print("Uploading and indexing documents...") +upload_result = client.executions.get(upload_execution.id) +print(upload_result.output) + +# Execute the document search task +search_execution = client.executions.create( + task_id=SEARCH_TASK_UUID, + input={ + "query": "impact of technology on society", + "filters": {"category": "technology"} + } +) + +print("\nSearching documents...") +search_result = client.executions.get(search_execution.id) +print(search_result.output) + +# Display the search results +print("\nSearch Results:") +for transition in client.executions.transitions.list(execution_id=search_execution.id).items: + if transition.type == "tool_call" and transition.tool == "document_search": + for doc in transition.output: + print(f"- {doc['content']} (Score: {doc['score']})") + +print("\nSearch Summary:") +print(search_result.output) \ No newline at end of file diff --git a/cookbooks/11-Advanced_Chat_Interactions.py b/cookbooks/11-Advanced_Chat_Interactions.py new file mode 100644 index 000000000..692112be1 --- /dev/null +++ b/cookbooks/11-Advanced_Chat_Interactions.py @@ -0,0 +1,177 @@ +# Advanced Chat Interactions Cookbook +# +# Plan: +# 1. Import necessary libraries and set up the Julep client +# 2. Create an agent for advanced chat interactions +# 3. Define a task for handling complex conversations with context management +# 4. Implement a function to simulate user input +# 5. Create a chat session and demonstrate advanced interactions: +# a. Multi-turn conversation with context retention +# b. Handling context overflow +# c. Conditional responses based on user input +# d. Integrating external information during the conversation +# 6. Display the chat history and any relevant metrics + +import uuid +import yaml +import os +from julep import Client +import time + +# Global UUIDs for agent and task +AGENT_UUID = uuid.uuid4() +CHAT_TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = os.getenv("JULEP_API_KEY") +if not api_key: + raise ValueError("JULEP_API_KEY not found in environment variables") + +client = Client(api_key=api_key, environment="dev") + +# Creating an agent for advanced chat interactions +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name="Advanced Chat Assistant", + about="An AI agent capable of handling complex conversations with context management and external integrations.", + model="gpt-4-turbo", +) + +# Add a web search tool to the agent +client.agents.tools.create( + agent_id=AGENT_UUID, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "YOUR_BRAVE_API_KEY"}, + }, +) + +# Defining a task for handling complex conversations +chat_task_def = yaml.safe_load(""" +name: Advanced Chat Interaction + +input_schema: + type: object + properties: + user_input: + type: string + chat_history: + type: array + items: + type: object + properties: + role: + type: string + content: + type: string + +tools: +- name: weather_api + type: integration + integration: + provider: weather + setup: + api_key: "YOUR_WEATHER_API_KEY" + +main: +- evaluate: + context_length: len(inputs[0].chat_history) + +- if: + condition: _.context_length > 10 + then: + - evaluate: + summarized_history: "Summarize the following chat history: " + str(inputs[0].chat_history[-10:]) + - prompt: + role: system + content: >- + You are an advanced chat assistant. Here's a summary of the recent conversation: + {{outputs[1].summarized_history}} + + Now, respond to the user's latest input: {{inputs[0].user_input}} + else: + - prompt: + role: system + content: >- + You are an advanced chat assistant. Here's the conversation history: + {{inputs[0].chat_history}} + + Now, respond to the user's latest input: {{inputs[0].user_input}} + +- if: + condition: "weather" in inputs[0].user_input.lower() + then: + - tool: weather_api + arguments: + location: "New York" + - prompt: + role: system + content: >- + The user mentioned weather. Here's the current weather information for New York: + {{outputs[3]}} + + Incorporate this information into your response. + +- return: _ +""") + +# Creating the chat task +chat_task = client.tasks.create_or_update( + task_id=CHAT_TASK_UUID, + agent_id=AGENT_UUID, + **chat_task_def +) + +# Function to simulate user input +def get_user_input(): + return input("User: ") + +# Function to display chat history +def display_chat_history(chat_history): + for message in chat_history: + print(f"{message['role'].capitalize()}: {message['content']}") + +# Main chat loop +def run_chat_session(): + chat_history = [] + print("Starting advanced chat session. Type 'exit' to end the conversation.") + + session = client.sessions.create(agent_id=AGENT_UUID) + + while True: + user_input = get_user_input() + if user_input.lower() == 'exit': + break + + chat_history.append({"role": "user", "content": user_input}) + + execution = client.executions.create( + task_id=CHAT_TASK_UUID, + input={ + "user_input": user_input, + "chat_history": chat_history + } + ) + + result = client.executions.get(execution.id) + assistant_response = result.output + + chat_history.append({"role": "assistant", "content": assistant_response}) + print(f"Assistant: {assistant_response}") + + # Simulate a delay for a more natural conversation flow + time.sleep(1) + + print("\nChat session ended. Here's the complete chat history:") + display_chat_history(chat_history) + +# Run the chat session +run_chat_session() + +# Display execution metrics (optional) +print("\nExecution Metrics:") +for transition in client.executions.transitions.list(execution_id=execution.id).items: + print(f"Step: {transition.type}, Duration: {transition.duration_ms}ms") \ No newline at end of file diff --git a/cookbooks/12-Monitoring_Task_Executions.py b/cookbooks/12-Monitoring_Task_Executions.py new file mode 100644 index 000000000..7e5f576a0 --- /dev/null +++ b/cookbooks/12-Monitoring_Task_Executions.py @@ -0,0 +1,160 @@ +# Monitoring Task Executions Cookbook +# +# Plan: +# 1. Import necessary libraries and set up the Julep client +# 2. Create an agent for task execution monitoring +# 3. Define a multi-step task that simulates a complex workflow +# 4. Implement functions for: +# a. Starting task execution +# b. Monitoring execution progress +# c. Handling execution status updates +# d. Logging execution metrics +# 5. Execute the task and demonstrate real-time monitoring +# 6. Display execution summary and metrics + +import uuid +import yaml +from julep import Client +import time + +# Global UUIDs for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an agent for task execution monitoring +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name="Task Execution Monitor", + about="An AI agent designed to monitor and manage complex task executions.", + model="gpt-4-turbo", +) + +# Defining a multi-step task that simulates a complex workflow +task_def = yaml.safe_load(""" +name: Complex Workflow Simulation + +input_schema: + type: object + properties: + project_name: + type: string + data_size: + type: integer + +tools: +- name: data_processor + type: integration + integration: + provider: mock + setup: + processing_time: 5 # Simulated processing time in seconds + +- name: report_generator + type: integration + integration: + provider: mock + setup: + generation_time: 3 # Simulated generation time in seconds + +main: +- prompt: + role: system + content: >- + Initiating project '{{inputs[0].project_name}}' with data size {{inputs[0].data_size}} units. + Prepare for data processing and report generation. + unwrap: true + +- tool: data_processor + arguments: + data_size: inputs[0].data_size + +- evaluate: + processed_data: "Processed " + str(inputs[0].data_size) + " units of data" + +- tool: report_generator + arguments: + data: outputs[2].processed_data + +- prompt: + role: system + content: >- + Project '{{inputs[0].project_name}}' completed. + Data processed: {{outputs[2].processed_data}} + Report generated: {{outputs[3]}} + + Summarize the project results. + unwrap: true + +- return: _ +""") + +# Creating the task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +def start_task_execution(project_name, data_size): + """Start the task execution and return the execution object.""" + execution = client.executions.create( + task_id=TASK_UUID, + input={ + "project_name": project_name, + "data_size": data_size + } + ) + print(f"Task execution started for project '{project_name}'") + return execution + +def monitor_execution_progress(execution_id): + """Monitor the execution progress in real-time.""" + print("Monitoring execution progress:") + for transition in client.executions.transitions.stream(execution_id=execution_id): + print(f"Step: {transition.type}, Status: {transition.status}") + if transition.status == "completed": + print(f" Output: {transition.output}") + elif transition.status == "failed": + print(f" Error: {transition.error}") + time.sleep(1) # Add a small delay to simulate real-time monitoring + +def get_execution_status(execution_id): + """Get the current status of the execution.""" + execution = client.executions.get(execution_id) + return execution.status + +def log_execution_metrics(execution_id): + """Log and display execution metrics.""" + print("\nExecution Metrics:") + transitions = client.executions.transitions.list(execution_id=execution_id).items + total_duration = sum(t.duration_ms for t in transitions) + for transition in transitions: + print(f"Step: {transition.type}, Duration: {transition.duration_ms}ms") + print(f"Total Execution Time: {total_duration}ms") + +# Main execution flow +def run_task_monitoring_demo(): + project_name = "Data Analysis Project" + data_size = 1000 + + print(f"Starting task execution for '{project_name}' with {data_size} units of data") + execution = start_task_execution(project_name, data_size) + + monitor_execution_progress(execution.id) + + final_status = get_execution_status(execution.id) + print(f"\nFinal Execution Status: {final_status}") + + if final_status == "completed": + result = client.executions.get(execution.id) + print("\nExecution Result:") + print(result.output) + + log_execution_metrics(execution.id) + +# Run the task monitoring demo +run_task_monitoring_demo() \ No newline at end of file diff --git a/cookbooks/13-Error_Handling_and_Recovery.py b/cookbooks/13-Error_Handling_and_Recovery.py new file mode 100644 index 000000000..b45732ed5 --- /dev/null +++ b/cookbooks/13-Error_Handling_and_Recovery.py @@ -0,0 +1,163 @@ +# Error Handling and Recovery Cookbook +# +# Plan: +# 1. Import necessary libraries and set up the Julep client +# 2. Create an agent for error handling demonstration +# 3. Define a task with potential errors and recovery mechanisms +# 4. Execute the task and demonstrate error handling +# 5. Implement a retry mechanism for failed steps +# 6. Show how to log and report errors +# 7. Demonstrate graceful degradation when a step fails + +import uuid +import yaml +import time +from julep import Client + +# Global UUID is generated for agent and task +AGENT_UUID = uuid.uuid4() +TASK_UUID = uuid.uuid4() + +# Creating Julep Client with the API Key +api_key = "" # Your API key here +client = Client(api_key=api_key, environment="dev") + +# Creating an agent for error handling demonstration +agent = client.agents.create_or_update( + agent_id=AGENT_UUID, + name="Error Handler", + about="An AI agent specialized in demonstrating error handling and recovery mechanisms.", + model="gpt-4-turbo", +) + +# Defining a task with potential errors and recovery mechanisms +task_def = yaml.safe_load(""" +name: Error Handling Demo + +input_schema: + type: object + properties: + operation: + type: string + enum: ["divide", "api_call", "process_data"] + value: + type: number + +tools: +- name: divide + type: function + function: + name: divide + description: Divide 100 by the given number + parameters: + type: object + properties: + divisor: + type: number + +- name: api_call + type: integration + integration: + provider: httpbin + method: get + +- name: process_data + type: function + function: + name: process_data + description: Process the given data + parameters: + type: object + properties: + data: + type: string + +main: +- switch: + value: inputs[0].operation + cases: + divide: + - tool: divide + arguments: + divisor: inputs[0].value + on_error: + retry: + max_attempts: 3 + delay: 2 + fallback: + return: "Error: Division by zero or invalid input" + api_call: + - tool: api_call + arguments: + endpoint: "/status/{{inputs[0].value}}" + on_error: + retry: + max_attempts: 3 + delay: 5 + fallback: + return: "Error: API call failed after multiple attempts" + process_data: + - evaluate: + data: "'Sample data: ' + str(inputs[0].value)" + - tool: process_data + arguments: + data: _.data + on_error: + log: "Error occurred while processing data" + return: "Error: Data processing failed" + +- prompt: + role: system + content: >- + Summarize the result of the operation: + Operation: {{inputs[0].operation}} + Result: {{_}} +""") + +# Creating the task +task = client.tasks.create_or_update( + task_id=TASK_UUID, + agent_id=AGENT_UUID, + **task_def +) + +# Function to execute task and handle errors +def execute_task_with_error_handling(operation, value): + try: + execution = client.executions.create( + task_id=TASK_UUID, + input={"operation": operation, "value": value} + ) + + print(f"Executing {operation} with value {value}...") + + # Stream execution to show progress and potential retries + for step in client.executions.transitions.stream(execution_id=execution.id): + if step.type == "tool_call": + print(f"Step: {step.tool}") + if step.status == "error": + print(f"Error occurred: {step.error}") + if step.retry: + print(f"Retrying... (Attempt {step.retry.attempt})") + elif step.type == "error": + print(f"Task error: {step.error}") + + # Get final execution result + result = client.executions.get(execution.id) + print(f"Final result: {result.output}") + + except Exception as e: + print(f"An unexpected error occurred: {str(e)}") + +# Demonstrate error handling for different scenarios +print("1. Division by zero (with retry and fallback):") +execute_task_with_error_handling("divide", 0) + +print("\n2. API call with server error (with retry):") +execute_task_with_error_handling("api_call", 500) + +print("\n3. Data processing error (with logging):") +execute_task_with_error_handling("process_data", "invalid_data") + +print("\n4. Successful operation:") +execute_task_with_error_handling("divide", 4) \ No newline at end of file diff --git a/cookbooks/IDEAS.md b/cookbooks/IDEAS.md new file mode 100644 index 000000000..83d6d58d4 --- /dev/null +++ b/cookbooks/IDEAS.md @@ -0,0 +1,1377 @@ +# Expanded Implementation Scenarios for Julep + +Below are detailed implementation plans for each of the 50 scenarios using Julep's **docs**, **sessions**, **tasks**, and **executions** features. Each scenario includes a complexity rating from **1 (easiest)** to **5 (most complex)**. + +--- + +### 1. Automated Customer Support Agent + +**Implementation Using Julep:** + +- **Docs:** + - Store customer data, FAQs, and troubleshooting guides. + - Integrate CRM documentation for accessing and updating customer information. + +- **Sessions:** + - Create a persistent session for each customer to maintain conversation context. + - Track interaction history to personalize support. + +- **Tasks:** + - Define tasks for handling common inquiries (e.g., order status, billing issues). + - Implement escalation tasks for complex issues that require human intervention. + - Automate ticket creation and update processes. + +- **Executions:** + - Execute tasks based on customer inputs. + - Monitor task executions to ensure timely responses and issue resolutions. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integrating with external CRM systems, handling diverse query types, and maintaining contextual sessions, which increases complexity. + +--- + +### 2. Smart Research Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store access to academic databases and research papers. + - Include summarization templates and research methodologies. + +- **Sessions:** + - Manage user-specific research sessions to track ongoing projects and queries. + - Maintain context for multi-step research tasks. + +- **Tasks:** + - Create tasks for searching databases, summarizing articles, and compiling reports. + - Implement conditional steps based on research findings. + +- **Executions:** + - Execute research tasks sequentially or in parallel. + - Stream execution results to provide real-time updates to the user. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with academic databases, advanced summarization capabilities, and managing complex multi-step workflows. + +--- + +### 3. Personal Finance Manager + +**Implementation Using Julep:** + +- **Docs:** + - Store user financial data, budgeting templates, and investment information. + - Integrate banking API documentation for transaction fetching. + +- **Sessions:** + - Create persistent sessions to track user financial activities over time. + - Maintain context for budgeting goals and financial plans. + +- **Tasks:** + - Define tasks for expense tracking, budget creation, and investment monitoring. + - Automate alerts for budget limits and investment opportunities. + +- **Executions:** + - Execute financial tasks based on user interactions and predefined schedules. + - Monitor executions to provide real-time financial advice and updates. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Needs secure integration with banking APIs, real-time data processing, and robust budgeting logic. + +--- + +### 4. Content Creation Workflow + +**Implementation Using Julep:** + +- **Docs:** + - Store SEO guidelines, content templates, and style guides. + - Include access to keyword research tools. + +- **Sessions:** + - Manage content creation sessions to track progress and drafts. + - Maintain context for ongoing content projects. + +- **Tasks:** + - Create multi-step tasks for topic ideation, content drafting, SEO optimization, and scheduling. + - Integrate tools for grammar checking and SEO analysis. + +- **Executions:** + - Automate the execution of content creation tasks. + - Schedule publishing according to editorial calendars. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves coordinating multiple tools and steps but remains manageable with clear task definitions. + +--- + +### 5. E-commerce Order Processing System + +**Implementation Using Julep:** + +- **Docs:** + - Store product catalogs, inventory data, and order processing guidelines. + - Integrate with shipping provider APIs. + +- **Sessions:** + - Create sessions for each order to track its lifecycle. + - Maintain context for customer preferences and order history. + +- **Tasks:** + - Define tasks for order validation, inventory updates, payment processing, and shipment tracking. + - Automate customer notifications at each stage. + +- **Executions:** + - Execute order processing tasks in sequence. + - Monitor executions to handle exceptions like payment failures or inventory shortages. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires robust integrations with payment gateways, inventory systems, and shipping providers, along with handling various order states. + +--- + +### 6. AI-Powered Personal Trainer + +**Implementation Using Julep:** + +- **Docs:** + - Store workout routines, nutritional plans, and progress tracking templates. + - Include integration details for fitness tracking APIs. + +- **Sessions:** + - Create individual sessions for each user to track their fitness journey. + - Maintain context for user goals and progress. + +- **Tasks:** + - Define tasks for generating personalized workout plans, tracking progress, and adjusting routines. + - Automate reminders and motivational messages. + +- **Executions:** + - Execute fitness tasks based on user inputs and scheduled routines. + - Monitor executions to provide real-time feedback and adjustments. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves personalization and integration with fitness data sources, but achievable with well-defined task workflows. + +--- + +### 7. Automated Email Marketing Campaigns + +**Implementation Using Julep:** + +- **Docs:** + - Store email templates, segmentation criteria, and campaign schedules. + - Integrate with email marketing platforms (e.g., SendGrid, Mailchimp). + +- **Sessions:** + - Manage campaign-specific sessions to track interactions and responses. + - Maintain context for ongoing and past campaigns. + +- **Tasks:** + - Create tasks for email creation, scheduling, sending, and performance analysis. + - Automate A/B testing and content personalization. + +- **Executions:** + - Execute email campaigns based on predefined schedules and triggers. + - Monitor execution performance and adjust strategies accordingly. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with email platforms and managing dynamic content delivery, but is straightforward with clear task definitions. + +--- + +### 8. Intelligent Recruitment Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store job descriptions, candidate profiles, and evaluation criteria. + - Integrate with HR systems and job boards. + +- **Sessions:** + - Create sessions for each recruitment process to track candidate interactions. + - Maintain context for candidate status and feedback. + +- **Tasks:** + - Define tasks for resume screening, interview scheduling, and candidate communications. + - Automate feedback collection and report generation. + +- **Executions:** + - Execute recruitment tasks based on candidate actions and application stages. + - Monitor executions to ensure timely processing and compliance. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves complex integrations with HR systems, handling diverse candidate data, and ensuring compliance with recruitment processes. + +--- + +### 9. Smart Home Automation Controller + +**Implementation Using Julep:** + +- **Docs:** + - Store device configurations, automation rules, and user preferences. + - Integrate with smart home device APIs (e.g., Philips Hue, Nest). + +- **Sessions:** + - Manage user-specific sessions to track home automation settings. + - Maintain context for user routines and preferences. + +- **Tasks:** + - Create tasks for device control, routine scheduling, and energy monitoring. + - Automate actions based on triggers like time, occupancy, or environmental changes. + +- **Executions:** + - Execute home automation tasks in real-time or based on schedules. + - Monitor executions to ensure devices respond correctly and adjust settings as needed. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with multiple smart devices and managing dynamic automation rules, increasing system complexity. + +--- + +### 10. Automated Legal Document Analyzer + +**Implementation Using Julep:** + +- **Docs:** + - Store legal templates, compliance guidelines, and case studies. + - Integrate with legal databases and document repositories. + +- **Sessions:** + - Create sessions for each document analysis to track progress and findings. + - Maintain context for specific legal requirements and clauses. + +- **Tasks:** + - Define tasks for document ingestion, key information extraction, compliance checking, and summarization. + - Automate flagging of non-compliant sections and suggest necessary amendments. + +- **Executions:** + - Execute document analysis tasks sequentially or in parallel. + - Monitor executions to ensure accuracy and compliance with legal standards. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves advanced natural language processing, integration with legal databases, and ensuring compliance with intricate legal standards. + +--- + +### 11. Personalized Learning Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store educational content, learning paths, and assessment criteria. + - Integrate with educational platforms and resources. + +- **Sessions:** + - Create individual learning sessions to track user progress and preferences. + - Maintain context for personalized learning paths and goals. + +- **Tasks:** + - Define tasks for content recommendation, quiz generation, progress tracking, and feedback provision. + - Automate adjustments to learning paths based on performance. + +- **Executions:** + - Execute learning tasks based on user interactions and progress. + - Monitor executions to provide real-time feedback and adjust learning strategies. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires personalization algorithms, integration with educational content sources, and dynamic adaptation to user progress. + +--- + +### 12. AI-Driven Social Media Manager + +**Implementation Using Julep:** + +- **Docs:** + - Store social media strategies, content calendars, and engagement guidelines. + - Integrate with social media APIs (e.g., Twitter, Facebook, LinkedIn). + +- **Sessions:** + - Manage campaign-specific sessions to track posts, engagements, and analytics. + - Maintain context for ongoing and scheduled campaigns. + +- **Tasks:** + - Create tasks for content creation, scheduling, posting, and performance analysis. + - Automate engagement responses and A/B testing of content. + +- **Executions:** + - Execute social media tasks based on schedules and real-time engagement triggers. + - Monitor executions to optimize performance and adjust strategies. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with multiple social media platforms, dynamic content management, and real-time engagement handling. + +--- + +### 13. Automated Travel Itinerary Planner + +**Implementation Using Julep:** + +- **Docs:** + - Store travel guides, destination information, and booking APIs. + - Integrate with flight, hotel, and transportation service APIs. + +- **Sessions:** + - Create travel-specific sessions to track itinerary progress and user preferences. + - Maintain context for personalized travel plans and updates. + +- **Tasks:** + - Define tasks for destination research, booking accommodations and transportation, and itinerary scheduling. + - Automate real-time updates and notifications during trips. + +- **Executions:** + - Execute travel planning tasks based on user inputs and predefined schedules. + - Monitor executions to handle changes and provide timely updates. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with travel service APIs and managing dynamic itinerary changes, which adds moderate complexity. + +--- + +### 14. AI-Powered Inventory Management System + +**Implementation Using Julep:** + +- **Docs:** + - Store inventory data, supplier information, and reordering guidelines. + - Integrate with inventory tracking systems and supplier APIs. + +- **Sessions:** + - Manage inventory sessions to monitor stock levels and reorder statuses. + - Maintain context for inventory forecasts and demand trends. + +- **Tasks:** + - Create tasks for stock monitoring, demand forecasting, automatic reordering, and supplier communication. + - Automate alerts for low stock levels and order confirmations. + +- **Executions:** + - Execute inventory management tasks in real-time or based on schedules. + - Monitor executions to ensure accurate stock levels and timely reorders. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires real-time inventory tracking, predictive analytics for demand forecasting, and reliable integration with supplier systems. + +--- + +### 15. Intelligent Health Monitoring System + +**Implementation Using Julep:** + +- **Docs:** + - Store health metrics templates, medical guidelines, and user health data. + - Integrate with health tracking devices and APIs (e.g., Fitbit, Apple Health). + +- **Sessions:** + - Create sessions for each user to track their health metrics and progress. + - Maintain context for personalized health goals and alerts. + +- **Tasks:** + - Define tasks for data collection, health metric analysis, trend monitoring, and alert notifications. + - Automate health insights and recommendations based on data. + +- **Executions:** + - Execute health monitoring tasks continuously or at scheduled intervals. + - Monitor executions to provide real-time health alerts and advice. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with diverse health tracking devices, real-time data processing, and ensuring data privacy and accuracy. + +--- + +### 16. Automated Content Moderation Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store community guidelines, content policies, and moderation rules. + - Integrate with content platforms (e.g., forums, social media). + +- **Sessions:** + - Manage moderation sessions to track content reviews and decisions. + - Maintain context for specific moderation cases and user histories. + +- **Tasks:** + - Create tasks for content ingestion, automated screening, manual review, and action enforcement. + - Automate flagging of inappropriate content and notifying users of violations. + +- **Executions:** + - Execute content moderation tasks in real-time or batch processing. + - Monitor executions to ensure compliance and handle escalations. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves sophisticated content analysis, balancing automation with manual oversight, and ensuring adherence to diverse content policies. + +--- + +### 17. AI-Powered Resume Builder + +**Implementation Using Julep:** + +- **Docs:** + - Store resume templates, industry-specific keywords, and formatting guidelines. + - Integrate with LinkedIn and other professional platforms for data fetching. + +- **Sessions:** + - Create user-specific sessions to track resume building progress. + - Maintain context for personalized content and formatting preferences. + +- **Tasks:** + - Define tasks for data collection, content suggestion, resume formatting, and final export. + - Automate style checks and consistency validations. + +- **Executions:** + - Execute resume building tasks based on user inputs and selections. + - Monitor executions to provide real-time feedback and suggestions. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with professional data sources and implementing dynamic content generation and formatting. + +--- + +### 18. Smart Event Management System + +**Implementation Using Julep:** + +- **Docs:** + - Store event templates, scheduling guidelines, and registration forms. + - Integrate with calendar and email platforms. + +- **Sessions:** + - Manage event-specific sessions to track registrations, schedules, and attendee interactions. + - Maintain context for event updates and follow-ups. + +- **Tasks:** + - Create tasks for event creation, attendee registration, schedule management, and post-event follow-ups. + - Automate reminders, notifications, and feedback collection. + +- **Executions:** + - Execute event management tasks based on schedules and attendee actions. + - Monitor executions to handle registrations and event logistics seamlessly. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves coordinating multiple aspects of event planning, handling real-time registrations, and ensuring smooth execution logistics. + +--- + +### 19. Automated Survey Analyzer + +**Implementation Using Julep:** + +- **Docs:** + - Store survey templates, question types, and analysis methodologies. + - Integrate with survey distribution platforms (e.g., SurveyMonkey, Google Forms). + +- **Sessions:** + - Create sessions for each survey to track responses and analysis progress. + - Maintain context for specific survey objectives and parameters. + +- **Tasks:** + - Define tasks for survey distribution, data collection, sentiment analysis, and report generation. + - Automate data visualization and trend identification. + +- **Executions:** + - Execute survey analysis tasks upon survey completion. + - Monitor executions to provide timely and accurate insights. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with survey platforms and implementing effective data analysis and visualization techniques. + +--- + +### 20. AI-Driven Project Management Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store project templates, task guidelines, and progress tracking tools. + - Integrate with project management platforms (e.g., Jira, Trello). + +- **Sessions:** + - Manage project-specific sessions to track tasks, milestones, and team interactions. + - Maintain context for project goals and progress updates. + +- **Tasks:** + - Create tasks for task breakdown, assignment, progress tracking, and status reporting. + - Automate notifications for deadlines and task completions. + +- **Executions:** + - Execute project management tasks based on project timelines and team inputs. + - Monitor executions to ensure projects stay on track and within scope. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with diverse project management tools, handling dynamic task assignments, and ensuring effective progress tracking. + +--- + +### 21. Intelligent Document Summarizer + +**Implementation Using Julep:** + +- **Docs:** + - Store access to large documents, research papers, and reports. + - Include summarization algorithms and templates. + +- **Sessions:** + - Create sessions for each document summarization task. + - Maintain context for document sections and summarization preferences. + +- **Tasks:** + - Define tasks for document ingestion, key point extraction, and summary generation. + - Automate quality checks and user-specific summary adjustments. + +- **Executions:** + - Execute document summarization tasks efficiently. + - Monitor executions to ensure accurate and concise summaries. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires advanced natural language processing capabilities and efficient handling of large document data. + +--- + +### 22. Automated Feedback Collection and Analysis + +**Implementation Using Julep:** + +- **Docs:** + - Store feedback forms, analysis templates, and reporting guidelines. + - Integrate with feedback collection platforms (e.g., Typeform, Google Forms). + +- **Sessions:** + - Manage feedback-specific sessions to track responses and analysis progress. + - Maintain context for feedback sources and analysis objectives. + +- **Tasks:** + - Create tasks for feedback distribution, data collection, sentiment analysis, and insight generation. + - Automate categorization and prioritization of feedback. + +- **Executions:** + - Execute feedback analysis tasks promptly upon data collection. + - Monitor executions to provide actionable insights and improvement strategies. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integrating with feedback platforms and implementing effective sentiment analysis and categorization. + +--- + +### 23. AI-Powered Language Translator + +**Implementation Using Julep:** + +- **Docs:** + - Store language dictionaries, translation models, and formatting guidelines. + - Integrate with translation APIs (e.g., Google Translate, DeepL). + +- **Sessions:** + - Create translation-specific sessions to track user preferences and translation history. + - Maintain context for ongoing translation projects. + +- **Tasks:** + - Define tasks for text ingestion, language detection, translation processing, and quality assurance. + - Automate post-translation formatting and localization adjustments. + +- **Executions:** + - Execute translation tasks in real-time or batch mode. + - Monitor executions to ensure accuracy and contextual relevance. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with robust translation APIs and handling nuances of different languages and contexts. + +--- + +### 24. Smart Appointment Scheduler + +**Implementation Using Julep:** + +- **Docs:** + - Store scheduling templates, availability guidelines, and notification templates. + - Integrate with calendar platforms (e.g., Google Calendar, Outlook). + +- **Sessions:** + - Manage appointment-specific sessions to track scheduling progress and attendee interactions. + - Maintain context for user availability and preferences. + +- **Tasks:** + - Create tasks for availability checking, meeting scheduling, sending reminders, and handling cancellations. + - Automate conflict detection and resolution. + +- **Executions:** + - Execute scheduling tasks based on user inputs and calendar data. + - Monitor executions to ensure appointments are set correctly and notifications are sent. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integration with calendar systems and implementing conflict resolution logic, which adds moderate complexity. + +--- + +### 25. Automated Inventory Auditor + +**Implementation Using Julep:** + +- **Docs:** + - Store inventory audit templates, reconciliation guidelines, and reporting formats. + - Integrate with inventory management systems and databases. + +- **Sessions:** + - Create auditing sessions to track audit schedules and findings. + - Maintain context for different inventory categories and audit criteria. + +- **Tasks:** + - Define tasks for data extraction, discrepancy detection, reconciliation processes, and report generation. + - Automate audit scheduling and notification of audit results. + +- **Executions:** + - Execute inventory audit tasks periodically or on-demand. + - Monitor executions to ensure accurate and timely audits. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires reliable data integration and robust discrepancy detection mechanisms to handle complex inventory data. + +--- + +### 26. AI-Driven Competitive Analysis Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store competitor profiles, market analysis frameworks, and data sources. + - Integrate with market research APIs and competitor websites. + +- **Sessions:** + - Manage competitive analysis sessions to track data collection and analysis progress. + - Maintain context for specific market segments and competitive factors. + +- **Tasks:** + - Create tasks for data scraping, trend analysis, SWOT analysis, and report generation. + - Automate the aggregation and visualization of competitive data. + +- **Executions:** + - Execute competitive analysis tasks on a scheduled basis. + - Monitor executions to provide up-to-date insights and strategic recommendations. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves complex data scraping, accurate trend analysis, and maintaining up-to-date competitive insights, increasing overall complexity. + +--- + +### 27. Smart Recipe Generator + +**Implementation Using Julep:** + +- **Docs:** + - Store ingredient databases, recipe templates, and dietary guidelines. + - Integrate with nutrition APIs and grocery databases. + +- **Sessions:** + - Create user-specific sessions to track dietary preferences and past recipes. + - Maintain context for ingredient availability and nutritional goals. + +- **Tasks:** + - Define tasks for ingredient analysis, recipe generation, nutritional calculation, and grocery list creation. + - Automate recipe suggestions based on user inputs and constraints. + +- **Executions:** + - Execute recipe generation tasks in real-time based on user requests. + - Monitor executions to ensure recipe accuracy and adherence to dietary needs. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with nutrition and grocery APIs and implementing intelligent recipe generation logic. + +--- + +### 28. Automated Video Content Creator + +**Implementation Using Julep:** + +- **Docs:** + - Store video script templates, editing guidelines, and publishing schedules. + - Integrate with video editing and hosting platforms (e.g., Adobe Premiere, YouTube). + +- **Sessions:** + - Manage video creation sessions to track script development, editing stages, and publishing. + - Maintain context for ongoing video projects and collaboration. + +- **Tasks:** + - Create tasks for script generation, video editing, thumbnail creation, and publishing. + - Automate content review and approval workflows. + +- **Executions:** + - Execute video creation tasks based on project timelines. + - Monitor executions to ensure timely releases and quality standards. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with multiple video tools, managing creative workflows, and ensuring high-quality content production. + +--- + +### 29. AI-Powered News Aggregator + +**Implementation Using Julep:** + +- **Docs:** + - Store news source lists, categorization templates, and summarization guidelines. + - Integrate with news APIs (e.g., NewsAPI, RSS feeds). + +- **Sessions:** + - Create user-specific sessions to track news preferences and reading history. + - Maintain context for personalized news feeds and topics of interest. + +- **Tasks:** + - Define tasks for news scraping, categorization, summarization, and personalization. + - Automate feed generation and delivery based on user preferences. + +- **Executions:** + - Execute news aggregation tasks periodically. + - Monitor executions to ensure timely and relevant news delivery. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires efficient news scraping, accurate categorization, and personalized summarization, but is manageable with clear task workflows. + +--- + +### 30. Intelligent Appointment Follow-Up System + +**Implementation Using Julep:** + +- **Docs:** + - Store follow-up templates, feedback forms, and communication guidelines. + - Integrate with CRM and email platforms. + +- **Sessions:** + - Manage follow-up sessions to track appointments and subsequent communications. + - Maintain context for previous interactions and follow-up actions. + +- **Tasks:** + - Create tasks for sending follow-up emails, collecting feedback, and scheduling future appointments. + - Automate reminder notifications and feedback analysis. + +- **Executions:** + - Execute follow-up tasks based on appointment completions. + - Monitor executions to ensure timely and effective communications. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integration with CRM systems and implementing automated communication workflows, adding moderate complexity. + +--- + +### 31. Automated Compliance Monitoring Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store regulatory guidelines, compliance checklists, and reporting templates. + - Integrate with internal systems and regulatory databases. + +- **Sessions:** + - Create compliance-specific sessions to track monitoring activities and audit trails. + - Maintain context for various compliance standards and organizational policies. + +- **Tasks:** + - Define tasks for continuous monitoring, policy enforcement, and compliance reporting. + - Automate detection of non-compliant activities and trigger corrective actions. + +- **Executions:** + - Execute compliance monitoring tasks in real-time. + - Monitor executions to ensure ongoing adherence to regulations and standards. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Requires comprehensive integration with organizational systems, robust monitoring mechanisms, and ensuring adherence to multifaceted regulatory requirements. + +--- + +### 32. AI-Powered Personal Shopper + +**Implementation Using Julep:** + +- **Docs:** + - Store product catalogs, user preference data, and recommendation algorithms. + - Integrate with e-commerce APIs (e.g., Amazon, Shopify). + +- **Sessions:** + - Manage shopping sessions to track user preferences and purchase history. + - Maintain context for personalized product recommendations. + +- **Tasks:** + - Create tasks for product suggestion, wishlist management, and deal notifications. + - Automate price comparisons and availability checks. + +- **Executions:** + - Execute personal shopping tasks based on user inputs and behavior. + - Monitor executions to provide timely recommendations and alerts. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with multiple e-commerce platforms, implementing personalized recommendation logic, and handling real-time deal tracking. + +--- + +### 33. Smart Content Personalization Engine + +**Implementation Using Julep:** + +- **Docs:** + - Store content variants, personalization rules, and user segmentation data. + - Integrate with website CMS and analytics platforms. + +- **Sessions:** + - Create user-specific sessions to track interactions and preferences. + - Maintain context for personalized content delivery. + +- **Tasks:** + - Define tasks for content analysis, user behavior tracking, and personalized content delivery. + - Automate A/B testing and content optimization based on performance metrics. + +- **Executions:** + - Execute content personalization tasks in real-time. + - Monitor executions to adjust personalization strategies dynamically. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires real-time user behavior tracking, dynamic content delivery, and continuous optimization based on analytics, increasing system complexity. + +--- + +### 34. Automated Debt Collection Agent + +**Implementation Using Julep:** + +- **Docs:** + - Store debt agreements, payment schedules, and communication templates. + - Integrate with financial systems and payment gateways. + +- **Sessions:** + - Manage debt collection sessions to track debtor interactions and payment statuses. + - Maintain context for individual debtors and their payment histories. + +- **Tasks:** + - Create tasks for sending payment reminders, negotiating payment plans, and issuing notifications. + - Automate follow-ups and escalation procedures for delinquent accounts. + +- **Executions:** + - Execute debt collection tasks based on payment statuses and schedules. + - Monitor executions to ensure effective communication and resolution. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves sensitive financial data handling, integration with payment systems, and implementing automated negotiation workflows. + +--- + +### 35. AI-Driven Talent Matching System + +**Implementation Using Julep:** + +- **Docs:** + - Store job descriptions, candidate profiles, and matching criteria. + - Integrate with job boards and professional networking platforms. + +- **Sessions:** + - Create sessions for each matching process to track candidate-job pairings. + - Maintain context for specific job requirements and candidate qualifications. + +- **Tasks:** + - Define tasks for candidate screening, skills matching, and recommendation generation. + - Automate notifications to both candidates and employers regarding match statuses. + +- **Executions:** + - Execute talent matching tasks based on incoming job postings and candidate applications. + - Monitor executions to ensure accurate and timely matches. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Requires sophisticated matching algorithms, integration with diverse data sources, and handling dynamic job and candidate data. + +--- + +### 36. Intelligent Expense Reporting Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store expense categories, reimbursement policies, and reporting templates. + - Integrate with financial systems and expense tracking APIs. + +- **Sessions:** + - Manage expense reporting sessions to track submissions and approvals. + - Maintain context for individual employee expenses and budget limits. + +- **Tasks:** + - Create tasks for expense submission, approval workflows, and reimbursement processing. + - Automate validation checks and compliance with policies. + +- **Executions:** + - Execute expense reporting tasks based on submission triggers and approval workflows. + - Monitor executions to ensure timely reimbursements and policy adherence. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with financial systems, implementing approval workflows, and ensuring compliance with expense policies. + +--- + +### 37. Automated Meeting Minutes Recorder + +**Implementation Using Julep:** + +- **Docs:** + - Store meeting agendas, transcription templates, and summary guidelines. + - Integrate with audio transcription services (e.g., Otter.ai, Google Speech-to-Text). + +- **Sessions:** + - Create meeting-specific sessions to track transcription and summarization progress. + - Maintain context for meeting topics and participant interactions. + +- **Tasks:** + - Define tasks for audio ingestion, transcription, summary generation, and distribution. + - Automate the extraction of action items and key decisions. + +- **Executions:** + - Execute transcription and summarization tasks in real-time or post-meeting. + - Monitor executions to ensure accurate recordings and timely distribution. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires reliable audio transcription integration and effective summarization techniques, but manageable with clear task definitions. + +--- + +### 38. AI-Driven Content Recommendation System + +**Implementation Using Julep:** + +- **Docs:** + - Store user profiles, content metadata, and recommendation algorithms. + - Integrate with content management systems and user behavior analytics. + +- **Sessions:** + - Manage user-specific sessions to track interactions and preference changes. + - Maintain context for personalized content delivery. + +- **Tasks:** + - Define tasks for content analysis, user behavior tracking, and recommendation generation. + - Automate personalization based on real-time user interactions. + +- **Executions:** + - Execute content recommendation tasks in real-time. + - Monitor executions to refine recommendation accuracy and relevance. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves real-time data processing, advanced recommendation algorithms, and integration with multiple content sources. + +--- + +### 39. Smart Time Tracking Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store time tracking templates, productivity guidelines, and reporting formats. + - Integrate with productivity tools (e.g., Toggl, Clockify). + +- **Sessions:** + - Create user-specific sessions to track time spent on tasks and projects. + - Maintain context for task prioritization and productivity goals. + +- **Tasks:** + - Define tasks for time logging, productivity analysis, and report generation. + - Automate reminders for time tracking and productivity tips based on usage patterns. + +- **Executions:** + - Execute time tracking tasks continuously or based on user actions. + - Monitor executions to provide real-time productivity insights and suggestions. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with time tracking tools and implementing effective productivity analysis logic. + +--- + +### 40. Automated Webinar Hosting Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store webinar schedules, registration forms, and hosting guidelines. + - Integrate with webinar platforms (e.g., Zoom, WebinarJam). + +- **Sessions:** + - Manage webinar-specific sessions to track registrations, attendee interactions, and follow-ups. + - Maintain context for webinar topics and participant engagement. + +- **Tasks:** + - Create tasks for webinar scheduling, participant management, live interactions, and post-webinar follow-ups. + - Automate reminders, thank-you emails, and feedback collection. + +- **Executions:** + - Execute webinar hosting tasks based on schedules and participant actions. + - Monitor executions to ensure smooth webinar operations and effective follow-ups. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with webinar platforms, managing live interactions, and handling post-event processes seamlessly. + +--- + +### 41. AI-Powered Inventory Forecasting Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store sales data, forecasting models, and inventory guidelines. + - Integrate with sales and inventory tracking systems. + +- **Sessions:** + - Create forecasting sessions to track sales trends and inventory predictions. + - Maintain context for seasonal factors and market conditions affecting inventory. + +- **Tasks:** + - Define tasks for data collection, trend analysis, prediction model execution, and report generation. + - Automate alerts for predicted stock shortages or surpluses. + +- **Executions:** + - Execute forecasting tasks periodically based on sales data updates. + - Monitor executions to refine prediction accuracy and adjust inventory strategies. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires advanced predictive analytics, integration with sales systems, and handling dynamic market conditions influencing inventory. + +--- + +### 42. Smart Contract Management System + +**Implementation Using Julep:** + +- **Docs:** + - Store smart contract templates, execution guidelines, and compliance rules. + - Integrate with blockchain platforms (e.g., Ethereum, Hyperledger). + +- **Sessions:** + - Manage contract-specific sessions to track creation, execution, and monitoring. + - Maintain context for contract terms and participant interactions. + +- **Tasks:** + - Create tasks for contract creation, deployment, execution monitoring, and compliance checks. + - Automate notifications for contract milestones and compliance alerts. + +- **Executions:** + - Execute smart contract tasks based on blockchain events and predefined triggers. + - Monitor executions to ensure contract integrity and compliance. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves blockchain integration, ensuring smart contract security, and managing complex execution and compliance workflows. + +--- + +### 43. Automated Knowledge Base Updater + +**Implementation Using Julep:** + +- **Docs:** + - Store knowledge base articles, update guidelines, and categorization rules. + - Integrate with content management systems and information sources. + +- **Sessions:** + - Create knowledge base sessions to track updates, revisions, and user queries. + - Maintain context for content accuracy and relevance. + +- **Tasks:** + - Define tasks for content ingestion, information extraction, categorization, and publishing. + - Automate periodic reviews and updates based on new information sources. + +- **Executions:** + - Execute knowledge base update tasks as new content becomes available. + - Monitor executions to ensure timely and accurate information updates. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires efficient content ingestion, accurate information extraction, and seamless integration with knowledge management systems. + +--- + +### 44. AI-Driven Fraud Detection System + +**Implementation Using Julep:** + +- **Docs:** + - Store fraud detection algorithms, monitoring guidelines, and incident response protocols. + - Integrate with financial transaction systems and security APIs. + +- **Sessions:** + - Manage fraud detection sessions to track suspicious activities and investigations. + - Maintain context for user behavior patterns and anomaly detection. + +- **Tasks:** + - Create tasks for real-time transaction monitoring, anomaly detection, incident logging, and alerting. + - Automate response actions like freezing accounts or notifying security teams. + +- **Executions:** + - Execute fraud detection tasks continuously based on transaction flows. + - Monitor executions to ensure timely detection and response to fraudulent activities. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves real-time data processing, sophisticated anomaly detection algorithms, and ensuring robust security measures. + +--- + +### 45. Intelligent Personal Diary Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store diary templates, emotional analysis guidelines, and reflection prompts. + - Integrate with sentiment analysis APIs. + +- **Sessions:** + - Create user-specific sessions to track daily entries and emotional states. + - Maintain context for personal growth and mood trends. + +- **Tasks:** + - Define tasks for daily entry prompts, sentiment analysis, and insight generation. + - Automate privacy controls and data encryption for secure diary storage. + +- **Executions:** + - Execute diary assistant tasks daily based on user inputs. + - Monitor executions to provide personalized insights and growth tracking. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with sentiment analysis tools and ensuring secure data handling, but manageable with well-defined workflows. + +--- + +### 46. Automated Language Learning Tutor + +**Implementation Using Julep:** + +- **Docs:** + - Store language lessons, exercise templates, and feedback guidelines. + - Integrate with language processing APIs and educational resources. + +- **Sessions:** + - Manage learning sessions to track user progress and performance. + - Maintain context for personalized lesson plans and feedback. + +- **Tasks:** + - Create tasks for lesson delivery, exercise generation, progress tracking, and feedback provision. + - Automate adaptive learning paths based on user performance. + +- **Executions:** + - Execute language learning tasks based on user interactions and learning schedules. + - Monitor executions to adjust learning strategies and provide real-time feedback. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves adaptive learning algorithms, integration with language processing tools, and personalized content delivery. + +--- + +### 47. AI-Powered Budgeting Tool for Businesses + +**Implementation Using Julep:** + +- **Docs:** + - Store budgeting templates, financial guidelines, and reporting formats. + - Integrate with accounting systems and financial data sources. + +- **Sessions:** + - Create budgeting sessions to track financial planning and expenditure. + - Maintain context for organizational financial goals and constraints. + +- **Tasks:** + - Define tasks for budget creation, expenditure tracking, financial forecasting, and report generation. + - Automate alerts for budget overruns and financial goal assessments. + +- **Executions:** + - Execute budgeting tasks based on financial data updates and planning cycles. + - Monitor executions to ensure accurate financial tracking and reporting. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with accounting systems, accurate financial forecasting, and robust budgeting logic to handle business complexities. + +--- + +### 48. Smart Compliance Documentation Generator + +**Implementation Using Julep:** + +- **Docs:** + - Store compliance templates, regulatory guidelines, and documentation standards. + - Integrate with regulatory databases and internal policy systems. + +- **Sessions:** + - Manage compliance documentation sessions to track document creation and updates. + - Maintain context for specific regulatory requirements and organizational policies. + +- **Tasks:** + - Create tasks for document generation, compliance checking, format validation, and publishing. + - Automate updates based on regulatory changes and policy revisions. + +- **Executions:** + - Execute compliance documentation tasks as needed or on a schedule. + - Monitor executions to ensure documents meet all compliance standards. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves dynamic document generation, adherence to detailed regulatory standards, and ensuring continuous updates based on regulatory changes. + +--- + +### 49. Automated Product Recommendation Engine + +**Implementation Using Julep:** + +- **Docs:** + - Store product catalogs, user behavior data, and recommendation algorithms. + - Integrate with e-commerce platforms and user analytics tools. + +- **Sessions:** + - Create user-specific sessions to track interactions and preferences. + - Maintain context for personalized recommendation accuracy. + +- **Tasks:** + - Define tasks for data collection, behavior analysis, recommendation generation, and user feedback integration. + - Automate real-time recommendations based on user actions and trends. + +- **Executions:** + - Execute recommendation tasks in real-time to provide instant suggestions. + - Monitor executions to refine algorithms and improve recommendation relevance. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires sophisticated recommendation algorithms, real-time data processing, and continuous refinement based on user feedback. + +--- + +### 50. Intelligent Event Feedback Analyzer + +**Implementation Using Julep:** + +- **Docs:** + - Store feedback forms, analysis templates, and reporting standards. + - Integrate with event platforms and feedback collection tools. + +- **Sessions:** + - Manage feedback-specific sessions to track responses and analysis progress. + - Maintain context for event-specific feedback and improvement areas. + +- **Tasks:** + - Create tasks for feedback collection, sentiment analysis, trend identification, and report generation. + - Automate the extraction of actionable insights and improvement suggestions. + +- **Executions:** + - Execute feedback analysis tasks post-event. + - Monitor executions to ensure accurate and timely feedback processing and reporting. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integrating with feedback collection tools and implementing effective sentiment analysis and trend identification mechanisms. + +--- + +# Complexity and Difficulty Ratings + +The scenarios have been rated based on the number of integrated features, required integrations, and overall system complexity. Here's a quick overview: + +- **★☆☆☆☆ (1/5): Easiest** +- **★★☆☆☆ (2/5): Low Complexity** +- **★★★☆☆ (3/5): Moderate Complexity** +- **★★★★☆ (4/5): High Complexity** +- **★★★★★ (5/5): Most Complex** + +| **Scenario** | **Complexity Rating** | +|---------------------------------------------------|-----------------------| +| 1. Automated Customer Support Agent | ★★★★☆ | +| 2. Smart Research Assistant | ★★★★☆ | +| 3. Personal Finance Manager | ★★★☆☆ | +| 4. Content Creation Workflow | ★★★☆☆ | +| 5. E-commerce Order Processing System | ★★★★☆ | +| 6. AI-Powered Personal Trainer | ★★★☆☆ | +| 7. Automated Email Marketing Campaigns | ★★★☆☆ | +| 8. Intelligent Recruitment Assistant | ★★★★★ | +| 9. Smart Home Automation Controller | ★★★★☆ | +| 10. Automated Legal Document Analyzer | ★★★★★ | +| 11. Personalized Learning Assistant | ★★★★☆ | +| 12. AI-Driven Social Media Manager | ★★★★☆ | +| 13. Automated Travel Itinerary Planner | ★★★☆☆ | +| 14. AI-Powered Inventory Management System | ★★★★☆ | +| 15. Intelligent Health Monitoring System | ★★★★☆ | +| 16. Automated Content Moderation Tool | ★★★★★ | +| 17. AI-Powered Resume Builder | ★★★☆☆ | +| 18. Smart Event Management System | ★★★★☆ | +| 19. Automated Survey Analyzer | ★★★☆☆ | +| 20. AI-Driven Project Management Assistant | ★★★★☆ | +| 21. Intelligent Document Summarizer | ★★★★☆ | +| 22. Automated Feedback Collection and Analysis | ★★★☆☆ | +| 23. AI-Powered Language Translator | ★★★☆☆ | +| 24. Smart Appointment Scheduler | ★★★☆☆ | +| 25. Automated Inventory Auditor | ★★★★☆ | +| 26. AI-Driven Competitive Analysis Tool | ★★★★☆ | +| 27. Smart Recipe Generator | ★★★☆☆ | +| 28. Automated Video Content Creator | ★★★★☆ | +| 29. AI-Powered News Aggregator | ★★★☆☆ | +| 30. Intelligent Appointment Follow-Up System | ★★★☆☆ | +| 31. Automated Compliance Monitoring Tool | ★★★★★ | +| 32. AI-Powered Personal Shopper | ★★★★☆ | +| 33. Smart Content Personalization Engine | ★★★★☆ | +| 34. Automated Debt Collection Agent | ★★★★☆ | +| 35. AI-Driven Talent Matching System | ★★★★★ | +| 36. Intelligent Expense Reporting Tool | ★★★★☆ | +| 37. Automated Meeting Minutes Recorder | ★★★☆☆ | +| 38. AI-Driven Content Recommendation System | ★★★★☆ | +| 39. Smart Time Tracking Assistant | ★★★☆☆ | +| 40. Automated Webinar Hosting Assistant | ★★★★☆ | +| 41. AI-Powered Inventory Forecasting Tool | ★★★★☆ | +| 42. Smart Contract Management System | ★★★★★ | +| 43. Automated Knowledge Base Updater | ★★★★☆ | +| 44. AI-Driven Fraud Detection System | ★★★★★ | +| 45. Intelligent Personal Diary Assistant | ★★★☆☆ | +| 46. Automated Language Learning Tutor | ★★★★☆ | +| 47. AI-Powered Budgeting Tool for Businesses | ★★★★☆ | +| 48. Smart Compliance Documentation Generator | ★★★★☆ | +| 49. Automated Product Recommendation Engine | ★★★★☆ | +| 50. Intelligent Event Feedback Analyzer | ★★★☆☆ | + +--- + +# Conclusion + +These 50 scenarios showcase the versatility and power of Julep's **docs**, **sessions**, **tasks**, and **executions** features in automating and enhancing various business and personal workflows. Depending on your specific needs and available integrations, these scenarios can be tailored to create efficient, intelligent, and scalable solutions. + +Feel free to explore these scenarios, adapt them to your use cases, and contribute to expanding Julep's capabilities further! \ No newline at end of file diff --git a/cookbooks/README.md b/cookbooks/README.md index e7a6bfa89..7af36aff6 100644 --- a/cookbooks/README.md +++ b/cookbooks/README.md @@ -23,7 +23,6 @@ Each notebook explores a unique use case, demonstrating different aspects of Jul | `11-Advanced_Chat_Interactions.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/11-Advanced_Chat_Interactions.ipynb) | Covers advanced chat features and context handling. | No | | `12-Monitoring_Task_Executions.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/12-Monitoring_Task_Executions.ipynb) | Shows how to monitor and manage task executions. | No | | `13-Error_Handling_and_Recovery.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/13-Error_Handling_and_Recovery.ipynb) | Demonstrates implementing error handling and recovery in tasks. | No | -| `14-API_Versioning_and_Configurations.ipynb` | [Colab Link](https://colab.research.google.com/github/julep-ai/julep/blob/dev/cookbooks/14-API_Versioning_and_Configurations.ipynb) | Explores API versioning and server configuration options. | No | ## Potential Cookbooks for Contributors @@ -134,15 +133,9 @@ These notebooks showcase various features of Julep. Here's an overview of the ke - Streaming execution progress - Monitoring task lifecycle -9. **API Versioning** - - Support for different API versions - -10. **Authentication** +9. **Authentication** - API Key authentication -11. **Server Configuration** - - Configurable server environments - We encourage contributors to create new notebooks that demonstrate these features in various combinations and use cases. ### Additional Information diff --git a/sdks/node-sdk b/sdks/node-sdk index 1317978f9..2685cfe51 160000 --- a/sdks/node-sdk +++ b/sdks/node-sdk @@ -1 +1 @@ -Subproject commit 1317978f98661b5ae5b23d9c47a0a8d18f6f5718 +Subproject commit 2685cfe512d6b2907e6bdd1b3294175e20aece99 diff --git a/sdks/python-sdk b/sdks/python-sdk index 1b8c9fc9c..aaa88a204 160000 --- a/sdks/python-sdk +++ b/sdks/python-sdk @@ -1 +1 @@ -Subproject commit 1b8c9fc9c7b1fd2dc5eb60bbc908283bce99a1b2 +Subproject commit aaa88a204bb85b7903f79b8fb5cca0c3e6882c73 From 282896257a798ead2755f76fab549c00f2f50922 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 04:46:19 +0530 Subject: [PATCH 052/113] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 37baacbc6..801da2a7c 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,8 @@ main: > [!TIP] > Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. - +> +> Imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. ## Key Features @@ -750,4 +751,4 @@ Explore our comprehensive API documentation to learn more about agents, tasks, a - [Agents API](https://api.julep.ai/api/docs#tag/agents) - [Tasks API](https://api.julep.ai/api/docs#tag/tasks) -- [Executions API](https://api.julep.ai/api/docs#tag/executions) \ No newline at end of file +- [Executions API](https://api.julep.ai/api/docs#tag/executions) From c9883f7b3ad1d109efb265aeda543e75ba8a2b3c Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 04:46:49 +0530 Subject: [PATCH 053/113] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 801da2a7c..fa10d20b2 100644 --- a/README.md +++ b/README.md @@ -86,8 +86,6 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 Julep is a platform for creating AI agents that maintain state and execute complex workflows. It offers long-term context and orchestrates multi-step tasks. -Imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. - Julep lets you define multi-step tasks that can include conditional logic, loops, parallel processing, and built-in integration with 100s of external tools and APIs. Typically AI applications tend to be linear and have simple chains of a handful of prompts and API calls without much branching or decision-making. Imagine a Research AI agent that can do the following: From 8b9b65ada9969e709a1f97da4636dec2d2c97e1e Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 04:48:58 +0530 Subject: [PATCH 054/113] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa10d20b2..cca058021 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓
-## Quick Intro +## Introduction @@ -88,6 +88,9 @@ Julep is a platform for creating AI agents that maintain state and execute compl Julep lets you define multi-step tasks that can include conditional logic, loops, parallel processing, and built-in integration with 100s of external tools and APIs. Typically AI applications tend to be linear and have simple chains of a handful of prompts and API calls without much branching or decision-making. + +## Quick Example + Imagine a Research AI agent that can do the following: 1. Take a topic, 2. Come up with 100 search queries for that topic, From bb90f95db300b095eee7669896704c8e02a3988a Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 6 Oct 2024 23:19:12 +0000 Subject: [PATCH 055/113] chore(docs): update TOC --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cca058021..d4f5bd4ba 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,8 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓
📖 Table of Contents -- [Quick Intro](#quick-intro) +- [Introduction](#introduction) +- [Quick Example](#quick-example) - [Key Features](#key-features) - [Why Julep vs. LangChain?](#why-julep-vs-langchain) - [Installation](#installation) From a6ca52826d41c967d34cb34adc8844026401c37b Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 04:51:41 +0530 Subject: [PATCH 056/113] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d4f5bd4ba..187f88702 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,8 @@ Julep is a platform for creating AI agents that maintain state and execute compl Julep lets you define multi-step tasks that can include conditional logic, loops, parallel processing, and built-in integration with 100s of external tools and APIs. Typically AI applications tend to be linear and have simple chains of a handful of prompts and API calls without much branching or decision-making. +> [!TIP] +> Imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. ## Quick Example @@ -211,8 +213,6 @@ main: > [!TIP] > Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. -> -> Imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. ## Key Features From 0de4c0256e6dcdedc982614b5a455c0d3eeaccac Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 04:53:13 +0530 Subject: [PATCH 057/113] Update and rename doctoc-on-dev-push.yml to doctoc-on-push.yml --- .../workflows/{doctoc-on-dev-push.yml => doctoc-on-push.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{doctoc-on-dev-push.yml => doctoc-on-push.yml} (90%) diff --git a/.github/workflows/doctoc-on-dev-push.yml b/.github/workflows/doctoc-on-push.yml similarity index 90% rename from .github/workflows/doctoc-on-dev-push.yml rename to .github/workflows/doctoc-on-push.yml index f70807245..d28821895 100644 --- a/.github/workflows/doctoc-on-dev-push.yml +++ b/.github/workflows/doctoc-on-push.yml @@ -9,7 +9,7 @@ jobs: - uses: technote-space/toc-generator@v4 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - MAX_HEADER_LEVEL: 2 + MAX_HEADER_LEVEL: 3 TOC_TITLE: '📖 Table of Contents' FOLDING: true From a0a296c5da6d60e85ed155da66b693db118534a6 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 6 Oct 2024 23:23:24 +0000 Subject: [PATCH 058/113] chore(docs): update TOC --- README-CN.md | 16 ++++++++++++++++ README-JP.md | 16 ++++++++++++++++ README.md | 16 ++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/README-CN.md b/README-CN.md index 55ea307ca..abac03f01 100644 --- a/README-CN.md +++ b/README-CN.md @@ -68,9 +68,25 @@ - [特性](#%E7%89%B9%E6%80%A7) - [安装](#%E5%AE%89%E8%A3%85) - [快速入门指南](#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97) + - [步骤 1:导入 Julep](#%E6%AD%A5%E9%AA%A4-1%E5%AF%BC%E5%85%A5-julep) + - [步骤 2:初始化代理](#%E6%AD%A5%E9%AA%A4-2%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BB%A3%E7%90%86) + - [步骤 3:与代理聊天](#%E6%AD%A5%E9%AA%A4-3%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9) + - [步骤 4:创建多步骤任务](#%E6%AD%A5%E9%AA%A4-4%E5%88%9B%E5%BB%BA%E5%A4%9A%E6%AD%A5%E9%AA%A4%E4%BB%BB%E5%8A%A1) + - [步骤 5:执行任务](#%E6%AD%A5%E9%AA%A4-5%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1) - [概念](#%E6%A6%82%E5%BF%B5) + - [代理](#%E4%BB%A3%E7%90%86) + - [用户](#%E7%94%A8%E6%88%B7) + - [会话](#%E4%BC%9A%E8%AF%9D) + - [任务](#%E4%BB%BB%E5%8A%A1) + - [工具](#%E5%B7%A5%E5%85%B7) + - [文档](#%E6%96%87%E6%A1%A3) + - [执行](#%E6%89%A7%E8%A1%8C) - [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1) + - [工作流步骤类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%B1%BB%E5%9E%8B) - [高级功能](#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD) + - [为代理添加工具](#%E4%B8%BA%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7) + - [管理会话和用户](#%E7%AE%A1%E7%90%86%E4%BC%9A%E8%AF%9D%E5%92%8C%E7%94%A8%E6%88%B7) + - [文档集成和搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E5%92%8C%E6%90%9C%E7%B4%A2) - [SDK 参考](#sdk-%E5%8F%82%E8%80%83) - [API 参考](#api-%E5%8F%82%E8%80%83) - [示例和教程](#%E7%A4%BA%E4%BE%8B%E5%92%8C%E6%95%99%E7%A8%8B) diff --git a/README-JP.md b/README-JP.md index 8f9e49cc2..6cc0885e1 100644 --- a/README-JP.md +++ b/README-JP.md @@ -68,9 +68,25 @@ Julepプロジェクトに新しいコントリビューターを歓迎します - [特徴](#%E7%89%B9%E5%BE%B4) - [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) - [クイックスタートガイド](#%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%AC%E3%82%A4%E3%83%89) + - [ステップ1:Julepをインポートする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971julep%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B) + - [ステップ2:エージェントを初期化する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B) + - [ステップ3:エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B) + - [ステップ4:多段階タスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974%E5%A4%9A%E6%AE%B5%E9%9A%8E%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) + - [ステップ5:タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%975%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) - [概念](#%E6%A6%82%E5%BF%B5) + - [エージェント](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88) + - [ユーザー](#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC) + - [セッション](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3) + - [タスク](#%E3%82%BF%E3%82%B9%E3%82%AF) + - [ツール](#%E3%83%84%E3%83%BC%E3%83%AB) + - [ドキュメント](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88) + - [実行](#%E5%AE%9F%E8%A1%8C) - [タスクの理解](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%90%86%E8%A7%A3) + - [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E) - [高度な機能](#%E9%AB%98%E5%BA%A6%E3%81%AA%E6%A9%9F%E8%83%BD) + - [エージェントにツールを追加する](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B) + - [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86) + - [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2) - [SDKリファレンス](#sdk%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) - [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) - [例とチュートリアル](#%E4%BE%8B%E3%81%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB) diff --git a/README.md b/README.md index 187f88702..d194f6cf7 100644 --- a/README.md +++ b/README.md @@ -68,13 +68,29 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Quick Example](#quick-example) - [Key Features](#key-features) - [Why Julep vs. LangChain?](#why-julep-vs-langchain) + - [Different Use Cases](#different-use-cases) + - [Different Form Factor](#different-form-factor) + - [In Summary](#in-summary) - [Installation](#installation) - [Python Quick Start 🐍](#python-quick-start-) + - [Step 1: Create an Agent](#step-1-create-an-agent) + - [Step 2: Create a Task that generates a story and comic strip](#step-2-create-a-task-that-generates-a-story-and-comic-strip) + - [Step 3: Execute the Task](#step-3-execute-the-task) + - [Step 4: Chat with the Agent](#step-4-chat-with-the-agent) - [Node.js Quick Start 🟩](#nodejs-quick-start-) + - [Step 1: Create an Agent](#step-1-create-an-agent-1) + - [Step 2: Create a Task that generates a story and comic strip](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) + - [Step 3: Execute the Task](#step-3-execute-the-task-1) + - [Step 4: Chat with the Agent](#step-4-chat-with-the-agent-1) - [Components](#components) + - [Mental Model](#mental-model) - [Concepts](#concepts) - [Understanding Tasks](#understanding-tasks) + - [Types of Workflow Steps](#types-of-workflow-steps) - [Advanced Features](#advanced-features) + - [Adding Tools to Agents](#adding-tools-to-agents) + - [Managing Sessions and Users](#managing-sessions-and-users) + - [Document Integration and Search](#document-integration-and-search) - [SDK Reference](#sdk-reference) - [API Reference](#api-reference) From 3a15afcdb7b4c60ab258b2f1b9610ff9354c1d05 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 04:56:00 +0530 Subject: [PATCH 059/113] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d194f6cf7..f10493155 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ ***** -> [!TIP] +> [!NOTE] > 👨‍💻 Here for the devfest.ai event? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below.
-🌟 Contributors and DevFest.AI Participants +🌟 Contributors and DevFest.AI Participants (Click to expand) ## 🌟 Call for Contributors! @@ -62,7 +62,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓
-📖 Table of Contents +

📖 Table of Contents

- [Introduction](#introduction) - [Quick Example](#quick-example) From 100eba8c1091c3d0a959924af15cc8eb3df861c3 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 6 Oct 2024 23:26:13 +0000 Subject: [PATCH 060/113] chore(docs): update TOC --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f10493155..5cff0a8c3 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓
-

📖 Table of Contents

+📖 Table of Contents - [Introduction](#introduction) - [Quick Example](#quick-example) From 94cd57c8c18c01b05ac97e5bf1b2a426a8302950 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 05:02:39 +0530 Subject: [PATCH 061/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5cff0a8c3..fc56b90d4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md)
- julep + julep

From d8494872203f2716b56e55602cf4191bb9f4ec29 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 05:04:40 +0530 Subject: [PATCH 062/113] Update doctoc-on-push.yml --- .github/workflows/doctoc-on-push.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/doctoc-on-push.yml b/.github/workflows/doctoc-on-push.yml index d28821895..c0dfdf2c6 100644 --- a/.github/workflows/doctoc-on-push.yml +++ b/.github/workflows/doctoc-on-push.yml @@ -10,6 +10,5 @@ jobs: with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} MAX_HEADER_LEVEL: 3 - TOC_TITLE: '📖 Table of Contents' + TOC_TITLE: '

📖 Table of Contents

' FOLDING: true - From 024b4ec758e3e9662e4ccbf95fbdaa843a019aa6 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 6 Oct 2024 23:34:53 +0000 Subject: [PATCH 063/113] chore(docs): update TOC --- README-CN.md | 2 +- README-JP.md | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README-CN.md b/README-CN.md index abac03f01..d5cb2c2de 100644 --- a/README-CN.md +++ b/README-CN.md @@ -62,7 +62,7 @@
-📖 Table of Contents +

📖 Table of Contents

- [简介](#%E7%AE%80%E4%BB%8B) - [特性](#%E7%89%B9%E6%80%A7) diff --git a/README-JP.md b/README-JP.md index 6cc0885e1..8cd716ade 100644 --- a/README-JP.md +++ b/README-JP.md @@ -62,7 +62,7 @@ Julepプロジェクトに新しいコントリビューターを歓迎します
-📖 Table of Contents +

📖 Table of Contents

- [紹介](#%E7%B4%B9%E4%BB%8B) - [特徴](#%E7%89%B9%E5%BE%B4) diff --git a/README.md b/README.md index fc56b90d4..bd4b90626 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓
-📖 Table of Contents +

📖 Table of Contents

- [Introduction](#introduction) - [Quick Example](#quick-example) From ae238ee8d715a6547cc92b2c64ce88425326158f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 05:09:24 +0530 Subject: [PATCH 064/113] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bd4b90626..5bbf5fe21 100644 --- a/README.md +++ b/README.md @@ -229,6 +229,8 @@ main: > [!TIP] > Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. +> +> In this example, Julep will automatically manage parallel executions, retry failed steps, resend api requests, and keep the workflows running reliably until completion. ## Key Features From 0b8e2d7886cde0e46f23ed81846c16220b5fdc76 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 05:20:26 +0530 Subject: [PATCH 065/113] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5bbf5fe21..e3a212efb 100644 --- a/README.md +++ b/README.md @@ -617,14 +617,17 @@ Julep is built on several key technical components that work together to create ```mermaid graph TD - User[User] --> Session[Session] + User[User] ==> Session[Session] Session --> Agent[Agent] Agent --> Tasks[Tasks] Agent --> LLM[Large Language Model] Tasks --> Tools[Tools] - Tasks --> Documents[Documents] + Agent --> Documents[Documents] Documents --> VectorDB[Vector Database] - Agent --> Executions[Executions] + Tasks --> Executions[Executions] + + classDef client fill:#9ff,stroke:#333,stroke-width:1px; + class User client; classDef core fill:#f9f,stroke:#333,stroke-width:2px; class Agent,Tasks,Session core; From 46c0a23cdb7ba33790ec1ac4ef7f6cb6b723de6b Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 6 Oct 2024 23:34:50 -0400 Subject: [PATCH 066/113] feat: Email provider integration tool (#602) --- agents-api/agents_api/autogen/Tasks.py | 70 ---- agents-api/agents_api/autogen/Tools.py | 2 + .../agents_api/autogen/openapi_model.py | 5 - .../workflows/task_execution/__init__.py | 16 - agents-api/poetry.lock | 140 +++---- agents-api/pyproject.toml | 2 +- .../integrations/models/__init__.py | 1 + .../integrations/models/base_models.py | 6 +- .../integrations/models/email.py | 25 ++ .../integrations/models/execution.py | 4 + .../integrations/providers.py | 20 + .../integrations/utils/execute_integration.py | 9 +- .../utils/integrations/__init__.py | 1 + .../integrations/utils/integrations/email.py | 27 ++ integrations-service/poetry.lock | 341 +++++++++++------- integrations-service/pyproject.toml | 5 +- typespec/common/scalars.tsp | 19 - typespec/tasks/steps.tsp | 30 -- typespec/tools/models.tsp | 21 ++ .../@typespec/openapi3/openapi-0.4.0.yaml | 116 +----- .../@typespec/openapi3/openapi-1.0.0.yaml | 116 +----- 21 files changed, 394 insertions(+), 582 deletions(-) create mode 100644 integrations-service/integrations/models/email.py create mode 100644 integrations-service/integrations/utils/integrations/email.py diff --git a/agents-api/agents_api/autogen/Tasks.py b/agents-api/agents_api/autogen/Tasks.py index 83fde00da..c7067ea0c 100644 --- a/agents-api/agents_api/autogen/Tasks.py +++ b/agents-api/agents_api/autogen/Tasks.py @@ -9,12 +9,6 @@ from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, StrictBool from .Chat import ChatSettings -from .Docs import ( - EmbedQueryRequest, - HybridDocSearchRequest, - TextOnlyDocSearchRequest, - VectorDocSearchRequest, -) from .Tools import CreateToolRequest, NamedToolChoice @@ -33,8 +27,6 @@ class CaseThen(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -61,8 +53,6 @@ class CaseThenUpdateItem(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -128,8 +118,6 @@ class CreateTaskRequest(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -161,22 +149,6 @@ class CreateTaskRequest(BaseModel): metadata: dict[str, Any] | None = None -class EmbedStep(BaseModel): - model_config = ConfigDict( - populate_by_name=True, - ) - kind_: Annotated[ - Literal["embed"], Field("embed", json_schema_extra={"readOnly": True}) - ] - """ - The kind of step - """ - embed: EmbedQueryRequest - """ - The text to embed - """ - - class ErrorWorkflowStep(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -225,8 +197,6 @@ class ForeachDo(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep ) """ @@ -250,8 +220,6 @@ class ForeachDoUpdateItem(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep ) """ @@ -324,8 +292,6 @@ class IfElseWorkflowStep(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -342,8 +308,6 @@ class IfElseWorkflowStep(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -376,8 +340,6 @@ class IfElseWorkflowStepUpdateItem(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -394,8 +356,6 @@ class IfElseWorkflowStepUpdateItem(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -462,8 +422,6 @@ class Main(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep ) """ @@ -504,8 +462,6 @@ class MainModel(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep ) """ @@ -545,8 +501,6 @@ class ParallelStep(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep ], Field(max_length=100), @@ -572,8 +526,6 @@ class ParallelStepUpdateItem(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep ], Field(max_length=100), @@ -600,8 +552,6 @@ class PatchTaskRequest(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -762,22 +712,6 @@ class ReturnStep(BaseModel): """ -class SearchStep(BaseModel): - model_config = ConfigDict( - populate_by_name=True, - ) - kind_: Annotated[ - Literal["search"], Field("search", json_schema_extra={"readOnly": True}) - ] - """ - The kind of step - """ - search: VectorDocSearchRequest | TextOnlyDocSearchRequest | HybridDocSearchRequest - """ - The search query - """ - - class SetStep(BaseModel): model_config = ConfigDict( populate_by_name=True, @@ -878,8 +812,6 @@ class Task(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep @@ -1013,8 +945,6 @@ class UpdateTaskRequest(BaseModel): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep | ReturnStep | SleepStep diff --git a/agents-api/agents_api/autogen/Tools.py b/agents-api/agents_api/autogen/Tools.py index ffe10302c..423896e89 100644 --- a/agents-api/agents_api/autogen/Tools.py +++ b/agents-api/agents_api/autogen/Tools.py @@ -223,6 +223,7 @@ class IntegrationDef(BaseModel): "spider", "brave", "browserbase", + "email", ] | str ) @@ -260,6 +261,7 @@ class IntegrationDefUpdate(BaseModel): "spider", "brave", "browserbase", + "email", ] | str | None diff --git a/agents-api/agents_api/autogen/openapi_model.py b/agents-api/agents_api/autogen/openapi_model.py index 0d9390816..fd06f38a8 100644 --- a/agents-api/agents_api/autogen/openapi_model.py +++ b/agents-api/agents_api/autogen/openapi_model.py @@ -12,7 +12,6 @@ computed_field, field_validator, model_validator, - validator, ) from ..common.utils.datetime import utcnow @@ -401,8 +400,6 @@ def from_model_input( | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | ReturnStep | SleepStep | ErrorWorkflowStep @@ -475,8 +472,6 @@ class Task(_Task): | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | ReturnStep | SleepStep | ErrorWorkflowStep diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index d26a3d999..edf54fb12 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -16,7 +16,6 @@ from ...activities.execute_system import execute_system from ...autogen.openapi_model import ( ApiCallDef, - EmbedStep, ErrorWorkflowStep, EvaluateStep, ForeachDo, @@ -29,7 +28,6 @@ ParallelStep, PromptStep, ReturnStep, - SearchStep, SetStep, SleepFor, SleepStep, @@ -72,8 +70,6 @@ # | GetStep # ✅ # | SetStep # ✅ # | LogStep # ✅ -# | EmbedStep # ❌ -# | SearchStep # ❌ # | ReturnStep # ✅ # | SleepStep # ✅ # | ErrorWorkflowStep # ✅ @@ -455,18 +451,6 @@ async def run( state = PartialTransition(output=value) - case EmbedStep(), _: - # FIXME: Implement EmbedStep - # SCRUM-19 - workflow.logger.error("EmbedStep not yet implemented") - raise ApplicationError("Not implemented") - - case SearchStep(), _: - # FIXME: Implement SearchStep - # SCRUM-18 - workflow.logger.error("SearchStep not yet implemented") - raise ApplicationError("Not implemented") - case ParallelStep(), _: # FIXME: Implement ParallelStep # SCRUM-17 diff --git a/agents-api/poetry.lock b/agents-api/poetry.lock index 608a8e665..907669721 100644 --- a/agents-api/poetry.lock +++ b/agents-api/poetry.lock @@ -837,21 +837,21 @@ files = [ [[package]] name = "dnspython" -version = "2.6.1" +version = "2.7.0" description = "DNS toolkit" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, ] [package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] -dnssec = ["cryptography (>=41)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] -doq = ["aioquic (>=0.9.25)"] -idna = ["idna (>=3.6)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] @@ -1923,13 +1923,13 @@ dev = ["Sphinx (>=5.1.1)", "black (==23.12.1)", "build (>=0.10.0)", "coverage (> [[package]] name = "litellm" -version = "1.48.16" +version = "1.48.17" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.48.16-py3-none-any.whl", hash = "sha256:a7bcce83c97cbacdaf89f24d1c51d81117bcf0af2f0f3a41532656c570d23932"}, - {file = "litellm-1.48.16.tar.gz", hash = "sha256:bda6fc7c8429fcd42c3a80618098678dae833990b2347740aadb84886035b31c"}, + {file = "litellm-1.48.17-py3-none-any.whl", hash = "sha256:f3c25b8bcdbe2c65fbe492a674574461c200040e9e633073108c9517630469b6"}, + {file = "litellm-1.48.17.tar.gz", hash = "sha256:5b5039b39c4a9f748af8253895eec76b3458960533d1e038d1aec409d550ee37"}, ] [package.dependencies] @@ -2466,64 +2466,64 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numpy" -version = "2.1.1" +version = "2.1.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9"}, - {file = "numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd"}, - {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f"}, - {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab"}, - {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7"}, - {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6"}, - {file = "numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0"}, - {file = "numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647"}, - {file = "numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728"}, - {file = "numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, - {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, - {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, - {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, - {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, - {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, - {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, - {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, - {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, - {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, - {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, - {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, - {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0"}, - {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb"}, - {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df"}, - {file = "numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78"}, - {file = "numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556"}, - {file = "numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b"}, - {file = "numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468"}, - {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef"}, - {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f"}, - {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c"}, - {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39"}, - {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30d53720b726ec36a7f88dc873f0eec8447fbc93d93a8f079dfac2629598d6ee"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d3ca0a72dd8846eb6f7dfe8f19088060fcb76931ed592d29128e0219652884"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:fc44e3c68ff00fd991b59092a54350e6e4911152682b4782f68070985aa9e648"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7c1c60328bd964b53f8b835df69ae8198659e2b9302ff9ebb7de4e5a5994db3d"}, + {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cdb606a7478f9ad91c6283e238544451e3a95f30fb5467fbf715964341a8a86"}, + {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d666cb72687559689e9906197e3bec7b736764df6a2e58ee265e360663e9baf7"}, + {file = "numpy-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6eef7a2dbd0abfb0d9eaf78b73017dbfd0b54051102ff4e6a7b2980d5ac1a03"}, + {file = "numpy-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12edb90831ff481f7ef5f6bc6431a9d74dc0e5ff401559a71e5e4611d4f2d466"}, + {file = "numpy-2.1.2-cp310-cp310-win32.whl", hash = "sha256:a65acfdb9c6ebb8368490dbafe83c03c7e277b37e6857f0caeadbbc56e12f4fb"}, + {file = "numpy-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:860ec6e63e2c5c2ee5e9121808145c7bf86c96cca9ad396c0bd3e0f2798ccbe2"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b42a1a511c81cc78cbc4539675713bbcf9d9c3913386243ceff0e9429ca892fe"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:faa88bc527d0f097abdc2c663cddf37c05a1c2f113716601555249805cf573f1"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c82af4b2ddd2ee72d1fc0c6695048d457e00b3582ccde72d8a1c991b808bb20f"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:13602b3174432a35b16c4cfb5de9a12d229727c3dd47a6ce35111f2ebdf66ff4"}, + {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebec5fd716c5a5b3d8dfcc439be82a8407b7b24b230d0ad28a81b61c2f4659a"}, + {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2b49c3c0804e8ecb05d59af8386ec2f74877f7ca8fd9c1e00be2672e4d399b1"}, + {file = "numpy-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cbba4b30bf31ddbe97f1c7205ef976909a93a66bb1583e983adbd155ba72ac2"}, + {file = "numpy-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8e00ea6fc82e8a804433d3e9cedaa1051a1422cb6e443011590c14d2dea59146"}, + {file = "numpy-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5006b13a06e0b38d561fab5ccc37581f23c9511879be7693bd33c7cd15ca227c"}, + {file = "numpy-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:f1eb068ead09f4994dec71c24b2844f1e4e4e013b9629f812f292f04bd1510d9"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7bf0a4f9f15b32b5ba53147369e94296f5fffb783db5aacc1be15b4bf72f43b"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b1d0fcae4f0949f215d4632be684a539859b295e2d0cb14f78ec231915d644db"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f751ed0a2f250541e19dfca9f1eafa31a392c71c832b6bb9e113b10d050cb0f1"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:bd33f82e95ba7ad632bc57837ee99dba3d7e006536200c4e9124089e1bf42426"}, + {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8cde4f11f0a975d1fd59373b32e2f5a562ade7cde4f85b7137f3de8fbb29a0"}, + {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d95f286b8244b3649b477ac066c6906fbb2905f8ac19b170e2175d3d799f4df"}, + {file = "numpy-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ab4754d432e3ac42d33a269c8567413bdb541689b02d93788af4131018cbf366"}, + {file = "numpy-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e585c8ae871fd38ac50598f4763d73ec5497b0de9a0ab4ef5b69f01c6a046142"}, + {file = "numpy-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9c6c754df29ce6a89ed23afb25550d1c2d5fdb9901d9c67a16e0b16eaf7e2550"}, + {file = "numpy-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:456e3b11cb79ac9946c822a56346ec80275eaf2950314b249b512896c0d2505e"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a84498e0d0a1174f2b3ed769b67b656aa5460c92c9554039e11f20a05650f00d"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4d6ec0d4222e8ffdab1744da2560f07856421b367928026fb540e1945f2eeeaf"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:259ec80d54999cc34cd1eb8ded513cb053c3bf4829152a2e00de2371bd406f5e"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:675c741d4739af2dc20cd6c6a5c4b7355c728167845e3c6b0e824e4e5d36a6c3"}, + {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b2d4e667895cc55e3ff2b56077e4c8a5604361fc21a042845ea3ad67465aa8"}, + {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43cca367bf94a14aca50b89e9bc2061683116cfe864e56740e083392f533ce7a"}, + {file = "numpy-2.1.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:76322dcdb16fccf2ac56f99048af32259dcc488d9b7e25b51e5eca5147a3fb98"}, + {file = "numpy-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32e16a03138cabe0cb28e1007ee82264296ac0983714094380b408097a418cfe"}, + {file = "numpy-2.1.2-cp313-cp313-win32.whl", hash = "sha256:242b39d00e4944431a3cd2db2f5377e15b5785920421993770cddb89992c3f3a"}, + {file = "numpy-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:f2ded8d9b6f68cc26f8425eda5d3877b47343e68ca23d0d0846f4d312ecaa445"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ffef621c14ebb0188a8633348504a35c13680d6da93ab5cb86f4e54b7e922b5"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad369ed238b1959dfbade9018a740fb9392c5ac4f9b5173f420bd4f37ba1f7a0"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d82075752f40c0ddf57e6e02673a17f6cb0f8eb3f587f63ca1eaab5594da5b17"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1600068c262af1ca9580a527d43dc9d959b0b1d8e56f8a05d830eea39b7c8af6"}, + {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a26ae94658d3ba3781d5e103ac07a876b3e9b29db53f68ed7df432fd033358a8"}, + {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13311c2db4c5f7609b462bc0f43d3c465424d25c626d95040f073e30f7570e35"}, + {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:2abbf905a0b568706391ec6fa15161fad0fb5d8b68d73c461b3c1bab6064dd62"}, + {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ef444c57d664d35cac4e18c298c47d7b504c66b17c2ea91312e979fcfbdfb08a"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bdd407c40483463898b84490770199d5714dcc9dd9b792f6c6caccc523c00952"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:da65fb46d4cbb75cb417cddf6ba5e7582eb7bb0b47db4b99c9fe5787ce5d91f5"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c193d0b0238638e6fc5f10f1b074a6993cb13b0b431f64079a509d63d3aa8b7"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a7d80b2e904faa63068ead63107189164ca443b42dd1930299e0d1cb041cec2e"}, + {file = "numpy-2.1.2.tar.gz", hash = "sha256:13532a088217fa624c99b843eeb54640de23b3414b14aa66d023805eb731066c"}, ] [[package]] @@ -4057,13 +4057,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "termcolor" -version = "2.4.0" +version = "2.5.0" description = "ANSI color formatting for output in terminal" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, ] [package.extras] @@ -4687,4 +4687,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "62fd7359138dfd660b6601064b7c3e732e436fbbc9c9281b42ad3e46ff3a6c04" +content-hash = "04b888dec8224adfc326c796eda70f96df1ab93905cbfe3ebda00330b2740e48" diff --git a/agents-api/pyproject.toml b/agents-api/pyproject.toml index 2ed126d6f..1701a45cd 100644 --- a/agents-api/pyproject.toml +++ b/agents-api/pyproject.toml @@ -18,7 +18,7 @@ openai = "^1.41.0" httpx = "^0.27.0" sentry-sdk = {extras = ["fastapi"], version = "^2.13.0"} temporalio = "^1.7.0" -pydantic = {extras = ["email"], version = "^2.8.2"} +pydantic = {extras = ["email"], version = "^2.9.2"} arrow = "^1.3.0" jinja2 = "^3.1.4" jinja2schema = "^0.1.4" diff --git a/integrations-service/integrations/models/__init__.py b/integrations-service/integrations/models/__init__.py index 9f7fb6992..902a4a044 100644 --- a/integrations-service/integrations/models/__init__.py +++ b/integrations-service/integrations/models/__init__.py @@ -12,6 +12,7 @@ BrowserBaseLoadOutput, BrowserBaseSetup, ) +from .email import EmailArguments, EmailOutput, EmailSetup from .hacker_news import HackerNewsFetchArguments, HackerNewsFetchOutput from .spider import SpiderFetchArguments, SpiderFetchOutput, SpiderSetup from .weather import WeatherGetArguments, WeatherGetOutput, WeatherSetup diff --git a/integrations-service/integrations/models/base_models.py b/integrations-service/integrations/models/base_models.py index 72e250365..9f119d460 100644 --- a/integrations-service/integrations/models/base_models.py +++ b/integrations-service/integrations/models/base_models.py @@ -16,9 +16,9 @@ class BaseOutput(BaseModel): ... class ProviderInfo(BaseModel): - url: Optional[Url] - docs: Optional[Url] - icon: Optional[Url] + url: Optional[Url] = None + docs: Optional[Url] = None + icon: Optional[Url] = None friendly_name: str diff --git a/integrations-service/integrations/models/email.py b/integrations-service/integrations/models/email.py new file mode 100644 index 000000000..cab794a7d --- /dev/null +++ b/integrations-service/integrations/models/email.py @@ -0,0 +1,25 @@ +from pydantic import EmailStr, Field + +from .base_models import ( + BaseArguments, + BaseOutput, + BaseSetup, +) + + +class EmailSetup(BaseSetup): + host: str = Field(..., description="The host of the email server") + port: int = Field(..., description="The port of the email server") + user: str = Field(..., description="The username of the email server") + password: str = Field(..., description="The password of the email server") + + +class EmailArguments(BaseArguments): + to: EmailStr = Field(..., description="The email address to send the email to") + from_: EmailStr = Field(..., alias="from", description="The email address to send the email from") + subject: str = Field(..., description="The subject of the email") + body: str = Field(..., description="The body of the email") + + +class EmailOutput(BaseOutput): + success: bool = Field(..., description="Whether the email was sent successfully") diff --git a/integrations-service/integrations/models/execution.py b/integrations-service/integrations/models/execution.py index ff9290d6a..db1ef801f 100644 --- a/integrations-service/integrations/models/execution.py +++ b/integrations-service/integrations/models/execution.py @@ -8,12 +8,14 @@ BrowserBaseLoadOutput, BrowserBaseSetup, ) +from .email import EmailArguments, EmailOutput, EmailSetup from .hacker_news import HackerNewsFetchArguments, HackerNewsFetchOutput from .spider import SpiderFetchArguments, SpiderFetchOutput, SpiderSetup from .weather import WeatherGetArguments, WeatherGetOutput, WeatherSetup from .wikipedia import WikipediaSearchArguments, WikipediaSearchOutput ExecutionSetup = Union[ + EmailSetup, SpiderSetup, WeatherSetup, BraveSearchSetup, @@ -23,6 +25,7 @@ ExecutionArguments = Union[ SpiderFetchArguments, WeatherGetArguments, + EmailArguments, HackerNewsFetchArguments, WikipediaSearchArguments, BraveSearchArguments, @@ -32,6 +35,7 @@ ExecutionResponse = Union[ SpiderFetchOutput, WeatherGetOutput, + EmailOutput, HackerNewsFetchOutput, WikipediaSearchOutput, BraveSearchOutput, diff --git a/integrations-service/integrations/providers.py b/integrations-service/integrations/providers.py index 4bce7a2ba..41b5bf757 100644 --- a/integrations-service/integrations/providers.py +++ b/integrations-service/integrations/providers.py @@ -7,6 +7,9 @@ BrowserBaseLoadArguments, BrowserBaseLoadOutput, BrowserBaseSetup, + EmailArguments, + EmailOutput, + EmailSetup, HackerNewsFetchArguments, HackerNewsFetchOutput, ProviderInfo, @@ -134,6 +137,22 @@ ), ) +email = BaseProvider( + provider="email", + setup=EmailSetup, + methods=[ + BaseProviderMethod( + method="send", + description="Send an email", + arguments=EmailArguments, + output=EmailOutput, + ), + ], + info=ProviderInfo( + friendly_name="Email", + ), +) + providers = { "wikipedia": wikipedia, "weather": weather, @@ -141,4 +160,5 @@ "spider": spider, "brave": brave, "browserbase": browserbase, + "email": email, } diff --git a/integrations-service/integrations/utils/execute_integration.py b/integrations-service/integrations/utils/execute_integration.py index fdc6d23d0..ab1907885 100644 --- a/integrations-service/integrations/utils/execute_integration.py +++ b/integrations-service/integrations/utils/execute_integration.py @@ -26,10 +26,15 @@ async def execute_integration( if setup: setup_class = provider.setup - if setup_class: + if setup_class and not isinstance(setup, setup_class): setup = setup_class(**setup.model_dump()) + arguments_class = next(m for m in provider.methods if m.method == method).arguments - parsed_arguments = arguments_class(**arguments.model_dump()) + + if not isinstance(arguments, arguments_class): + parsed_arguments = arguments_class(**arguments.model_dump()) + else: + parsed_arguments = arguments if setup: return await execution_function(setup=setup, arguments=parsed_arguments) diff --git a/integrations-service/integrations/utils/integrations/__init__.py b/integrations-service/integrations/utils/integrations/__init__.py index dc123fd4c..238dacfd3 100644 --- a/integrations-service/integrations/utils/integrations/__init__.py +++ b/integrations-service/integrations/utils/integrations/__init__.py @@ -1,5 +1,6 @@ from .brave import search from .browserbase import load +from .email import send from .hacker_news import fetch from .spider import crawl from .weather import get diff --git a/integrations-service/integrations/utils/integrations/email.py b/integrations-service/integrations/utils/integrations/email.py new file mode 100644 index 000000000..b0ced9ff5 --- /dev/null +++ b/integrations-service/integrations/utils/integrations/email.py @@ -0,0 +1,27 @@ +from email.message import EmailMessage +from smtplib import SMTP + +from beartype import beartype + +from ...models import EmailArguments, EmailOutput, EmailSetup + + +# @beartype +async def send( + setup: EmailSetup, arguments: EmailArguments +) -> EmailOutput: + """ + Sends an email with the provided details. + """ + + message = EmailMessage() + message.set_content(arguments.body) + message["Subject"] = arguments.subject + message["From"] = arguments.from_ + message["To"] = arguments.to + + with SMTP(setup.host, setup.port) as server: + server.login(setup.user, setup.password) + server.send_message(message) + + return EmailOutput(success=True) diff --git a/integrations-service/poetry.lock b/integrations-service/poetry.lock index e56fd28cd..bc294a56f 100644 --- a/integrations-service/poetry.lock +++ b/integrations-service/poetry.lock @@ -2,113 +2,113 @@ [[package]] name = "aiohappyeyeballs" -version = "2.4.2" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, - {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.8" +version = "3.10.9" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, - {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, - {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, - {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, - {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, - {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, - {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, - {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, - {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, - {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, - {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, - {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, - {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, - {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, - {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, - {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, + {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, + {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, + {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, + {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, + {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, + {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, + {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, + {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, + {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, + {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, + {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, + {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, + {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, ] [package.dependencies] @@ -196,6 +196,24 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +[[package]] +name = "beartype" +version = "0.19.0" +description = "Unbearably fast near-real-time hybrid runtime-static type-checking in pure Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "beartype-0.19.0-py3-none-any.whl", hash = "sha256:33b2694eda0daf052eb2aff623ed9a8a586703bbf0a90bbc475a83bbf427f699"}, + {file = "beartype-0.19.0.tar.gz", hash = "sha256:de42dfc1ba5c3710fde6c3002e3bd2cad236ed4d2aabe876345ab0b4234a6573"}, +] + +[package.extras] +dev = ["autoapi (>=0.9.0)", "coverage (>=5.5)", "equinox", "jax[cpu]", "jaxtyping", "mypy (>=0.800)", "numba", "numpy", "pandera", "pydata-sphinx-theme (<=0.7.2)", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"] +test = ["coverage (>=5.5)", "equinox", "jax[cpu]", "jaxtyping", "mypy (>=0.800)", "numba", "numpy", "pandera", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "sphinx", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +test-tox = ["equinox", "jax[cpu]", "jaxtyping", "mypy (>=0.800)", "numba", "numpy", "pandera", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "sphinx", "typing-extensions (>=3.10.0.0)"] +test-tox-coverage = ["coverage (>=5.5)"] + [[package]] name = "beautifulsoup4" version = "4.12.3" @@ -394,6 +412,26 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "dnspython" +version = "2.7.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + [[package]] name = "duckduckgo-search" version = "6.2.13" @@ -413,6 +451,21 @@ primp = ">=0.6.3" dev = ["mypy (>=1.11.1)", "pytest (>=8.3.1)", "pytest-asyncio (>=0.23.8)", "ruff (>=0.6.1)"] lxml = ["lxml (>=5.2.2)"] +[[package]] +name = "email-validator" +version = "2.2.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + [[package]] name = "fastapi" version = "0.115.0" @@ -628,13 +681,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -645,7 +698,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -836,18 +889,18 @@ files = [ [[package]] name = "langchain" -version = "0.3.1" +version = "0.3.2" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.1-py3-none-any.whl", hash = "sha256:94e5ee7464d4366e4b158aa5704953c39701ea237b9ed4b200096d49e83bb3ae"}, - {file = "langchain-0.3.1.tar.gz", hash = "sha256:54d6e3abda2ec056875a231a418a4130ba7576e629e899067e499bfc847b7586"}, + {file = "langchain-0.3.2-py3-none-any.whl", hash = "sha256:cf005dcba132e46fb5e8d3dfaf7f8751bffd2d73e738c36be58f41edc7e3a4b8"}, + {file = "langchain-0.3.2.tar.gz", hash = "sha256:dc330e6eb10d81d23ba0305d18358702c73cc59e95c410eca6c6779aab4ddc9b"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" -langchain-core = ">=0.3.6,<0.4.0" +langchain-core = ">=0.3.8,<0.4.0" langchain-text-splitters = ">=0.3.0,<0.4.0" langsmith = ">=0.1.17,<0.2.0" numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} @@ -883,13 +936,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.3.6" +version = "0.3.9" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.6-py3-none-any.whl", hash = "sha256:7bb3df0117bdc628b18b6c8748de72c6f537d745d47566053ce6650d5712281c"}, - {file = "langchain_core-0.3.6.tar.gz", hash = "sha256:eb190494a5483f1965f693bb2085edb523370b20fc52dc294d3bd425773cd076"}, + {file = "langchain_core-0.3.9-py3-none-any.whl", hash = "sha256:26efa048666c7de56d0ab311de2c0778b04cbb2ffe95bff76139118f13815d01"}, + {file = "langchain_core-0.3.9.tar.gz", hash = "sha256:7a6ac988d24d0ddce5874b28f538cd95f69f502b7f50581de22aca0dc58199a8"}, ] [package.dependencies] @@ -920,13 +973,13 @@ langchain-core = ">=0.3.0,<0.4.0" [[package]] name = "langsmith" -version = "0.1.129" +version = "0.1.131" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"}, - {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"}, + {file = "langsmith-0.1.131-py3-none-any.whl", hash = "sha256:80c106b1c42307195cc0bb3a596472c41ef91b79d15bcee9938307800336c563"}, + {file = "langsmith-0.1.131.tar.gz", hash = "sha256:626101a3bf3ca481e5110d5155ace8aa066e4e9cc2fa7d96c8290ade0fbff797"}, ] [package.dependencies] @@ -937,6 +990,7 @@ pydantic = [ {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "libcst" @@ -1338,13 +1392,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.50.2" +version = "1.51.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.50.2-py3-none-any.whl", hash = "sha256:822dd2051baa3393d0d5406990611975dd6f533020dc9375a34d4fe67e8b75f7"}, - {file = "openai-1.50.2.tar.gz", hash = "sha256:3987ae027152fc8bea745d60b02c8f4c4a76e1b5c70e73565fa556db6f78c9e6"}, + {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"}, + {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"}, ] [package.dependencies] @@ -1527,6 +1581,7 @@ files = [ [package.dependencies] annotated-types = ">=0.6.0" +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} pydantic-core = "2.23.4" typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} @@ -1916,31 +1971,45 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "ruff" -version = "0.6.8" +version = "0.6.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"}, - {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"}, - {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"}, - {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"}, - {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"}, - {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"}, - {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"}, - {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"}, - {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, + {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, + {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, + {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, + {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, + {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, + {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, + {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, ] [[package]] @@ -2144,13 +2213,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "termcolor" -version = "2.4.0" +version = "2.5.0" description = "ANSI color formatting for output in terminal" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, ] [package.extras] @@ -2393,4 +2462,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "09de1366659448cf284d8db6f8b7ed615e75f1aa44c1684868905e1c86780ac4" +content-hash = "4f933143b7f17beaa1c4e8bdc117978de07df01f9b8b0eb4eb11f88182230ee5" diff --git a/integrations-service/pyproject.toml b/integrations-service/pyproject.toml index 584efa480..33173f2c2 100644 --- a/integrations-service/pyproject.toml +++ b/integrations-service/pyproject.toml @@ -10,7 +10,7 @@ langchain-community = "^0.3.0" fastapi = "^0.115.0" uvicorn = "^0.30.6" langchain = "^0.3.0" -pydantic = "^2.9.2" +pydantic = {extras = ["email"], version = "^2.9.2"} duckduckgo-search = "^6.2.13" openai = "^1.47.1" tweepy = "^4.14.0" @@ -20,6 +20,7 @@ pyowm = "^3.3.0" spider-client = "^0.0.70" browserbase = "^0.3.0" setuptools = "^75.1.0" +beartype = "^0.19.0" [tool.poe.tasks] format = "ruff format" @@ -38,4 +39,4 @@ ruff = "^0.6.8" [build-system] requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file +build-backend = "poetry.core.masonry.api" diff --git a/typespec/common/scalars.tsp b/typespec/common/scalars.tsp index dc206fa02..95c92d0b8 100644 --- a/typespec/common/scalars.tsp +++ b/typespec/common/scalars.tsp @@ -55,22 +55,3 @@ scalar PyExpression extends string; /** A valid jinja template. */ scalar JinjaTemplate extends string; - -/** Integration provider name */ -alias integrationProvider = ( - | "dummy" - | "hacker_news" - | "weather" - | "wikipedia" - | "spider" - | "brave" - | "browserbase" - // | "dalle_image_generator" - // | "duckduckgo_search" - // | "twitter" - // | "webpage" - // | "requests" -); - -/** A valid HTTP method */ -alias httpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "CONNECT" | "TRACE"; diff --git a/typespec/tasks/steps.tsp b/typespec/tasks/steps.tsp index 7a5f6d5b9..1d8c19209 100644 --- a/typespec/tasks/steps.tsp +++ b/typespec/tasks/steps.tsp @@ -48,8 +48,6 @@ alias MappableWorkflowStep = | GetStep | SetStep | LogStep - | EmbedStep - | SearchStep | YieldStep; alias NonConditionalWorkflowStep = @@ -159,34 +157,6 @@ model LogStepDef { log: JinjaTemplate; } -//////////////////////// -/// Doc search steps /// -//////////////////////// - -model EmbedStep extends BaseWorkflowStep<"embed"> { - @visibility("read") - kind_: "embed" = "embed"; - - ...EmbedStepDef; -} - -model EmbedStepDef { - /** The text to embed */ - embed: EmbedQueryRequest; -} - -model SearchStep extends BaseWorkflowStep<"search"> { - @visibility("read") - kind_: "search" = "search"; - - ...SearchStepDef; -} - -model SearchStepDef { - /** The search query */ - search: DocSearchRequest; -} - /////////////////////// /// Key-value steps /// /////////////////////// diff --git a/typespec/tools/models.tsp b/typespec/tools/models.tsp index 61918a4f7..de509dec4 100644 --- a/typespec/tools/models.tsp +++ b/typespec/tools/models.tsp @@ -8,6 +8,23 @@ namespace Tools; // TOOL MODELS // +// TODO: Split these into different files + +/** A valid HTTP method */ +alias httpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "CONNECT" | "TRACE"; + +/** Integration provider name */ +alias integrationProvider = ( + | "dummy" + | "hacker_news" + | "weather" + | "wikipedia" + | "spider" + | "brave" + | "browserbase" + | "email" +); + enum ToolType { /** A tool that emulates a function call */ function, @@ -42,6 +59,8 @@ model FunctionDef { } +// TODO: Add granular definitions for each integration + /** Integration definition */ model IntegrationDef { /** The provider of the integration */ @@ -93,6 +112,8 @@ alias operationType = ( | "list" ); +// TODO: Add granular definitions for each system call + /** System definition */ model SystemDef { /** Resource is the name of the resource to use */ diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml index 7a7afc3e9..d00a5b9d2 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml @@ -3871,8 +3871,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -3901,8 +3899,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -3935,8 +3931,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -3971,8 +3965,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -4035,8 +4027,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4071,8 +4061,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -4105,36 +4093,6 @@ components: discriminator: propertyName: kind_ description: Payload for creating a task - Tasks.EmbedStep: - type: object - required: - - kind_ - - embed - properties: - kind_: - type: string - enum: - - embed - default: embed - readOnly: true - embed: - allOf: - - $ref: '#/components/schemas/Docs.EmbedQueryRequest' - description: The text to embed - allOf: - - type: object - required: - - kind_ - properties: - kind_: - type: string - enum: - - embed - description: The kind of step - readOnly: true - discriminator: - propertyName: kind_ - mapping: {} Tasks.ErrorWorkflowStep: type: object required: @@ -4215,8 +4173,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration Tasks.ForeachDoUpdateItem: @@ -4239,8 +4195,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration Tasks.ForeachStep: @@ -4346,8 +4300,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4363,8 +4315,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4407,8 +4357,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4424,8 +4372,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4496,8 +4442,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' maxItems: 100 description: The steps to run in parallel. Max concurrency will depend on the platform. @@ -4530,8 +4474,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' maxItems: 100 description: The steps to run in parallel. Max concurrency will depend on the platform. @@ -4560,8 +4502,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4589,8 +4529,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -4648,8 +4586,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4677,8 +4613,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5001,38 +4935,6 @@ components: discriminator: propertyName: kind_ mapping: {} - Tasks.SearchStep: - type: object - required: - - kind_ - - search - properties: - kind_: - type: string - enum: - - search - default: search - readOnly: true - search: - anyOf: - - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' - - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' - - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' - description: The search query - allOf: - - type: object - required: - - kind_ - properties: - kind_: - type: string - enum: - - search - description: The kind of step - readOnly: true - discriminator: - propertyName: kind_ - mapping: {} Tasks.SetStep: type: object required: @@ -5210,8 +5112,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5246,8 +5146,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5324,8 +5222,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5360,8 +5256,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5496,8 +5390,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5532,8 +5424,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5596,8 +5486,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5632,8 +5520,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5967,6 +5853,7 @@ components: - spider - brave - browserbase + - email - type: string description: The provider of the integration method: @@ -5995,6 +5882,7 @@ components: - spider - brave - browserbase + - email - type: string description: The provider of the integration method: diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml index d82540194..b3f3919a9 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml @@ -3871,8 +3871,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -3901,8 +3899,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -3935,8 +3931,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -3971,8 +3965,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -4035,8 +4027,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4071,8 +4061,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -4105,36 +4093,6 @@ components: discriminator: propertyName: kind_ description: Payload for creating a task - Tasks.EmbedStep: - type: object - required: - - kind_ - - embed - properties: - kind_: - type: string - enum: - - embed - default: embed - readOnly: true - embed: - allOf: - - $ref: '#/components/schemas/Docs.EmbedQueryRequest' - description: The text to embed - allOf: - - type: object - required: - - kind_ - properties: - kind_: - type: string - enum: - - embed - description: The kind of step - readOnly: true - discriminator: - propertyName: kind_ - mapping: {} Tasks.ErrorWorkflowStep: type: object required: @@ -4215,8 +4173,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration Tasks.ForeachDoUpdateItem: @@ -4239,8 +4195,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration Tasks.ForeachStep: @@ -4346,8 +4300,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4363,8 +4315,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4407,8 +4357,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4424,8 +4372,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4496,8 +4442,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' maxItems: 100 description: The steps to run in parallel. Max concurrency will depend on the platform. @@ -4530,8 +4474,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' maxItems: 100 description: The steps to run in parallel. Max concurrency will depend on the platform. @@ -4560,8 +4502,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4589,8 +4529,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -4648,8 +4586,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -4677,8 +4613,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5001,38 +4935,6 @@ components: discriminator: propertyName: kind_ mapping: {} - Tasks.SearchStep: - type: object - required: - - kind_ - - search - properties: - kind_: - type: string - enum: - - search - default: search - readOnly: true - search: - anyOf: - - $ref: '#/components/schemas/Docs.VectorDocSearchRequest' - - $ref: '#/components/schemas/Docs.TextOnlyDocSearchRequest' - - $ref: '#/components/schemas/Docs.HybridDocSearchRequest' - description: The search query - allOf: - - type: object - required: - - kind_ - properties: - kind_: - type: string - enum: - - search - description: The kind of step - readOnly: true - discriminator: - propertyName: kind_ - mapping: {} Tasks.SetStep: type: object required: @@ -5210,8 +5112,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5246,8 +5146,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5324,8 +5222,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5360,8 +5256,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5496,8 +5390,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5532,8 +5424,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5596,8 +5486,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' @@ -5632,8 +5520,6 @@ components: - $ref: '#/components/schemas/Tasks.GetStep' - $ref: '#/components/schemas/Tasks.SetStep' - $ref: '#/components/schemas/Tasks.LogStep' - - $ref: '#/components/schemas/Tasks.EmbedStep' - - $ref: '#/components/schemas/Tasks.SearchStep' - $ref: '#/components/schemas/Tasks.YieldStep' description: The steps to run for each iteration reduce: @@ -5967,6 +5853,7 @@ components: - spider - brave - browserbase + - email - type: string description: The provider of the integration method: @@ -5995,6 +5882,7 @@ components: - spider - brave - browserbase + - email - type: string description: The provider of the integration method: From 00af85d9c845c38b9d03ec27584fc0299955bb8e Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 01:16:26 -0400 Subject: [PATCH 067/113] fix: Add developer_id constraints in all queries when possible (#603) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Add developer_id constraints to database queries and introduce environment flags for developer verification. > > - **Behavior**: > - Add `developer_id` constraints to queries in `create_or_update_agent.py`, `get_agent.py`, `prepare_session_data.py`, `create_or_update_user.py`, and `patch_user.py` to ensure operations are scoped to the correct developer. > - Introduce `do_verify_developer` and `do_verify_developer_owns_resource` flags in `env.py` to toggle developer verification. > - **Queries**: > - Modify queries in `create_or_update_agent.py` and `get_agent.py` to include `developer_id` in input and match conditions. > - Update `prepare_session_data.py` to pass `developer_id` in session-related queries. > - Add `developer_id` checks in `create_or_update_user.py` and `patch_user.py` for user operations. > - **Utils**: > - Update `verify_developer_id_query` and `verify_developer_owns_resource_query` in `utils.py` to respect new environment flags. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 09d8dadf50f44e4db93df5de89d2832be8dd4aad. It will automatically update as commits are pushed. Signed-off-by: Diwank Singh Tomer --- agents-api/agents_api/env.py | 4 ++++ .../models/agent/create_or_update_agent.py | 2 ++ agents-api/agents_api/models/agent/get_agent.py | 1 + .../models/session/prepare_session_data.py | 14 +++++++++++--- .../models/user/create_or_update_user.py | 2 ++ agents-api/agents_api/models/user/patch_user.py | 2 ++ agents-api/agents_api/models/utils.py | 7 +++++++ 7 files changed, 29 insertions(+), 3 deletions(-) diff --git a/agents-api/agents_api/env.py b/agents-api/agents_api/env.py index 42b2ce8d2..2b016fd40 100644 --- a/agents-api/agents_api/env.py +++ b/agents-api/agents_api/env.py @@ -40,6 +40,10 @@ summarization_model_name: str = env.str( "SUMMARIZATION_MODEL_NAME", default="gpt-4-turbo" ) +do_verify_developer: bool = env.bool("DO_VERIFY_DEVELOPER", default=True) +do_verify_developer_owns_resource: bool = env.bool( + "DO_VERIFY_DEVELOPER_OWNS_RESOURCE", default=True +) # Auth diff --git a/agents-api/agents_api/models/agent/create_or_update_agent.py b/agents-api/agents_api/models/agent/create_or_update_agent.py index 3902c1bb5..8a3975183 100644 --- a/agents-api/agents_api/models/agent/create_or_update_agent.py +++ b/agents-api/agents_api/models/agent/create_or_update_agent.py @@ -136,6 +136,7 @@ def create_or_update_agent( input[_agent_id, developer_id, model, name, about, metadata, instructions, updated_at], *agents{ agent_id, + developer_id, created_at, }, agent_id = to_uuid(_agent_id), @@ -144,6 +145,7 @@ def create_or_update_agent( input[_agent_id, developer_id, model, name, about, metadata, instructions, updated_at], not *agents{ agent_id, + developer_id, }, created_at = now(), agent_id = to_uuid(_agent_id), diff --git a/agents-api/agents_api/models/agent/get_agent.py b/agents-api/agents_api/models/agent/get_agent.py index bdae85fcb..008e39454 100644 --- a/agents-api/agents_api/models/agent/get_agent.py +++ b/agents-api/agents_api/models/agent/get_agent.py @@ -71,6 +71,7 @@ def get_agent(*, developer_id: UUID, agent_id: UUID) -> tuple[list[str], dict]: instructions, ] := input[id], *agents { + developer_id: to_uuid($developer_id), agent_id: id, model, name, diff --git a/agents-api/agents_api/models/session/prepare_session_data.py b/agents-api/agents_api/models/session/prepare_session_data.py index bbbd9c4cd..83ee0c219 100644 --- a/agents-api/agents_api/models/session/prepare_session_data.py +++ b/agents-api/agents_api/models/session/prepare_session_data.py @@ -56,12 +56,13 @@ def prepare_session_data( # This query retrieves session information by using `input` to pass parameters, get_query = """ - input[session_id] <- [[ + input[session_id, developer_id] <- [[ to_uuid($session_id), + to_uuid($developer_id), ]] participants[collect(participant_id), participant_type] := - input[session_id], + input[session_id, developer_id], *session_lookup{ session_id, participant_id, @@ -102,9 +103,11 @@ def prepare_session_data( } agent_data[collect(record)] := + input[session_id, developer_id], agents[agent_ids], agent_id in agent_ids, *agents{ + developer_id, agent_id, model, name, @@ -129,9 +132,11 @@ def prepare_session_data( # Version where we don't have default settings agent_data[collect(record)] := + input[session_id, developer_id], agents[agent_ids], agent_id in agent_ids, *agents{ + developer_id, agent_id, model, name, @@ -155,9 +160,11 @@ def prepare_session_data( } user_data[collect(record)] := + input[session_id, developer_id], users[user_ids], user_id in user_ids, *users{ + developer_id, user_id, name, about, @@ -175,8 +182,9 @@ def prepare_session_data( } session_data[record] := - input[session_id], + input[session_id, developer_id], *sessions{ + developer_id, session_id, situation, summary, diff --git a/agents-api/agents_api/models/user/create_or_update_user.py b/agents-api/agents_api/models/user/create_or_update_user.py index 97db913c5..d295d1d8a 100644 --- a/agents-api/agents_api/models/user/create_or_update_user.py +++ b/agents-api/agents_api/models/user/create_or_update_user.py @@ -70,6 +70,7 @@ def create_or_update_user( ?[user_id, developer_id, name, about, metadata, created_at, updated_at] := input[_user_id, developer_id, name, about, metadata, updated_at], *users{ + developer_id, user_id, created_at, }, @@ -78,6 +79,7 @@ def create_or_update_user( ?[user_id, developer_id, name, about, metadata, created_at, updated_at] := input[_user_id, developer_id, name, about, metadata, updated_at], not *users{ + developer_id, user_id, }, created_at = now(), user_id = to_uuid(_user_id), diff --git a/agents-api/agents_api/models/user/patch_user.py b/agents-api/agents_api/models/user/patch_user.py index 4498c6ded..265241d47 100644 --- a/agents-api/agents_api/models/user/patch_user.py +++ b/agents-api/agents_api/models/user/patch_user.py @@ -78,6 +78,7 @@ def patch_user( ?[{user_update_cols}, metadata] := input[{user_update_cols}], *users {{ + developer_id: to_uuid($developer_id), user_id: to_uuid($user_id), metadata: md, }}, @@ -101,5 +102,6 @@ def patch_user( "user_update_vals": user_update_vals, "metadata": metadata, "user_id": str(user_id), + "developer_id": str(developer_id), }, ) diff --git a/agents-api/agents_api/models/utils.py b/agents-api/agents_api/models/utils.py index c163642c0..f63646e1c 100644 --- a/agents-api/agents_api/models/utils.py +++ b/agents-api/agents_api/models/utils.py @@ -8,6 +8,7 @@ from pydantic import BaseModel from ..common.utils.cozo import uuid_int_list_to_uuid4 +from ..env import do_verify_developer, do_verify_developer_owns_resource P = ParamSpec("P") T = TypeVar("T") @@ -117,6 +118,9 @@ def mark_session_updated_query(developer_id: UUID | str, session_id: UUID | str) def verify_developer_id_query(developer_id: UUID | str) -> str: + if not do_verify_developer: + return "?[exists] := exists = true" + return f""" matched[count(developer_id)] := *developers{{ @@ -138,6 +142,9 @@ def verify_developer_owns_resource_query( parents: list[tuple[str, str]] | None = None, **resource_id, ) -> str: + if not do_verify_developer_owns_resource: + return "?[exists] := exists = true" + parents = parents or [] resource_id_key, resource_id_value = next(iter(resource_id.items())) From e36f33b785f0301999695636be2b37793f6d981b Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Mon, 7 Oct 2024 14:32:37 +0300 Subject: [PATCH 068/113] feat(agents-api): Add doc search system tool (#604) > [!IMPORTANT] > Adds document creation and search functionalities for agents and users, updates `list_docs` with a new parameter, and refactors `base_evaluate` for complex dictionaries. > > - **Behavior**: > - Adds support for document creation and search operations in `execute_system.py` for both agents and users. > - Introduces `create_agent_doc`, `create_user_doc`, `search_agent_docs`, and `search_user_docs` functions. > - Handles `text`, `vector`, and `hybrid` search requests using `HybridDocSearchRequest`, `TextOnlyDocSearchRequest`, and `VectorDocSearchRequest`. > - Replaces `developer_id` with `x_developer_id` for certain operations. > - **Models**: > - Updates `list_docs` in `list_docs.py` to include `include_without_embeddings` parameter. > - **Misc**: > - Refactors `base_evaluate` in `base_evaluate.py` to handle nested dictionaries with string values. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 8432e9584eb68dfd4f474386933271b6e1f601ca. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: Diwank Singh Tomer Co-authored-by: HamadaSalhab --- .../agents_api/activities/execute_system.py | 91 ++++++++++++++++++- .../activities/task_steps/base_evaluate.py | 22 ++--- .../agents_api/models/docs/list_docs.py | 2 + 3 files changed, 100 insertions(+), 15 deletions(-) diff --git a/agents-api/agents_api/activities/execute_system.py b/agents-api/agents_api/activities/execute_system.py index 8e4d71274..8ffb85814 100644 --- a/agents-api/agents_api/activities/execute_system.py +++ b/agents-api/agents_api/activities/execute_system.py @@ -2,8 +2,15 @@ from uuid import UUID from beartype import beartype +from fastapi.background import BackgroundTasks from temporalio import activity +from ..autogen.Docs import ( + CreateDocRequest, + HybridDocSearchRequest, + TextOnlyDocSearchRequest, + VectorDocSearchRequest, +) from ..autogen.Tools import SystemDef from ..common.protocol.tasks import StepContext from ..env import testing @@ -31,6 +38,8 @@ from ..models.user.get_user import get_user as get_user_query from ..models.user.list_users import list_users as list_users_query from ..models.user.update_user import update_user as update_user_query +from ..routers.docs.create_doc import create_agent_doc, create_user_doc +from ..routers.docs.search_docs import search_agent_docs, search_user_docs @beartype @@ -63,17 +72,54 @@ async def execute_system( agent_doc_args = { **{ "owner_type": "agent", - "owner_id": arguments.pop("agent_id"), + "owner_id": arguments["agent_id"], }, **arguments, } + agent_doc_args.pop("agent_id") + if system.operation == "list": return list_docs_query(**agent_doc_args) + elif system.operation == "create": - return create_doc_query(**agent_doc_args) + # The `create_agent_doc` function requires `x_developer_id` instead of `developer_id`. + arguments["x_developer_id"] = arguments.pop("developer_id") + return await create_agent_doc( + data=CreateDocRequest(**arguments.pop("data")), + background_tasks=BackgroundTasks(), + **arguments, + ) + elif system.operation == "delete": return delete_doc_query(**agent_doc_args) + elif system.operation == "search": + # The `search_agent_docs` function requires `x_developer_id` instead of `developer_id`. + arguments["x_developer_id"] = arguments.pop("developer_id") + + if "text" in arguments and "vector" in arguments: + search_params = HybridDocSearchRequest( + text=arguments.pop("text"), + vector=arguments.pop("vector"), + limit=arguments.get("limit", 10), + ) + + elif "text" in arguments: + search_params = TextOnlyDocSearchRequest( + text=arguments.pop("text"), + limit=arguments.get("limit", 10), + ) + elif "vector" in arguments: + search_params = VectorDocSearchRequest( + vector=arguments.pop("vector"), + limit=arguments.get("limit", 10), + ) + + return await search_agent_docs( + search_params=search_params, + **arguments, + ) + # NO SUBRESOURCE elif system.subresource == None: if system.operation == "list": @@ -95,17 +141,54 @@ async def execute_system( user_doc_args = { **{ "owner_type": "user", - "owner_id": arguments.pop("user_id"), + "owner_id": arguments["user_id"], }, **arguments, } + user_doc_args.pop("user_id") + if system.operation == "list": return list_docs_query(**user_doc_args) + elif system.operation == "create": - return create_doc_query(**user_doc_args) + # The `create_user_doc` function requires `x_developer_id` instead of `developer_id`. + arguments["x_developer_id"] = arguments.pop("developer_id") + return await create_user_doc( + data=CreateDocRequest(**arguments.pop("data")), + background_tasks=BackgroundTasks(), + **arguments, + ) + elif system.operation == "delete": return delete_doc_query(**user_doc_args) + elif system.operation == "search": + # The `search_user_docs` function requires `x_developer_id` instead of `developer_id`. + arguments["x_developer_id"] = arguments.pop("developer_id") + + if "text" in arguments and "vector" in arguments: + search_params = HybridDocSearchRequest( + text=arguments.pop("text"), + vector=arguments.pop("vector"), + limit=arguments.get("limit", 10), + ) + + elif "text" in arguments: + search_params = TextOnlyDocSearchRequest( + text=arguments.pop("text"), + limit=arguments.get("limit", 10), + ) + elif "vector" in arguments: + search_params = VectorDocSearchRequest( + vector=arguments.pop("vector"), + limit=arguments.get("limit", 10), + ) + + return await search_user_docs( + search_params=search_params, + **arguments, + ) + # NO SUBRESOURCE elif system.subresource == None: if system.operation == "list": diff --git a/agents-api/agents_api/activities/task_steps/base_evaluate.py b/agents-api/agents_api/activities/task_steps/base_evaluate.py index 3fcbf2f73..c6b83ba89 100644 --- a/agents-api/agents_api/activities/task_steps/base_evaluate.py +++ b/agents-api/agents_api/activities/task_steps/base_evaluate.py @@ -46,29 +46,29 @@ async def base_evaluate( evaluator = get_evaluator(names=values, extra_functions=extra_lambdas) try: + result = None match exprs: case str(): - return evaluator.eval(exprs) - + result = evaluator.eval(exprs) case list(): - return [evaluator.eval(expr) for expr in exprs] - - case dict() as d if all(isinstance(v, dict) for v in d.values()): - return { + result = [evaluator.eval(expr) for expr in exprs] + case dict() as d if all( + isinstance(v, dict) or isinstance(v, str) for v in d.values() + ): + result = { k: {ik: evaluator.eval(iv) for ik, iv in v.items()} + if isinstance(v, dict) + else evaluator.eval(v) for k, v in d.items() } - - case dict(): - return {k: evaluator.eval(v) for k, v in exprs.items()} - case _: raise ValueError(f"Invalid expression: {exprs}") + return result + except BaseException as e: if activity.in_activity(): activity.logger.error(f"Error in base_evaluate: {e}") - raise diff --git a/agents-api/agents_api/models/docs/list_docs.py b/agents-api/agents_api/models/docs/list_docs.py index 4dad7ec06..8f8d8c7a0 100644 --- a/agents-api/agents_api/models/docs/list_docs.py +++ b/agents-api/agents_api/models/docs/list_docs.py @@ -50,6 +50,7 @@ def list_docs( sort_by: Literal["created_at"] = "created_at", direction: Literal["asc", "desc"] = "desc", metadata_filter: dict[str, Any] = {}, + include_without_embeddings: bool = False, ) -> tuple[list[str], dict]: # Transforms the metadata_filter dictionary into a string representation for the datalog query. metadata_filter_str = ", ".join( @@ -70,6 +71,7 @@ def list_docs( content, embedding, }}, + {"" if include_without_embeddings else "not is_null(embedding),"} snippet_data = [index, content, embedding] ?[ From 5b041ca9d43466dafb3ca672c54ffb06f5561c2f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 09:06:31 -0400 Subject: [PATCH 069/113] doc: Add devfest email assistant README Signed-off-by: Diwank Singh Tomer --- IDEAS.md | 1377 ++++++++++++++++++++ cookbooks/00-Devfest-Email-Assistant.ipynb | 296 +++++ 2 files changed, 1673 insertions(+) create mode 100644 IDEAS.md create mode 100644 cookbooks/00-Devfest-Email-Assistant.ipynb diff --git a/IDEAS.md b/IDEAS.md new file mode 100644 index 000000000..83d6d58d4 --- /dev/null +++ b/IDEAS.md @@ -0,0 +1,1377 @@ +# Expanded Implementation Scenarios for Julep + +Below are detailed implementation plans for each of the 50 scenarios using Julep's **docs**, **sessions**, **tasks**, and **executions** features. Each scenario includes a complexity rating from **1 (easiest)** to **5 (most complex)**. + +--- + +### 1. Automated Customer Support Agent + +**Implementation Using Julep:** + +- **Docs:** + - Store customer data, FAQs, and troubleshooting guides. + - Integrate CRM documentation for accessing and updating customer information. + +- **Sessions:** + - Create a persistent session for each customer to maintain conversation context. + - Track interaction history to personalize support. + +- **Tasks:** + - Define tasks for handling common inquiries (e.g., order status, billing issues). + - Implement escalation tasks for complex issues that require human intervention. + - Automate ticket creation and update processes. + +- **Executions:** + - Execute tasks based on customer inputs. + - Monitor task executions to ensure timely responses and issue resolutions. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integrating with external CRM systems, handling diverse query types, and maintaining contextual sessions, which increases complexity. + +--- + +### 2. Smart Research Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store access to academic databases and research papers. + - Include summarization templates and research methodologies. + +- **Sessions:** + - Manage user-specific research sessions to track ongoing projects and queries. + - Maintain context for multi-step research tasks. + +- **Tasks:** + - Create tasks for searching databases, summarizing articles, and compiling reports. + - Implement conditional steps based on research findings. + +- **Executions:** + - Execute research tasks sequentially or in parallel. + - Stream execution results to provide real-time updates to the user. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with academic databases, advanced summarization capabilities, and managing complex multi-step workflows. + +--- + +### 3. Personal Finance Manager + +**Implementation Using Julep:** + +- **Docs:** + - Store user financial data, budgeting templates, and investment information. + - Integrate banking API documentation for transaction fetching. + +- **Sessions:** + - Create persistent sessions to track user financial activities over time. + - Maintain context for budgeting goals and financial plans. + +- **Tasks:** + - Define tasks for expense tracking, budget creation, and investment monitoring. + - Automate alerts for budget limits and investment opportunities. + +- **Executions:** + - Execute financial tasks based on user interactions and predefined schedules. + - Monitor executions to provide real-time financial advice and updates. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Needs secure integration with banking APIs, real-time data processing, and robust budgeting logic. + +--- + +### 4. Content Creation Workflow + +**Implementation Using Julep:** + +- **Docs:** + - Store SEO guidelines, content templates, and style guides. + - Include access to keyword research tools. + +- **Sessions:** + - Manage content creation sessions to track progress and drafts. + - Maintain context for ongoing content projects. + +- **Tasks:** + - Create multi-step tasks for topic ideation, content drafting, SEO optimization, and scheduling. + - Integrate tools for grammar checking and SEO analysis. + +- **Executions:** + - Automate the execution of content creation tasks. + - Schedule publishing according to editorial calendars. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves coordinating multiple tools and steps but remains manageable with clear task definitions. + +--- + +### 5. E-commerce Order Processing System + +**Implementation Using Julep:** + +- **Docs:** + - Store product catalogs, inventory data, and order processing guidelines. + - Integrate with shipping provider APIs. + +- **Sessions:** + - Create sessions for each order to track its lifecycle. + - Maintain context for customer preferences and order history. + +- **Tasks:** + - Define tasks for order validation, inventory updates, payment processing, and shipment tracking. + - Automate customer notifications at each stage. + +- **Executions:** + - Execute order processing tasks in sequence. + - Monitor executions to handle exceptions like payment failures or inventory shortages. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires robust integrations with payment gateways, inventory systems, and shipping providers, along with handling various order states. + +--- + +### 6. AI-Powered Personal Trainer + +**Implementation Using Julep:** + +- **Docs:** + - Store workout routines, nutritional plans, and progress tracking templates. + - Include integration details for fitness tracking APIs. + +- **Sessions:** + - Create individual sessions for each user to track their fitness journey. + - Maintain context for user goals and progress. + +- **Tasks:** + - Define tasks for generating personalized workout plans, tracking progress, and adjusting routines. + - Automate reminders and motivational messages. + +- **Executions:** + - Execute fitness tasks based on user inputs and scheduled routines. + - Monitor executions to provide real-time feedback and adjustments. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves personalization and integration with fitness data sources, but achievable with well-defined task workflows. + +--- + +### 7. Automated Email Marketing Campaigns + +**Implementation Using Julep:** + +- **Docs:** + - Store email templates, segmentation criteria, and campaign schedules. + - Integrate with email marketing platforms (e.g., SendGrid, Mailchimp). + +- **Sessions:** + - Manage campaign-specific sessions to track interactions and responses. + - Maintain context for ongoing and past campaigns. + +- **Tasks:** + - Create tasks for email creation, scheduling, sending, and performance analysis. + - Automate A/B testing and content personalization. + +- **Executions:** + - Execute email campaigns based on predefined schedules and triggers. + - Monitor execution performance and adjust strategies accordingly. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with email platforms and managing dynamic content delivery, but is straightforward with clear task definitions. + +--- + +### 8. Intelligent Recruitment Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store job descriptions, candidate profiles, and evaluation criteria. + - Integrate with HR systems and job boards. + +- **Sessions:** + - Create sessions for each recruitment process to track candidate interactions. + - Maintain context for candidate status and feedback. + +- **Tasks:** + - Define tasks for resume screening, interview scheduling, and candidate communications. + - Automate feedback collection and report generation. + +- **Executions:** + - Execute recruitment tasks based on candidate actions and application stages. + - Monitor executions to ensure timely processing and compliance. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves complex integrations with HR systems, handling diverse candidate data, and ensuring compliance with recruitment processes. + +--- + +### 9. Smart Home Automation Controller + +**Implementation Using Julep:** + +- **Docs:** + - Store device configurations, automation rules, and user preferences. + - Integrate with smart home device APIs (e.g., Philips Hue, Nest). + +- **Sessions:** + - Manage user-specific sessions to track home automation settings. + - Maintain context for user routines and preferences. + +- **Tasks:** + - Create tasks for device control, routine scheduling, and energy monitoring. + - Automate actions based on triggers like time, occupancy, or environmental changes. + +- **Executions:** + - Execute home automation tasks in real-time or based on schedules. + - Monitor executions to ensure devices respond correctly and adjust settings as needed. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with multiple smart devices and managing dynamic automation rules, increasing system complexity. + +--- + +### 10. Automated Legal Document Analyzer + +**Implementation Using Julep:** + +- **Docs:** + - Store legal templates, compliance guidelines, and case studies. + - Integrate with legal databases and document repositories. + +- **Sessions:** + - Create sessions for each document analysis to track progress and findings. + - Maintain context for specific legal requirements and clauses. + +- **Tasks:** + - Define tasks for document ingestion, key information extraction, compliance checking, and summarization. + - Automate flagging of non-compliant sections and suggest necessary amendments. + +- **Executions:** + - Execute document analysis tasks sequentially or in parallel. + - Monitor executions to ensure accuracy and compliance with legal standards. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves advanced natural language processing, integration with legal databases, and ensuring compliance with intricate legal standards. + +--- + +### 11. Personalized Learning Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store educational content, learning paths, and assessment criteria. + - Integrate with educational platforms and resources. + +- **Sessions:** + - Create individual learning sessions to track user progress and preferences. + - Maintain context for personalized learning paths and goals. + +- **Tasks:** + - Define tasks for content recommendation, quiz generation, progress tracking, and feedback provision. + - Automate adjustments to learning paths based on performance. + +- **Executions:** + - Execute learning tasks based on user interactions and progress. + - Monitor executions to provide real-time feedback and adjust learning strategies. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires personalization algorithms, integration with educational content sources, and dynamic adaptation to user progress. + +--- + +### 12. AI-Driven Social Media Manager + +**Implementation Using Julep:** + +- **Docs:** + - Store social media strategies, content calendars, and engagement guidelines. + - Integrate with social media APIs (e.g., Twitter, Facebook, LinkedIn). + +- **Sessions:** + - Manage campaign-specific sessions to track posts, engagements, and analytics. + - Maintain context for ongoing and scheduled campaigns. + +- **Tasks:** + - Create tasks for content creation, scheduling, posting, and performance analysis. + - Automate engagement responses and A/B testing of content. + +- **Executions:** + - Execute social media tasks based on schedules and real-time engagement triggers. + - Monitor executions to optimize performance and adjust strategies. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with multiple social media platforms, dynamic content management, and real-time engagement handling. + +--- + +### 13. Automated Travel Itinerary Planner + +**Implementation Using Julep:** + +- **Docs:** + - Store travel guides, destination information, and booking APIs. + - Integrate with flight, hotel, and transportation service APIs. + +- **Sessions:** + - Create travel-specific sessions to track itinerary progress and user preferences. + - Maintain context for personalized travel plans and updates. + +- **Tasks:** + - Define tasks for destination research, booking accommodations and transportation, and itinerary scheduling. + - Automate real-time updates and notifications during trips. + +- **Executions:** + - Execute travel planning tasks based on user inputs and predefined schedules. + - Monitor executions to handle changes and provide timely updates. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with travel service APIs and managing dynamic itinerary changes, which adds moderate complexity. + +--- + +### 14. AI-Powered Inventory Management System + +**Implementation Using Julep:** + +- **Docs:** + - Store inventory data, supplier information, and reordering guidelines. + - Integrate with inventory tracking systems and supplier APIs. + +- **Sessions:** + - Manage inventory sessions to monitor stock levels and reorder statuses. + - Maintain context for inventory forecasts and demand trends. + +- **Tasks:** + - Create tasks for stock monitoring, demand forecasting, automatic reordering, and supplier communication. + - Automate alerts for low stock levels and order confirmations. + +- **Executions:** + - Execute inventory management tasks in real-time or based on schedules. + - Monitor executions to ensure accurate stock levels and timely reorders. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires real-time inventory tracking, predictive analytics for demand forecasting, and reliable integration with supplier systems. + +--- + +### 15. Intelligent Health Monitoring System + +**Implementation Using Julep:** + +- **Docs:** + - Store health metrics templates, medical guidelines, and user health data. + - Integrate with health tracking devices and APIs (e.g., Fitbit, Apple Health). + +- **Sessions:** + - Create sessions for each user to track their health metrics and progress. + - Maintain context for personalized health goals and alerts. + +- **Tasks:** + - Define tasks for data collection, health metric analysis, trend monitoring, and alert notifications. + - Automate health insights and recommendations based on data. + +- **Executions:** + - Execute health monitoring tasks continuously or at scheduled intervals. + - Monitor executions to provide real-time health alerts and advice. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with diverse health tracking devices, real-time data processing, and ensuring data privacy and accuracy. + +--- + +### 16. Automated Content Moderation Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store community guidelines, content policies, and moderation rules. + - Integrate with content platforms (e.g., forums, social media). + +- **Sessions:** + - Manage moderation sessions to track content reviews and decisions. + - Maintain context for specific moderation cases and user histories. + +- **Tasks:** + - Create tasks for content ingestion, automated screening, manual review, and action enforcement. + - Automate flagging of inappropriate content and notifying users of violations. + +- **Executions:** + - Execute content moderation tasks in real-time or batch processing. + - Monitor executions to ensure compliance and handle escalations. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves sophisticated content analysis, balancing automation with manual oversight, and ensuring adherence to diverse content policies. + +--- + +### 17. AI-Powered Resume Builder + +**Implementation Using Julep:** + +- **Docs:** + - Store resume templates, industry-specific keywords, and formatting guidelines. + - Integrate with LinkedIn and other professional platforms for data fetching. + +- **Sessions:** + - Create user-specific sessions to track resume building progress. + - Maintain context for personalized content and formatting preferences. + +- **Tasks:** + - Define tasks for data collection, content suggestion, resume formatting, and final export. + - Automate style checks and consistency validations. + +- **Executions:** + - Execute resume building tasks based on user inputs and selections. + - Monitor executions to provide real-time feedback and suggestions. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with professional data sources and implementing dynamic content generation and formatting. + +--- + +### 18. Smart Event Management System + +**Implementation Using Julep:** + +- **Docs:** + - Store event templates, scheduling guidelines, and registration forms. + - Integrate with calendar and email platforms. + +- **Sessions:** + - Manage event-specific sessions to track registrations, schedules, and attendee interactions. + - Maintain context for event updates and follow-ups. + +- **Tasks:** + - Create tasks for event creation, attendee registration, schedule management, and post-event follow-ups. + - Automate reminders, notifications, and feedback collection. + +- **Executions:** + - Execute event management tasks based on schedules and attendee actions. + - Monitor executions to handle registrations and event logistics seamlessly. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves coordinating multiple aspects of event planning, handling real-time registrations, and ensuring smooth execution logistics. + +--- + +### 19. Automated Survey Analyzer + +**Implementation Using Julep:** + +- **Docs:** + - Store survey templates, question types, and analysis methodologies. + - Integrate with survey distribution platforms (e.g., SurveyMonkey, Google Forms). + +- **Sessions:** + - Create sessions for each survey to track responses and analysis progress. + - Maintain context for specific survey objectives and parameters. + +- **Tasks:** + - Define tasks for survey distribution, data collection, sentiment analysis, and report generation. + - Automate data visualization and trend identification. + +- **Executions:** + - Execute survey analysis tasks upon survey completion. + - Monitor executions to provide timely and accurate insights. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with survey platforms and implementing effective data analysis and visualization techniques. + +--- + +### 20. AI-Driven Project Management Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store project templates, task guidelines, and progress tracking tools. + - Integrate with project management platforms (e.g., Jira, Trello). + +- **Sessions:** + - Manage project-specific sessions to track tasks, milestones, and team interactions. + - Maintain context for project goals and progress updates. + +- **Tasks:** + - Create tasks for task breakdown, assignment, progress tracking, and status reporting. + - Automate notifications for deadlines and task completions. + +- **Executions:** + - Execute project management tasks based on project timelines and team inputs. + - Monitor executions to ensure projects stay on track and within scope. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with diverse project management tools, handling dynamic task assignments, and ensuring effective progress tracking. + +--- + +### 21. Intelligent Document Summarizer + +**Implementation Using Julep:** + +- **Docs:** + - Store access to large documents, research papers, and reports. + - Include summarization algorithms and templates. + +- **Sessions:** + - Create sessions for each document summarization task. + - Maintain context for document sections and summarization preferences. + +- **Tasks:** + - Define tasks for document ingestion, key point extraction, and summary generation. + - Automate quality checks and user-specific summary adjustments. + +- **Executions:** + - Execute document summarization tasks efficiently. + - Monitor executions to ensure accurate and concise summaries. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires advanced natural language processing capabilities and efficient handling of large document data. + +--- + +### 22. Automated Feedback Collection and Analysis + +**Implementation Using Julep:** + +- **Docs:** + - Store feedback forms, analysis templates, and reporting guidelines. + - Integrate with feedback collection platforms (e.g., Typeform, Google Forms). + +- **Sessions:** + - Manage feedback-specific sessions to track responses and analysis progress. + - Maintain context for feedback sources and analysis objectives. + +- **Tasks:** + - Create tasks for feedback distribution, data collection, sentiment analysis, and insight generation. + - Automate categorization and prioritization of feedback. + +- **Executions:** + - Execute feedback analysis tasks promptly upon data collection. + - Monitor executions to provide actionable insights and improvement strategies. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integrating with feedback platforms and implementing effective sentiment analysis and categorization. + +--- + +### 23. AI-Powered Language Translator + +**Implementation Using Julep:** + +- **Docs:** + - Store language dictionaries, translation models, and formatting guidelines. + - Integrate with translation APIs (e.g., Google Translate, DeepL). + +- **Sessions:** + - Create translation-specific sessions to track user preferences and translation history. + - Maintain context for ongoing translation projects. + +- **Tasks:** + - Define tasks for text ingestion, language detection, translation processing, and quality assurance. + - Automate post-translation formatting and localization adjustments. + +- **Executions:** + - Execute translation tasks in real-time or batch mode. + - Monitor executions to ensure accuracy and contextual relevance. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with robust translation APIs and handling nuances of different languages and contexts. + +--- + +### 24. Smart Appointment Scheduler + +**Implementation Using Julep:** + +- **Docs:** + - Store scheduling templates, availability guidelines, and notification templates. + - Integrate with calendar platforms (e.g., Google Calendar, Outlook). + +- **Sessions:** + - Manage appointment-specific sessions to track scheduling progress and attendee interactions. + - Maintain context for user availability and preferences. + +- **Tasks:** + - Create tasks for availability checking, meeting scheduling, sending reminders, and handling cancellations. + - Automate conflict detection and resolution. + +- **Executions:** + - Execute scheduling tasks based on user inputs and calendar data. + - Monitor executions to ensure appointments are set correctly and notifications are sent. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integration with calendar systems and implementing conflict resolution logic, which adds moderate complexity. + +--- + +### 25. Automated Inventory Auditor + +**Implementation Using Julep:** + +- **Docs:** + - Store inventory audit templates, reconciliation guidelines, and reporting formats. + - Integrate with inventory management systems and databases. + +- **Sessions:** + - Create auditing sessions to track audit schedules and findings. + - Maintain context for different inventory categories and audit criteria. + +- **Tasks:** + - Define tasks for data extraction, discrepancy detection, reconciliation processes, and report generation. + - Automate audit scheduling and notification of audit results. + +- **Executions:** + - Execute inventory audit tasks periodically or on-demand. + - Monitor executions to ensure accurate and timely audits. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires reliable data integration and robust discrepancy detection mechanisms to handle complex inventory data. + +--- + +### 26. AI-Driven Competitive Analysis Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store competitor profiles, market analysis frameworks, and data sources. + - Integrate with market research APIs and competitor websites. + +- **Sessions:** + - Manage competitive analysis sessions to track data collection and analysis progress. + - Maintain context for specific market segments and competitive factors. + +- **Tasks:** + - Create tasks for data scraping, trend analysis, SWOT analysis, and report generation. + - Automate the aggregation and visualization of competitive data. + +- **Executions:** + - Execute competitive analysis tasks on a scheduled basis. + - Monitor executions to provide up-to-date insights and strategic recommendations. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves complex data scraping, accurate trend analysis, and maintaining up-to-date competitive insights, increasing overall complexity. + +--- + +### 27. Smart Recipe Generator + +**Implementation Using Julep:** + +- **Docs:** + - Store ingredient databases, recipe templates, and dietary guidelines. + - Integrate with nutrition APIs and grocery databases. + +- **Sessions:** + - Create user-specific sessions to track dietary preferences and past recipes. + - Maintain context for ingredient availability and nutritional goals. + +- **Tasks:** + - Define tasks for ingredient analysis, recipe generation, nutritional calculation, and grocery list creation. + - Automate recipe suggestions based on user inputs and constraints. + +- **Executions:** + - Execute recipe generation tasks in real-time based on user requests. + - Monitor executions to ensure recipe accuracy and adherence to dietary needs. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with nutrition and grocery APIs and implementing intelligent recipe generation logic. + +--- + +### 28. Automated Video Content Creator + +**Implementation Using Julep:** + +- **Docs:** + - Store video script templates, editing guidelines, and publishing schedules. + - Integrate with video editing and hosting platforms (e.g., Adobe Premiere, YouTube). + +- **Sessions:** + - Manage video creation sessions to track script development, editing stages, and publishing. + - Maintain context for ongoing video projects and collaboration. + +- **Tasks:** + - Create tasks for script generation, video editing, thumbnail creation, and publishing. + - Automate content review and approval workflows. + +- **Executions:** + - Execute video creation tasks based on project timelines. + - Monitor executions to ensure timely releases and quality standards. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with multiple video tools, managing creative workflows, and ensuring high-quality content production. + +--- + +### 29. AI-Powered News Aggregator + +**Implementation Using Julep:** + +- **Docs:** + - Store news source lists, categorization templates, and summarization guidelines. + - Integrate with news APIs (e.g., NewsAPI, RSS feeds). + +- **Sessions:** + - Create user-specific sessions to track news preferences and reading history. + - Maintain context for personalized news feeds and topics of interest. + +- **Tasks:** + - Define tasks for news scraping, categorization, summarization, and personalization. + - Automate feed generation and delivery based on user preferences. + +- **Executions:** + - Execute news aggregation tasks periodically. + - Monitor executions to ensure timely and relevant news delivery. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires efficient news scraping, accurate categorization, and personalized summarization, but is manageable with clear task workflows. + +--- + +### 30. Intelligent Appointment Follow-Up System + +**Implementation Using Julep:** + +- **Docs:** + - Store follow-up templates, feedback forms, and communication guidelines. + - Integrate with CRM and email platforms. + +- **Sessions:** + - Manage follow-up sessions to track appointments and subsequent communications. + - Maintain context for previous interactions and follow-up actions. + +- **Tasks:** + - Create tasks for sending follow-up emails, collecting feedback, and scheduling future appointments. + - Automate reminder notifications and feedback analysis. + +- **Executions:** + - Execute follow-up tasks based on appointment completions. + - Monitor executions to ensure timely and effective communications. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integration with CRM systems and implementing automated communication workflows, adding moderate complexity. + +--- + +### 31. Automated Compliance Monitoring Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store regulatory guidelines, compliance checklists, and reporting templates. + - Integrate with internal systems and regulatory databases. + +- **Sessions:** + - Create compliance-specific sessions to track monitoring activities and audit trails. + - Maintain context for various compliance standards and organizational policies. + +- **Tasks:** + - Define tasks for continuous monitoring, policy enforcement, and compliance reporting. + - Automate detection of non-compliant activities and trigger corrective actions. + +- **Executions:** + - Execute compliance monitoring tasks in real-time. + - Monitor executions to ensure ongoing adherence to regulations and standards. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Requires comprehensive integration with organizational systems, robust monitoring mechanisms, and ensuring adherence to multifaceted regulatory requirements. + +--- + +### 32. AI-Powered Personal Shopper + +**Implementation Using Julep:** + +- **Docs:** + - Store product catalogs, user preference data, and recommendation algorithms. + - Integrate with e-commerce APIs (e.g., Amazon, Shopify). + +- **Sessions:** + - Manage shopping sessions to track user preferences and purchase history. + - Maintain context for personalized product recommendations. + +- **Tasks:** + - Create tasks for product suggestion, wishlist management, and deal notifications. + - Automate price comparisons and availability checks. + +- **Executions:** + - Execute personal shopping tasks based on user inputs and behavior. + - Monitor executions to provide timely recommendations and alerts. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with multiple e-commerce platforms, implementing personalized recommendation logic, and handling real-time deal tracking. + +--- + +### 33. Smart Content Personalization Engine + +**Implementation Using Julep:** + +- **Docs:** + - Store content variants, personalization rules, and user segmentation data. + - Integrate with website CMS and analytics platforms. + +- **Sessions:** + - Create user-specific sessions to track interactions and preferences. + - Maintain context for personalized content delivery. + +- **Tasks:** + - Define tasks for content analysis, user behavior tracking, and personalized content delivery. + - Automate A/B testing and content optimization based on performance metrics. + +- **Executions:** + - Execute content personalization tasks in real-time. + - Monitor executions to adjust personalization strategies dynamically. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires real-time user behavior tracking, dynamic content delivery, and continuous optimization based on analytics, increasing system complexity. + +--- + +### 34. Automated Debt Collection Agent + +**Implementation Using Julep:** + +- **Docs:** + - Store debt agreements, payment schedules, and communication templates. + - Integrate with financial systems and payment gateways. + +- **Sessions:** + - Manage debt collection sessions to track debtor interactions and payment statuses. + - Maintain context for individual debtors and their payment histories. + +- **Tasks:** + - Create tasks for sending payment reminders, negotiating payment plans, and issuing notifications. + - Automate follow-ups and escalation procedures for delinquent accounts. + +- **Executions:** + - Execute debt collection tasks based on payment statuses and schedules. + - Monitor executions to ensure effective communication and resolution. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves sensitive financial data handling, integration with payment systems, and implementing automated negotiation workflows. + +--- + +### 35. AI-Driven Talent Matching System + +**Implementation Using Julep:** + +- **Docs:** + - Store job descriptions, candidate profiles, and matching criteria. + - Integrate with job boards and professional networking platforms. + +- **Sessions:** + - Create sessions for each matching process to track candidate-job pairings. + - Maintain context for specific job requirements and candidate qualifications. + +- **Tasks:** + - Define tasks for candidate screening, skills matching, and recommendation generation. + - Automate notifications to both candidates and employers regarding match statuses. + +- **Executions:** + - Execute talent matching tasks based on incoming job postings and candidate applications. + - Monitor executions to ensure accurate and timely matches. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Requires sophisticated matching algorithms, integration with diverse data sources, and handling dynamic job and candidate data. + +--- + +### 36. Intelligent Expense Reporting Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store expense categories, reimbursement policies, and reporting templates. + - Integrate with financial systems and expense tracking APIs. + +- **Sessions:** + - Manage expense reporting sessions to track submissions and approvals. + - Maintain context for individual employee expenses and budget limits. + +- **Tasks:** + - Create tasks for expense submission, approval workflows, and reimbursement processing. + - Automate validation checks and compliance with policies. + +- **Executions:** + - Execute expense reporting tasks based on submission triggers and approval workflows. + - Monitor executions to ensure timely reimbursements and policy adherence. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with financial systems, implementing approval workflows, and ensuring compliance with expense policies. + +--- + +### 37. Automated Meeting Minutes Recorder + +**Implementation Using Julep:** + +- **Docs:** + - Store meeting agendas, transcription templates, and summary guidelines. + - Integrate with audio transcription services (e.g., Otter.ai, Google Speech-to-Text). + +- **Sessions:** + - Create meeting-specific sessions to track transcription and summarization progress. + - Maintain context for meeting topics and participant interactions. + +- **Tasks:** + - Define tasks for audio ingestion, transcription, summary generation, and distribution. + - Automate the extraction of action items and key decisions. + +- **Executions:** + - Execute transcription and summarization tasks in real-time or post-meeting. + - Monitor executions to ensure accurate recordings and timely distribution. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires reliable audio transcription integration and effective summarization techniques, but manageable with clear task definitions. + +--- + +### 38. AI-Driven Content Recommendation System + +**Implementation Using Julep:** + +- **Docs:** + - Store user profiles, content metadata, and recommendation algorithms. + - Integrate with content management systems and user behavior analytics. + +- **Sessions:** + - Manage user-specific sessions to track interactions and preference changes. + - Maintain context for personalized content delivery. + +- **Tasks:** + - Define tasks for content analysis, user behavior tracking, and recommendation generation. + - Automate personalization based on real-time user interactions. + +- **Executions:** + - Execute content recommendation tasks in real-time. + - Monitor executions to refine recommendation accuracy and relevance. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves real-time data processing, advanced recommendation algorithms, and integration with multiple content sources. + +--- + +### 39. Smart Time Tracking Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store time tracking templates, productivity guidelines, and reporting formats. + - Integrate with productivity tools (e.g., Toggl, Clockify). + +- **Sessions:** + - Create user-specific sessions to track time spent on tasks and projects. + - Maintain context for task prioritization and productivity goals. + +- **Tasks:** + - Define tasks for time logging, productivity analysis, and report generation. + - Automate reminders for time tracking and productivity tips based on usage patterns. + +- **Executions:** + - Execute time tracking tasks continuously or based on user actions. + - Monitor executions to provide real-time productivity insights and suggestions. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with time tracking tools and implementing effective productivity analysis logic. + +--- + +### 40. Automated Webinar Hosting Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store webinar schedules, registration forms, and hosting guidelines. + - Integrate with webinar platforms (e.g., Zoom, WebinarJam). + +- **Sessions:** + - Manage webinar-specific sessions to track registrations, attendee interactions, and follow-ups. + - Maintain context for webinar topics and participant engagement. + +- **Tasks:** + - Create tasks for webinar scheduling, participant management, live interactions, and post-webinar follow-ups. + - Automate reminders, thank-you emails, and feedback collection. + +- **Executions:** + - Execute webinar hosting tasks based on schedules and participant actions. + - Monitor executions to ensure smooth webinar operations and effective follow-ups. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves integration with webinar platforms, managing live interactions, and handling post-event processes seamlessly. + +--- + +### 41. AI-Powered Inventory Forecasting Tool + +**Implementation Using Julep:** + +- **Docs:** + - Store sales data, forecasting models, and inventory guidelines. + - Integrate with sales and inventory tracking systems. + +- **Sessions:** + - Create forecasting sessions to track sales trends and inventory predictions. + - Maintain context for seasonal factors and market conditions affecting inventory. + +- **Tasks:** + - Define tasks for data collection, trend analysis, prediction model execution, and report generation. + - Automate alerts for predicted stock shortages or surpluses. + +- **Executions:** + - Execute forecasting tasks periodically based on sales data updates. + - Monitor executions to refine prediction accuracy and adjust inventory strategies. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires advanced predictive analytics, integration with sales systems, and handling dynamic market conditions influencing inventory. + +--- + +### 42. Smart Contract Management System + +**Implementation Using Julep:** + +- **Docs:** + - Store smart contract templates, execution guidelines, and compliance rules. + - Integrate with blockchain platforms (e.g., Ethereum, Hyperledger). + +- **Sessions:** + - Manage contract-specific sessions to track creation, execution, and monitoring. + - Maintain context for contract terms and participant interactions. + +- **Tasks:** + - Create tasks for contract creation, deployment, execution monitoring, and compliance checks. + - Automate notifications for contract milestones and compliance alerts. + +- **Executions:** + - Execute smart contract tasks based on blockchain events and predefined triggers. + - Monitor executions to ensure contract integrity and compliance. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves blockchain integration, ensuring smart contract security, and managing complex execution and compliance workflows. + +--- + +### 43. Automated Knowledge Base Updater + +**Implementation Using Julep:** + +- **Docs:** + - Store knowledge base articles, update guidelines, and categorization rules. + - Integrate with content management systems and information sources. + +- **Sessions:** + - Create knowledge base sessions to track updates, revisions, and user queries. + - Maintain context for content accuracy and relevance. + +- **Tasks:** + - Define tasks for content ingestion, information extraction, categorization, and publishing. + - Automate periodic reviews and updates based on new information sources. + +- **Executions:** + - Execute knowledge base update tasks as new content becomes available. + - Monitor executions to ensure timely and accurate information updates. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires efficient content ingestion, accurate information extraction, and seamless integration with knowledge management systems. + +--- + +### 44. AI-Driven Fraud Detection System + +**Implementation Using Julep:** + +- **Docs:** + - Store fraud detection algorithms, monitoring guidelines, and incident response protocols. + - Integrate with financial transaction systems and security APIs. + +- **Sessions:** + - Manage fraud detection sessions to track suspicious activities and investigations. + - Maintain context for user behavior patterns and anomaly detection. + +- **Tasks:** + - Create tasks for real-time transaction monitoring, anomaly detection, incident logging, and alerting. + - Automate response actions like freezing accounts or notifying security teams. + +- **Executions:** + - Execute fraud detection tasks continuously based on transaction flows. + - Monitor executions to ensure timely detection and response to fraudulent activities. + +**Complexity Rating:** ★★★★★ + +**Explanation:** Involves real-time data processing, sophisticated anomaly detection algorithms, and ensuring robust security measures. + +--- + +### 45. Intelligent Personal Diary Assistant + +**Implementation Using Julep:** + +- **Docs:** + - Store diary templates, emotional analysis guidelines, and reflection prompts. + - Integrate with sentiment analysis APIs. + +- **Sessions:** + - Create user-specific sessions to track daily entries and emotional states. + - Maintain context for personal growth and mood trends. + +- **Tasks:** + - Define tasks for daily entry prompts, sentiment analysis, and insight generation. + - Automate privacy controls and data encryption for secure diary storage. + +- **Executions:** + - Execute diary assistant tasks daily based on user inputs. + - Monitor executions to provide personalized insights and growth tracking. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Requires integration with sentiment analysis tools and ensuring secure data handling, but manageable with well-defined workflows. + +--- + +### 46. Automated Language Learning Tutor + +**Implementation Using Julep:** + +- **Docs:** + - Store language lessons, exercise templates, and feedback guidelines. + - Integrate with language processing APIs and educational resources. + +- **Sessions:** + - Manage learning sessions to track user progress and performance. + - Maintain context for personalized lesson plans and feedback. + +- **Tasks:** + - Create tasks for lesson delivery, exercise generation, progress tracking, and feedback provision. + - Automate adaptive learning paths based on user performance. + +- **Executions:** + - Execute language learning tasks based on user interactions and learning schedules. + - Monitor executions to adjust learning strategies and provide real-time feedback. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves adaptive learning algorithms, integration with language processing tools, and personalized content delivery. + +--- + +### 47. AI-Powered Budgeting Tool for Businesses + +**Implementation Using Julep:** + +- **Docs:** + - Store budgeting templates, financial guidelines, and reporting formats. + - Integrate with accounting systems and financial data sources. + +- **Sessions:** + - Create budgeting sessions to track financial planning and expenditure. + - Maintain context for organizational financial goals and constraints. + +- **Tasks:** + - Define tasks for budget creation, expenditure tracking, financial forecasting, and report generation. + - Automate alerts for budget overruns and financial goal assessments. + +- **Executions:** + - Execute budgeting tasks based on financial data updates and planning cycles. + - Monitor executions to ensure accurate financial tracking and reporting. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires integration with accounting systems, accurate financial forecasting, and robust budgeting logic to handle business complexities. + +--- + +### 48. Smart Compliance Documentation Generator + +**Implementation Using Julep:** + +- **Docs:** + - Store compliance templates, regulatory guidelines, and documentation standards. + - Integrate with regulatory databases and internal policy systems. + +- **Sessions:** + - Manage compliance documentation sessions to track document creation and updates. + - Maintain context for specific regulatory requirements and organizational policies. + +- **Tasks:** + - Create tasks for document generation, compliance checking, format validation, and publishing. + - Automate updates based on regulatory changes and policy revisions. + +- **Executions:** + - Execute compliance documentation tasks as needed or on a schedule. + - Monitor executions to ensure documents meet all compliance standards. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Involves dynamic document generation, adherence to detailed regulatory standards, and ensuring continuous updates based on regulatory changes. + +--- + +### 49. Automated Product Recommendation Engine + +**Implementation Using Julep:** + +- **Docs:** + - Store product catalogs, user behavior data, and recommendation algorithms. + - Integrate with e-commerce platforms and user analytics tools. + +- **Sessions:** + - Create user-specific sessions to track interactions and preferences. + - Maintain context for personalized recommendation accuracy. + +- **Tasks:** + - Define tasks for data collection, behavior analysis, recommendation generation, and user feedback integration. + - Automate real-time recommendations based on user actions and trends. + +- **Executions:** + - Execute recommendation tasks in real-time to provide instant suggestions. + - Monitor executions to refine algorithms and improve recommendation relevance. + +**Complexity Rating:** ★★★★☆ + +**Explanation:** Requires sophisticated recommendation algorithms, real-time data processing, and continuous refinement based on user feedback. + +--- + +### 50. Intelligent Event Feedback Analyzer + +**Implementation Using Julep:** + +- **Docs:** + - Store feedback forms, analysis templates, and reporting standards. + - Integrate with event platforms and feedback collection tools. + +- **Sessions:** + - Manage feedback-specific sessions to track responses and analysis progress. + - Maintain context for event-specific feedback and improvement areas. + +- **Tasks:** + - Create tasks for feedback collection, sentiment analysis, trend identification, and report generation. + - Automate the extraction of actionable insights and improvement suggestions. + +- **Executions:** + - Execute feedback analysis tasks post-event. + - Monitor executions to ensure accurate and timely feedback processing and reporting. + +**Complexity Rating:** ★★★☆☆ + +**Explanation:** Involves integrating with feedback collection tools and implementing effective sentiment analysis and trend identification mechanisms. + +--- + +# Complexity and Difficulty Ratings + +The scenarios have been rated based on the number of integrated features, required integrations, and overall system complexity. Here's a quick overview: + +- **★☆☆☆☆ (1/5): Easiest** +- **★★☆☆☆ (2/5): Low Complexity** +- **★★★☆☆ (3/5): Moderate Complexity** +- **★★★★☆ (4/5): High Complexity** +- **★★★★★ (5/5): Most Complex** + +| **Scenario** | **Complexity Rating** | +|---------------------------------------------------|-----------------------| +| 1. Automated Customer Support Agent | ★★★★☆ | +| 2. Smart Research Assistant | ★★★★☆ | +| 3. Personal Finance Manager | ★★★☆☆ | +| 4. Content Creation Workflow | ★★★☆☆ | +| 5. E-commerce Order Processing System | ★★★★☆ | +| 6. AI-Powered Personal Trainer | ★★★☆☆ | +| 7. Automated Email Marketing Campaigns | ★★★☆☆ | +| 8. Intelligent Recruitment Assistant | ★★★★★ | +| 9. Smart Home Automation Controller | ★★★★☆ | +| 10. Automated Legal Document Analyzer | ★★★★★ | +| 11. Personalized Learning Assistant | ★★★★☆ | +| 12. AI-Driven Social Media Manager | ★★★★☆ | +| 13. Automated Travel Itinerary Planner | ★★★☆☆ | +| 14. AI-Powered Inventory Management System | ★★★★☆ | +| 15. Intelligent Health Monitoring System | ★★★★☆ | +| 16. Automated Content Moderation Tool | ★★★★★ | +| 17. AI-Powered Resume Builder | ★★★☆☆ | +| 18. Smart Event Management System | ★★★★☆ | +| 19. Automated Survey Analyzer | ★★★☆☆ | +| 20. AI-Driven Project Management Assistant | ★★★★☆ | +| 21. Intelligent Document Summarizer | ★★★★☆ | +| 22. Automated Feedback Collection and Analysis | ★★★☆☆ | +| 23. AI-Powered Language Translator | ★★★☆☆ | +| 24. Smart Appointment Scheduler | ★★★☆☆ | +| 25. Automated Inventory Auditor | ★★★★☆ | +| 26. AI-Driven Competitive Analysis Tool | ★★★★☆ | +| 27. Smart Recipe Generator | ★★★☆☆ | +| 28. Automated Video Content Creator | ★★★★☆ | +| 29. AI-Powered News Aggregator | ★★★☆☆ | +| 30. Intelligent Appointment Follow-Up System | ★★★☆☆ | +| 31. Automated Compliance Monitoring Tool | ★★★★★ | +| 32. AI-Powered Personal Shopper | ★★★★☆ | +| 33. Smart Content Personalization Engine | ★★★★☆ | +| 34. Automated Debt Collection Agent | ★★★★☆ | +| 35. AI-Driven Talent Matching System | ★★★★★ | +| 36. Intelligent Expense Reporting Tool | ★★★★☆ | +| 37. Automated Meeting Minutes Recorder | ★★★☆☆ | +| 38. AI-Driven Content Recommendation System | ★★★★☆ | +| 39. Smart Time Tracking Assistant | ★★★☆☆ | +| 40. Automated Webinar Hosting Assistant | ★★★★☆ | +| 41. AI-Powered Inventory Forecasting Tool | ★★★★☆ | +| 42. Smart Contract Management System | ★★★★★ | +| 43. Automated Knowledge Base Updater | ★★★★☆ | +| 44. AI-Driven Fraud Detection System | ★★★★★ | +| 45. Intelligent Personal Diary Assistant | ★★★☆☆ | +| 46. Automated Language Learning Tutor | ★★★★☆ | +| 47. AI-Powered Budgeting Tool for Businesses | ★★★★☆ | +| 48. Smart Compliance Documentation Generator | ★★★★☆ | +| 49. Automated Product Recommendation Engine | ★★★★☆ | +| 50. Intelligent Event Feedback Analyzer | ★★★☆☆ | + +--- + +# Conclusion + +These 50 scenarios showcase the versatility and power of Julep's **docs**, **sessions**, **tasks**, and **executions** features in automating and enhancing various business and personal workflows. Depending on your specific needs and available integrations, these scenarios can be tailored to create efficient, intelligent, and scalable solutions. + +Feel free to explore these scenarios, adapt them to your use cases, and contribute to expanding Julep's capabilities further! \ No newline at end of file diff --git a/cookbooks/00-Devfest-Email-Assistant.ipynb b/cookbooks/00-Devfest-Email-Assistant.ipynb new file mode 100644 index 000000000..d4d891cf6 --- /dev/null +++ b/cookbooks/00-Devfest-Email-Assistant.ipynb @@ -0,0 +1,296 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install julep" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import yaml\n", + "from julep import Julep\n", + "\n", + "api_key = os.getenv(\"JULEP_API_KEY\")\n", + "julep = Julep(api_key=api_key, environment=\"dev\")" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "agent = julep.agents.create(\n", + " name=\"Julep Email Assistant\",\n", + " about=(\n", + " \"You are an agent that handles emails for julep users.\"\n", + " + \" Julep is a platform for creating kick-ass AI agents.\"\n", + " ),\n", + " model=\"gpt-4o\",\n", + " default_settings={\"temperature\": 0.2},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2790657c-8378-4c5b-a60b-08b27e8ed7cf'" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "agent.id" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [], + "source": [ + "mailgun_password = os.getenv(\"MAILGUN_PASSWORD\")\n", + "\n", + "task_def = yaml.safe_load(f\"\"\"\n", + "name: Julep Email Assistant\n", + "\n", + "input_schema:\n", + " type: object\n", + " properties:\n", + " from:\n", + " type: string\n", + " to:\n", + " type: string\n", + " subject:\n", + " type: string\n", + " body:\n", + " type: string\n", + "\n", + "tools:\n", + "- name: send_email\n", + " integration:\n", + " provider: email\n", + " setup:\n", + " host: smtp.mailgun.org\n", + " password: {mailgun_password}\n", + " port: 587\n", + " user: postmaster@email.julep.ai\n", + "\n", + "- name: search_docs\n", + " system:\n", + " resource: agent\n", + " subresource: doc\n", + " operation: search\n", + " \n", + "main:\n", + "- prompt: |-\n", + " You are {{{{ agent.name }}}}. {{{{ agent.about }}}}\n", + "\n", + " A user with email address {{{{ _.from }}}} has sent the following inquiry:\n", + " ------\n", + " Subject: {{{{ _.subject }}}}\n", + "\n", + " {{{{ _.body }}}}\n", + " ------\n", + "\n", + " Can you generate a query to search the documentation based on this email?\n", + " Just respond with the query as is and nothing else.\n", + "\n", + " unwrap: true\n", + "\n", + "- tool: search_docs\n", + " arguments:\n", + " agent_id: \"'{agent.id}'\"\n", + " text: _\n", + " \n", + "- prompt: |-\n", + " You are {{{{ agent.name }}}}. {{{{ agent.about }}}}\n", + "\n", + " A user with email address {{{{ inputs[0].from }}}} has sent the following inquiry:\n", + " ------\n", + " Subject: {{{{ inputs[0].subject }}}}\n", + "\n", + " {{{{ inputs[0].body }}}}\n", + " ------\n", + "\n", + " Here are some possibly relevant snippets from the julep documentation:\n", + " {{% for doc in _.docs %}}\n", + " {{% for snippet in doc.snippets %}}\n", + " {{{{ snippet.content }}}}\n", + " {{% endfor %}}\n", + " {{% endfor %}}\n", + " ========\n", + "\n", + " Based on the above info, craft an email body to respond with as a json object.\n", + " The json object must have `subject` and `body` fields.\n", + " response_format:\n", + " type: json_object\n", + " \n", + " unwrap: true\n", + " \n", + "- evaluate:\n", + " subject: \"load_json(_.split('```json')[1].split('```')[0])['subject']\"\n", + " body: \"load_json(_.split('```json')[1].split('```')[0])['body']\"\n", + " \n", + "- tool: send_email\n", + " arguments:\n", + " body: _.body\n", + " from: \"'postmaster@email.julep.ai'\"\n", + " subject: _.subject\n", + " to: inputs[0].from\n", + "\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "task = julep.tasks.create(\n", + " agent_id=agent.id,\n", + " **task_def,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'614a7f59-6b43-4887-a6dd-1a75e5516025'" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "task.id" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "execution = julep.executions.create(\n", + " task_id=task.id,\n", + " input={\"from\": \"diwank@julep.ai\", \"to\": \"help@agents.new\", \"subject\": \"what's up\", \"body\": \"sup\"},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Execution(id='4205dda5-2afb-4f2f-8538-cbbf3e0c19f3', created_at=datetime.datetime(2024, 10, 7, 13, 1, 6, 431430, tzinfo=datetime.timezone.utc), input={'body': 'sup', 'from': 'diwank@julep.ai', 'subject': \"what's up\", 'to': 'help@agents.new'}, status='succeeded', task_id='614a7f59-6b43-4887-a6dd-1a75e5516025', updated_at=datetime.datetime(2024, 10, 7, 13, 1, 8, 518972, tzinfo=datetime.timezone.utc), error=None, metadata={}, output={'body': 'Hi there! How can I assist you today? If you have any questions or need help with Julep, feel free to let me know!', 'subject': 'Hello!'})" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "julep.executions.get(execution.id)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[20], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mjulep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecutions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransitions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexecution_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexecution\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/resources/executions/transitions.py:127\u001b[0m, in \u001b[0;36mTransitionsResource.stream\u001b[0;34m(self, execution_id, next_page_token, extra_headers, extra_query, extra_body, timeout)\u001b[0m\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m execution_id:\n\u001b[1;32m 126\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpected a non-empty value for `execution_id` but received \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexecution_id\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 127\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 128\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/executions/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mexecution_id\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/transitions.stream\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 129\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmake_request_options\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 130\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_headers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 131\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_query\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_query\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 132\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_body\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_body\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 134\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmaybe_transform\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 135\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mnext_page_token\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnext_page_token\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtransition_stream_params\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTransitionStreamParams\u001b[49m\n\u001b[1;32m 136\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 137\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 138\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mobject\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 139\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/_base_client.py:1200\u001b[0m, in \u001b[0;36mSyncAPIClient.get\u001b[0;34m(self, path, cast_to, options, stream, stream_cls)\u001b[0m\n\u001b[1;32m 1197\u001b[0m opts \u001b[38;5;241m=\u001b[39m FinalRequestOptions\u001b[38;5;241m.\u001b[39mconstruct(method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mget\u001b[39m\u001b[38;5;124m\"\u001b[39m, url\u001b[38;5;241m=\u001b[39mpath, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39moptions)\n\u001b[1;32m 1198\u001b[0m \u001b[38;5;66;03m# cast is required because mypy complains about returning Any even though\u001b[39;00m\n\u001b[1;32m 1199\u001b[0m \u001b[38;5;66;03m# it understands the type variables\u001b[39;00m\n\u001b[0;32m-> 1200\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m cast(ResponseT, \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/_base_client.py:946\u001b[0m, in \u001b[0;36mSyncAPIClient.request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 943\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 944\u001b[0m retries_taken \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 946\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 947\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 948\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 949\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 950\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 951\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretries_taken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 952\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/_base_client.py:982\u001b[0m, in \u001b[0;36mSyncAPIClient._request\u001b[0;34m(self, cast_to, options, retries_taken, stream, stream_cls)\u001b[0m\n\u001b[1;32m 979\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSending HTTP Request: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, request\u001b[38;5;241m.\u001b[39mmethod, request\u001b[38;5;241m.\u001b[39murl)\n\u001b[1;32m 981\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 982\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 983\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 984\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_should_stream_response_body\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 985\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 986\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 987\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m httpx\u001b[38;5;241m.\u001b[39mTimeoutException \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 988\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEncountered httpx.TimeoutException\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_client.py:940\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 938\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 939\u001b[0m response\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m--> 940\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_client.py:934\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 932\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 933\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m stream:\n\u001b[0;32m--> 934\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 936\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[1;32m 938\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_models.py:815\u001b[0m, in \u001b[0;36mResponse.read\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 811\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;124;03mRead and return the response content.\u001b[39;00m\n\u001b[1;32m 813\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 814\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_content\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m--> 815\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_content \u001b[38;5;241m=\u001b[39m \u001b[38;5;124;43mb\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miter_bytes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 816\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_content\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_models.py:831\u001b[0m, in \u001b[0;36mResponse.iter_bytes\u001b[0;34m(self, chunk_size)\u001b[0m\n\u001b[1;32m 829\u001b[0m chunker \u001b[38;5;241m=\u001b[39m ByteChunker(chunk_size\u001b[38;5;241m=\u001b[39mchunk_size)\n\u001b[1;32m 830\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_request):\n\u001b[0;32m--> 831\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mraw_bytes\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miter_raw\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 832\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecoded\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdecoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mraw_bytes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 833\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunker\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdecoded\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_models.py:885\u001b[0m, in \u001b[0;36mResponse.iter_raw\u001b[0;34m(self, chunk_size)\u001b[0m\n\u001b[1;32m 882\u001b[0m chunker \u001b[38;5;241m=\u001b[39m ByteChunker(chunk_size\u001b[38;5;241m=\u001b[39mchunk_size)\n\u001b[1;32m 884\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_request):\n\u001b[0;32m--> 885\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mraw_stream_bytes\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 886\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_num_bytes_downloaded\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mraw_stream_bytes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 887\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunker\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mraw_stream_bytes\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_client.py:127\u001b[0m, in \u001b[0;36mBoundSyncStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mIterator[\u001b[38;5;28mbytes\u001b[39m]:\n\u001b[0;32m--> 127\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 128\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_transports/default.py:116\u001b[0m, in \u001b[0;36mResponseStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mIterator[\u001b[38;5;28mbytes\u001b[39m]:\n\u001b[1;32m 115\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_httpcore_exceptions():\n\u001b[0;32m--> 116\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_httpcore_stream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:367\u001b[0m, in \u001b[0;36mPoolByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 366\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m--> 367\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:363\u001b[0m, in \u001b[0;36mPoolByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[\u001b[38;5;28mbytes\u001b[39m]:\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 363\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 364\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:349\u001b[0m, in \u001b[0;36mHTTP11ConnectionByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ShieldCancellation():\n\u001b[1;32m 348\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m--> 349\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:341\u001b[0m, in \u001b[0;36mHTTP11ConnectionByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreceive_response_body\u001b[39m\u001b[38;5;124m\"\u001b[39m, logger, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_request, kwargs):\n\u001b[0;32m--> 341\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_connection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_response_body\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 342\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 344\u001b[0m \u001b[38;5;66;03m# If we get an exception while streaming the response,\u001b[39;00m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;66;03m# we want to close the response (and possibly the connection)\u001b[39;00m\n\u001b[1;32m 346\u001b[0m \u001b[38;5;66;03m# before raising that exception.\u001b[39;00m\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:210\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_response_body\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 207\u001b[0m timeout \u001b[38;5;241m=\u001b[39m timeouts\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mread\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 209\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 210\u001b[0m event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_event\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(event, h11\u001b[38;5;241m.\u001b[39mData):\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[38;5;28mbytes\u001b[39m(event\u001b[38;5;241m.\u001b[39mdata)\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:224\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_event\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 221\u001b[0m event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_h11_state\u001b[38;5;241m.\u001b[39mnext_event()\n\u001b[1;32m 223\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m event \u001b[38;5;129;01mis\u001b[39;00m h11\u001b[38;5;241m.\u001b[39mNEED_DATA:\n\u001b[0;32m--> 224\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_network_stream\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 225\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mREAD_NUM_BYTES\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\n\u001b[1;32m 226\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 228\u001b[0m \u001b[38;5;66;03m# If we feed this case through h11 we'll raise an exception like:\u001b[39;00m\n\u001b[1;32m 229\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 230\u001b[0m \u001b[38;5;66;03m# httpcore.RemoteProtocolError: can't handle event type\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[38;5;66;03m# perspective. Instead we handle this case distinctly and treat\u001b[39;00m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;66;03m# it as a ConnectError.\u001b[39;00m\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;241m==\u001b[39m \u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_h11_state\u001b[38;5;241m.\u001b[39mtheir_state \u001b[38;5;241m==\u001b[39m h11\u001b[38;5;241m.\u001b[39mSEND_RESPONSE:\n", + "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_backends/sync.py:126\u001b[0m, in \u001b[0;36mSyncStream.read\u001b[0;34m(self, max_bytes, timeout)\u001b[0m\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_exceptions(exc_map):\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sock\u001b[38;5;241m.\u001b[39msettimeout(timeout)\n\u001b[0;32m--> 126\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_bytes\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.asdf/installs/python/3.12.5/lib/python3.12/ssl.py:1233\u001b[0m, in \u001b[0;36mSSLSocket.recv\u001b[0;34m(self, buflen, flags)\u001b[0m\n\u001b[1;32m 1229\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flags \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 1230\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 1231\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnon-zero flags not allowed in calls to recv() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m\n\u001b[1;32m 1232\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m)\n\u001b[0;32m-> 1233\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuflen\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1234\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1235\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mrecv(buflen, flags)\n", + "File \u001b[0;32m~/.asdf/installs/python/3.12.5/lib/python3.12/ssl.py:1106\u001b[0m, in \u001b[0;36mSSLSocket.read\u001b[0;34m(self, len, buffer)\u001b[0m\n\u001b[1;32m 1104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sslobj\u001b[38;5;241m.\u001b[39mread(\u001b[38;5;28mlen\u001b[39m, buffer)\n\u001b[1;32m 1105\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1106\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sslobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1107\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SSLError \u001b[38;5;28;01mas\u001b[39;00m x:\n\u001b[1;32m 1108\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m x\u001b[38;5;241m.\u001b[39margs[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m SSL_ERROR_EOF \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msuppress_ragged_eofs:\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# julep.executions.transitions.stream(execution_id=execution.id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From ca9ecb937da9f848cb68f5c41e15631b76355c22 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 18:39:26 +0530 Subject: [PATCH 070/113] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e3a212efb..150209ea0 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,11 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 > [!TIP] > Ready to join the fun? **[Tweet that you are participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️ +> [!NOTE] +> Get your API key [here](https://dashboard-dev.julep.ai). +> +> While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key. + ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
@@ -294,9 +299,9 @@ pip install julep ``` > [!NOTE] -> ~~Get your API key [here](https://app.julep.ai/api-keys).~~ +> Get your API key [here](https://dashboard-dev.julep.ai). > -> While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. +> While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key. > [!TIP] > 💻 Are you a _show me the code!™_ kind of person? We have created a ton of cookbooks for you to get started with. **Check out the [cookbooks](/cookbooks)** to browse through examples. From 637d50b953f9099d6f5ec5eed0ffcc3ff5f237d7 Mon Sep 17 00:00:00 2001 From: HamadaSalhab Date: Mon, 7 Oct 2024 17:16:04 +0300 Subject: [PATCH 071/113] feat(cookbooks): Update DevFest Email Assistant notebook cookbook --- cookbooks/00-Devfest-Email-Assistant.ipynb | 126 ++++++++++++--------- 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/cookbooks/00-Devfest-Email-Assistant.ipynb b/cookbooks/00-Devfest-Email-Assistant.ipynb index d4d891cf6..6182d7152 100644 --- a/cookbooks/00-Devfest-Email-Assistant.ipynb +++ b/cookbooks/00-Devfest-Email-Assistant.ipynb @@ -4,14 +4,34 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: julep in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (1.6.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from julep) (4.6.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from julep) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from julep) (0.27.2)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from julep) (2.9.2)\n", + "Requirement already satisfied: sniffio in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from julep) (1.3.1)\n", + "Requirement already satisfied: typing-extensions<5,>=4.7 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from julep) (4.12.2)\n", + "Requirement already satisfied: idna>=2.8 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from anyio<5,>=3.5.0->julep) (3.10)\n", + "Requirement already satisfied: certifi in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from httpx<1,>=0.23.0->julep) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from httpx<1,>=0.23.0->julep) (1.0.5)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->julep) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->julep) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.23.4 in /Users/hamadasalhab/Documents/repos/julep-ai/julep/agents-api/.venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->julep) (2.23.4)\n" + ] + } + ], "source": [ "!pip install julep" ] }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -21,12 +41,13 @@ "from julep import Julep\n", "\n", "api_key = os.getenv(\"JULEP_API_KEY\")\n", + "\n", "julep = Julep(api_key=api_key, environment=\"dev\")" ] }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -43,16 +64,16 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'2790657c-8378-4c5b-a60b-08b27e8ed7cf'" + "'231366f8-cdc8-423a-a1c6-72d4a300675f'" ] }, - "execution_count": 96, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -63,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -155,13 +176,13 @@ " body: _.body\n", " from: \"'postmaster@email.julep.ai'\"\n", " subject: _.subject\n", - " to: inputs[0].from\n", + " to: inputs[0]['from']\n", "\"\"\")" ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -173,16 +194,16 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'614a7f59-6b43-4887-a6dd-1a75e5516025'" + "'a942a86d-dfcc-4abd-a8e7-0f502a2e4c67'" ] }, - "execution_count": 105, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -193,7 +214,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -205,16 +226,16 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Execution(id='4205dda5-2afb-4f2f-8538-cbbf3e0c19f3', created_at=datetime.datetime(2024, 10, 7, 13, 1, 6, 431430, tzinfo=datetime.timezone.utc), input={'body': 'sup', 'from': 'diwank@julep.ai', 'subject': \"what's up\", 'to': 'help@agents.new'}, status='succeeded', task_id='614a7f59-6b43-4887-a6dd-1a75e5516025', updated_at=datetime.datetime(2024, 10, 7, 13, 1, 8, 518972, tzinfo=datetime.timezone.utc), error=None, metadata={}, output={'body': 'Hi there! How can I assist you today? If you have any questions or need help with Julep, feel free to let me know!', 'subject': 'Hello!'})" + "Execution(id='54c1b4d2-c036-4b22-af8c-8c8a81fe41ad', created_at=datetime.datetime(2024, 10, 7, 14, 15, 15, 575516, tzinfo=datetime.timezone.utc), input={'body': 'sup', 'from': 'diwank@julep.ai', 'subject': \"what's up\", 'to': 'help@agents.new'}, status='running', task_id='a942a86d-dfcc-4abd-a8e7-0f502a2e4c67', updated_at=datetime.datetime(2024, 10, 7, 14, 15, 16, 717572, tzinfo=datetime.timezone.utc), error=None, metadata={}, output=None)" ] }, - "execution_count": 108, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -225,51 +246,48 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 16, "metadata": {}, "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[20], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mjulep\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecutions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransitions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexecution_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexecution\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/resources/executions/transitions.py:127\u001b[0m, in \u001b[0;36mTransitionsResource.stream\u001b[0;34m(self, execution_id, next_page_token, extra_headers, extra_query, extra_body, timeout)\u001b[0m\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m execution_id:\n\u001b[1;32m 126\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpected a non-empty value for `execution_id` but received \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mexecution_id\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 127\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 128\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/executions/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mexecution_id\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/transitions.stream\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 129\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmake_request_options\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 130\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_headers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_headers\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 131\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_query\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_query\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 132\u001b[0m \u001b[43m \u001b[49m\u001b[43mextra_body\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextra_body\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 134\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmaybe_transform\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 135\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mnext_page_token\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnext_page_token\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtransition_stream_params\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTransitionStreamParams\u001b[49m\n\u001b[1;32m 136\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 137\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 138\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mobject\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 139\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/_base_client.py:1200\u001b[0m, in \u001b[0;36mSyncAPIClient.get\u001b[0;34m(self, path, cast_to, options, stream, stream_cls)\u001b[0m\n\u001b[1;32m 1197\u001b[0m opts \u001b[38;5;241m=\u001b[39m FinalRequestOptions\u001b[38;5;241m.\u001b[39mconstruct(method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mget\u001b[39m\u001b[38;5;124m\"\u001b[39m, url\u001b[38;5;241m=\u001b[39mpath, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39moptions)\n\u001b[1;32m 1198\u001b[0m \u001b[38;5;66;03m# cast is required because mypy complains about returning Any even though\u001b[39;00m\n\u001b[1;32m 1199\u001b[0m \u001b[38;5;66;03m# it understands the type variables\u001b[39;00m\n\u001b[0;32m-> 1200\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m cast(ResponseT, \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m)\u001b[49m)\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/_base_client.py:946\u001b[0m, in \u001b[0;36mSyncAPIClient.request\u001b[0;34m(self, cast_to, options, remaining_retries, stream, stream_cls)\u001b[0m\n\u001b[1;32m 943\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 944\u001b[0m retries_taken \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m--> 946\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 947\u001b[0m \u001b[43m \u001b[49m\u001b[43mcast_to\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcast_to\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 948\u001b[0m \u001b[43m \u001b[49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 949\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 950\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream_cls\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream_cls\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 951\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries_taken\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretries_taken\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 952\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/julep/_base_client.py:982\u001b[0m, in \u001b[0;36mSyncAPIClient._request\u001b[0;34m(self, cast_to, options, retries_taken, stream, stream_cls)\u001b[0m\n\u001b[1;32m 979\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSending HTTP Request: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, request\u001b[38;5;241m.\u001b[39mmethod, request\u001b[38;5;241m.\u001b[39murl)\n\u001b[1;32m 981\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 982\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 983\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 984\u001b[0m \u001b[43m \u001b[49m\u001b[43mstream\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_should_stream_response_body\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 985\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 986\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 987\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m httpx\u001b[38;5;241m.\u001b[39mTimeoutException \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 988\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEncountered httpx.TimeoutException\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_client.py:940\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 938\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 939\u001b[0m response\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m--> 940\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_client.py:934\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 932\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 933\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m stream:\n\u001b[0;32m--> 934\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 936\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n\u001b[1;32m 938\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_models.py:815\u001b[0m, in \u001b[0;36mResponse.read\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 811\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;124;03mRead and return the response content.\u001b[39;00m\n\u001b[1;32m 813\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 814\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_content\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m--> 815\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_content \u001b[38;5;241m=\u001b[39m \u001b[38;5;124;43mb\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miter_bytes\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 816\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_content\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_models.py:831\u001b[0m, in \u001b[0;36mResponse.iter_bytes\u001b[0;34m(self, chunk_size)\u001b[0m\n\u001b[1;32m 829\u001b[0m chunker \u001b[38;5;241m=\u001b[39m ByteChunker(chunk_size\u001b[38;5;241m=\u001b[39mchunk_size)\n\u001b[1;32m 830\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_request):\n\u001b[0;32m--> 831\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mraw_bytes\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miter_raw\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 832\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecoded\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdecoder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mraw_bytes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 833\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunker\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdecoded\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_models.py:885\u001b[0m, in \u001b[0;36mResponse.iter_raw\u001b[0;34m(self, chunk_size)\u001b[0m\n\u001b[1;32m 882\u001b[0m chunker \u001b[38;5;241m=\u001b[39m ByteChunker(chunk_size\u001b[38;5;241m=\u001b[39mchunk_size)\n\u001b[1;32m 884\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_request):\n\u001b[0;32m--> 885\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mraw_stream_bytes\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 886\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_num_bytes_downloaded\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mraw_stream_bytes\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 887\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunker\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mraw_stream_bytes\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_client.py:127\u001b[0m, in \u001b[0;36mBoundSyncStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mIterator[\u001b[38;5;28mbytes\u001b[39m]:\n\u001b[0;32m--> 127\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 128\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpx/_transports/default.py:116\u001b[0m, in \u001b[0;36mResponseStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mIterator[\u001b[38;5;28mbytes\u001b[39m]:\n\u001b[1;32m 115\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_httpcore_exceptions():\n\u001b[0;32m--> 116\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_httpcore_stream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:367\u001b[0m, in \u001b[0;36mPoolByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 366\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m--> 367\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py:363\u001b[0m, in \u001b[0;36mPoolByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Iterator[\u001b[38;5;28mbytes\u001b[39m]:\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 363\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stream\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 364\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpart\u001b[49m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:349\u001b[0m, in \u001b[0;36mHTTP11ConnectionByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ShieldCancellation():\n\u001b[1;32m 348\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m--> 349\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:341\u001b[0m, in \u001b[0;36mHTTP11ConnectionByteStream.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreceive_response_body\u001b[39m\u001b[38;5;124m\"\u001b[39m, logger, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_request, kwargs):\n\u001b[0;32m--> 341\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_connection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_response_body\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 342\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01myield\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\n\u001b[1;32m 343\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 344\u001b[0m \u001b[38;5;66;03m# If we get an exception while streaming the response,\u001b[39;00m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;66;03m# we want to close the response (and possibly the connection)\u001b[39;00m\n\u001b[1;32m 346\u001b[0m \u001b[38;5;66;03m# before raising that exception.\u001b[39;00m\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:210\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_response_body\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 207\u001b[0m timeout \u001b[38;5;241m=\u001b[39m timeouts\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mread\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 209\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 210\u001b[0m event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_event\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(event, h11\u001b[38;5;241m.\u001b[39mData):\n\u001b[1;32m 212\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[38;5;28mbytes\u001b[39m(event\u001b[38;5;241m.\u001b[39mdata)\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_sync/http11.py:224\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_event\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 221\u001b[0m event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_h11_state\u001b[38;5;241m.\u001b[39mnext_event()\n\u001b[1;32m 223\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m event \u001b[38;5;129;01mis\u001b[39;00m h11\u001b[38;5;241m.\u001b[39mNEED_DATA:\n\u001b[0;32m--> 224\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_network_stream\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 225\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mREAD_NUM_BYTES\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\n\u001b[1;32m 226\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 228\u001b[0m \u001b[38;5;66;03m# If we feed this case through h11 we'll raise an exception like:\u001b[39;00m\n\u001b[1;32m 229\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 230\u001b[0m \u001b[38;5;66;03m# httpcore.RemoteProtocolError: can't handle event type\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[38;5;66;03m# perspective. Instead we handle this case distinctly and treat\u001b[39;00m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;66;03m# it as a ConnectError.\u001b[39;00m\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;241m==\u001b[39m \u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_h11_state\u001b[38;5;241m.\u001b[39mtheir_state \u001b[38;5;241m==\u001b[39m h11\u001b[38;5;241m.\u001b[39mSEND_RESPONSE:\n", - "File \u001b[0;32m~/github.com/julep-ai/julep/playground/.venv/lib/python3.12/site-packages/httpcore/_backends/sync.py:126\u001b[0m, in \u001b[0;36mSyncStream.read\u001b[0;34m(self, max_bytes, timeout)\u001b[0m\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_exceptions(exc_map):\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sock\u001b[38;5;241m.\u001b[39msettimeout(timeout)\n\u001b[0;32m--> 126\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_bytes\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.asdf/installs/python/3.12.5/lib/python3.12/ssl.py:1233\u001b[0m, in \u001b[0;36mSSLSocket.recv\u001b[0;34m(self, buflen, flags)\u001b[0m\n\u001b[1;32m 1229\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flags \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 1230\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 1231\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnon-zero flags not allowed in calls to recv() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m\n\u001b[1;32m 1232\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m)\n\u001b[0;32m-> 1233\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuflen\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1234\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1235\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mrecv(buflen, flags)\n", - "File \u001b[0;32m~/.asdf/installs/python/3.12.5/lib/python3.12/ssl.py:1106\u001b[0m, in \u001b[0;36mSSLSocket.read\u001b[0;34m(self, len, buffer)\u001b[0m\n\u001b[1;32m 1104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sslobj\u001b[38;5;241m.\u001b[39mread(\u001b[38;5;28mlen\u001b[39m, buffer)\n\u001b[1;32m 1105\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1106\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sslobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1107\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SSLError \u001b[38;5;28;01mas\u001b[39;00m x:\n\u001b[1;32m 1108\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m x\u001b[38;5;241m.\u001b[39margs[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m SSL_ERROR_EOF \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msuppress_ragged_eofs:\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: init\n", + "output: {'body': 'sup', 'from': 'diwank@julep.ai', 'subject': \"what's up\", 'to': 'help@agents.new'}\n", + "----------------------------------------------------------------------------------------------------\n", + "Type: step\n", + "output: \"what's up\" site:julep.ai/docs\n", + "----------------------------------------------------------------------------------------------------\n", + "Type: step\n", + "output: {'docs': [], 'time': 0.007443666458129883}\n", + "----------------------------------------------------------------------------------------------------\n", + "Type: step\n", + "output: ```json\n", + "{\n", + " \"subject\": \"Hello!\",\n", + " \"body\": \"Hi there! How can I assist you today? If you have any questions or need help with Julep, feel free to let me know!\"\n", + "}\n", + "```\n", + "----------------------------------------------------------------------------------------------------\n", + "Type: step\n", + "output: {'body': 'Hi there! How can I assist you today? If you have any questions or need help with Julep, feel free to let me know!', 'subject': 'Hello!'}\n", + "----------------------------------------------------------------------------------------------------\n", + "Type: finish\n", + "output: {'success': True}\n", + "----------------------------------------------------------------------------------------------------\n" ] } ], "source": [ - "# julep.executions.transitions.stream(execution_id=execution.id)" + "execution_transitions = julep.executions.transitions.list(\n", + " execution_id=execution.id).items\n", + "\n", + "for transition in reversed(execution_transitions):\n", + " print(\"Type: \", transition.type)\n", + " print(\"output: \", transition.output)\n", + " print(\"-\" * 100)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -288,7 +306,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.5" + "version": "3.12.3" } }, "nbformat": 4, From 8c19e20011d8a6baa630113eef6b69beed268e4a Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 23:42:13 +0530 Subject: [PATCH 072/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 150209ea0..9b8e36b37 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md)
- julep + julep

From bcfb5d232998eaf54ff979161d2d2cc961cb41ca Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Tue, 8 Oct 2024 00:01:24 +0530 Subject: [PATCH 073/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b8e36b37..d04b6ac7e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md)

- julep + julep

From aa616d2aee26666fa5a9911318115278f872f13d Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Tue, 8 Oct 2024 00:39:27 +0530 Subject: [PATCH 074/113] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index d04b6ac7e..179e4c0a9 100644 --- a/README.md +++ b/README.md @@ -597,6 +597,10 @@ Julep is made up of the following components: ### Mental Model +

+ +
+ Think of Julep as a platform that combines both client-side and server-side components to help you build advanced AI agents. Here's how to visualize it: 1. **Your Application Code:** From 5f2557ede0c6c395eb73228f476c0efcd4bc1560 Mon Sep 17 00:00:00 2001 From: JeevaRamanathan <64531160+JeevaRamanathan@users.noreply.github.com> Date: Tue, 8 Oct 2024 07:17:13 +0530 Subject: [PATCH 075/113] Enhanced error messages in models/user (#583) Related to https://github.com/julep-ai/julep/issues/568 Enhanced error messages in `agents-api/agents_api/models/user/` ---- > [!IMPORTANT] > Enhanced error messages for exceptions in user-related modules to improve clarity and debugging. > > - **Error Messages**: > - Enhanced error messages for `QueryException`, `ValidationError`, and `TypeError` in `create_or_update_user.py`, `create_user.py`, and `delete_user.py`. > - Improved error messages in `get_user.py`, `list_users.py`, `patch_user.py`, and `update_user.py` to provide more detailed feedback on database query failures, input validation issues, and type mismatches. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for c2d3e102589004302c47e58d1f6b035ec3f4067c. It will automatically update as commits are pushed. --------- Co-authored-by: Diwank Singh Tomer Co-authored-by: creatorrr --- .../models/user/create_or_update_user.py | 18 ++++++++++-- .../agents_api/models/user/create_user.py | 21 +++++++++++--- .../agents_api/models/user/delete_user.py | 29 +++++++++++++++++-- agents-api/agents_api/models/user/get_user.py | 26 +++++++++++++---- .../agents_api/models/user/list_users.py | 18 ++++++++++-- .../agents_api/models/user/patch_user.py | 18 ++++++++++-- .../agents_api/models/user/update_user.py | 18 ++++++++++-- 7 files changed, 123 insertions(+), 25 deletions(-) diff --git a/agents-api/agents_api/models/user/create_or_update_user.py b/agents-api/agents_api/models/user/create_or_update_user.py index d295d1d8a..13260a038 100644 --- a/agents-api/agents_api/models/user/create_or_update_user.py +++ b/agents-api/agents_api/models/user/create_or_update_user.py @@ -26,9 +26,21 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", + ), } ) @wrap_in_class(User, one=True, transform=lambda d: {"id": UUID(d.pop("user_id")), **d}) diff --git a/agents-api/agents_api/models/user/create_user.py b/agents-api/agents_api/models/user/create_user.py index 9dd036c57..270c0d44c 100644 --- a/agents-api/agents_api/models/user/create_user.py +++ b/agents-api/agents_api/models/user/create_user.py @@ -29,11 +29,24 @@ lambda e: isinstance(e, QueryException) and "asserted to return some results, but returned none" in str(e): lambda *_: HTTPException( - detail="developer not found", status_code=403 + detail="Developer not found. Please ensure the provided auth token (which refers to your developer_id) is valid and the developer has the necessary permissions to create an agent.", + status_code=403, + ), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", ), - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/user/delete_user.py b/agents-api/agents_api/models/user/delete_user.py index 0532f5cfa..7f08316be 100644 --- a/agents-api/agents_api/models/user/delete_user.py +++ b/agents-api/agents_api/models/user/delete_user.py @@ -27,9 +27,32 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + lambda e: isinstance(e, QueryException) + and "Developer does not exist" in str(e): lambda *_: HTTPException( + detail="The specified developer does not exist.", + status_code=403, + ), + lambda e: isinstance(e, QueryException) + and "Developer does not own resource" + in e.resp["display"]: lambda *_: HTTPException( + detail="The specified developer does not own the requested resource. Please verify the ownership or check if the developer ID is correct.", + status_code=404, + ), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", + ), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/user/get_user.py b/agents-api/agents_api/models/user/get_user.py index 2b4f59c83..34ff2c6f4 100644 --- a/agents-api/agents_api/models/user/get_user.py +++ b/agents-api/agents_api/models/user/get_user.py @@ -23,17 +23,31 @@ @rewrap_exceptions( { lambda e: isinstance(e, QueryException) - and "Developer not found" in str(e): lambda *_: HTTPException( - detail="developer does not exist", status_code=403 + and "Developer does not exist" in str(e): lambda *_: HTTPException( + detail="The specified developer does not exist.", + status_code=403, ), lambda e: isinstance(e, QueryException) and "Developer does not own resource" in e.resp["display"]: lambda *_: HTTPException( - detail="developer doesnt own resource", status_code=404 + detail="The specified developer does not own the requested resource. Please verify the ownership or check if the developer ID is correct.", + status_code=404, + ), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", ), - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), } ) @wrap_in_class(User, one=True) diff --git a/agents-api/agents_api/models/user/list_users.py b/agents-api/agents_api/models/user/list_users.py index 2a810b8e0..7f59cbf57 100644 --- a/agents-api/agents_api/models/user/list_users.py +++ b/agents-api/agents_api/models/user/list_users.py @@ -22,9 +22,21 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", + ), } ) @wrap_in_class(User) diff --git a/agents-api/agents_api/models/user/patch_user.py b/agents-api/agents_api/models/user/patch_user.py index 265241d47..152f66de7 100644 --- a/agents-api/agents_api/models/user/patch_user.py +++ b/agents-api/agents_api/models/user/patch_user.py @@ -26,9 +26,21 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", + ), } ) @wrap_in_class( diff --git a/agents-api/agents_api/models/user/update_user.py b/agents-api/agents_api/models/user/update_user.py index fd8e7e2c8..964e550b4 100644 --- a/agents-api/agents_api/models/user/update_user.py +++ b/agents-api/agents_api/models/user/update_user.py @@ -23,9 +23,21 @@ @rewrap_exceptions( { - QueryException: partialclass(HTTPException, status_code=400), - ValidationError: partialclass(HTTPException, status_code=400), - TypeError: partialclass(HTTPException, status_code=400), + QueryException: partialclass( + HTTPException, + status_code=400, + detail="A database query failed to return the expected results. This might occur if the requested resource doesn't exist or your query parameters are incorrect.", + ), + ValidationError: partialclass( + HTTPException, + status_code=400, + detail="Input validation failed. Please check the provided data for missing or incorrect fields, and ensure it matches the required format.", + ), + TypeError: partialclass( + HTTPException, + status_code=400, + detail="A type mismatch occurred. This likely means the data provided is of an incorrect type (e.g., string instead of integer). Please review the input and try again.", + ), } ) @wrap_in_class( From b1d127c7ec3693d4166613be9b9b3fe3ce838fee Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Tue, 8 Oct 2024 08:02:40 +0530 Subject: [PATCH 076/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 179e4c0a9..a66b0eee7 100644 --- a/README.md +++ b/README.md @@ -598,7 +598,7 @@ Julep is made up of the following components: ### Mental Model
- +
Think of Julep as a platform that combines both client-side and server-side components to help you build advanced AI agents. Here's how to visualize it: From d1e38e9ac1dcf610deeee31cdd55485388144a78 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 22:34:46 -0400 Subject: [PATCH 077/113] chore(sdks): Update python and node sdks to latest version --- SCRATCHPAD.md | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ sdks/node-sdk | 2 +- sdks/python-sdk | 2 +- 3 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 SCRATCHPAD.md diff --git a/SCRATCHPAD.md b/SCRATCHPAD.md new file mode 100644 index 000000000..f793fb367 --- /dev/null +++ b/SCRATCHPAD.md @@ -0,0 +1,137 @@ +Sure! So imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. It's an open-source platform that lets you create persistent AI agents with customizable workflows, making it super easy to develop and deploy advanced AI applications without reinventing the wheel. + + + +Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. + +Compared to LangChain, which is excellent for chaining together prompts and managing LLM interactions, Julep focuses more on creating persistent agents with customizable workflows. While LangChain provides a robust framework for building applications with language models, it doesn't inherently offer the same level of session management or state persistence that Julep does. + + + + + +Persistent sessions in Julep mean that the AI agents can maintain context and state over long periods and multiple interactions. So instead of just handling a single query and forgetting everything afterward (which is what you'd get with regular sessions), the agent can remember past conversations, user preferences, and any relevant data from previous interactions. This is super handy when you want your agent to provide a more personalized experience or when the tasks require building upon previous steps. + +For example, if you're building a customer support agent, it can recall a user's issue from earlier chats without them having to repeat themselves. Regular sessions typically don't offer this level of continuity. + +As for complex workflows, Julep lets you define multi-step tasks that can include conditional logic, loops, parallel processing, and integration with external tools or APIs. Regular workflows might be more linear and straightforward—think a simple sequence of prompts or API calls without much branching or decision-making capability. + +In Julep, you can create tasks where the agent might, say, take user input, perform a web search, process the results, maybe even interact with other services like sending an email or updating a database—all within a single workflow. This level of complexity allows you to build more sophisticated applications without having to manage the orchestration logic yourself. + +That said, one thing to keep in mind is that while Julep offers these advanced features, it's still relatively new compared to something like LangChain. So you might find that the community support and pre-built integrations aren't as extensive yet. If you need something up and running quickly with lots of existing modules, LangChain might be more convenient. But if you want more control over persistent state and complex task execution, Julep provides a solid framework for that. + + + + + + +LangChain is great for creating sequences of prompts and managing interactions with LLMs. It has a large ecosystem with lots of pre-built integrations, which makes it convenient if you want to get something up and running quickly. + +Julep, on the other hand, is more about building persistent AI agents that can maintain context over long-term interactions. It shines when you need complex workflows that involve multi-step tasks, conditional logic, and integration with various tools or APIs directly within the agent's process. + +So, you shouldn't think of Julep as a direct replacement for LangChain. Instead, consider it as an alternative that's better suited for projects where maintaining state over time and handling complex task executions are important. If your application requires agents that can remember past interactions, personalize responses, and perform intricate operations, Julep might be the way to go. + + + + +Think of LangChain and Julep as tools with different focuses within the AI development stack. + +LangChain is like a powerful library that helps you chain together prompts and manage interactions with language models. It's excellent for building applications where the primary interaction is between the user and the LLM in a sequential manner. You get utilities for prompt management, memory, and even some basic tools integration. But when it comes to handling more complex state management or long-term sessions, you might find yourself writing a lot of custom code. + +Julep, on the other hand, is more of an orchestration platform for AI agents. It's designed from the ground up to manage persistent sessions and complex workflows. Here's how you might think about it: + +Persistent State and Sessions: Julep allows your AI agents to maintain state over time without you having to implement the storage and retrieval mechanisms yourself. So if your application requires the agent to remember previous interactions, user preferences, or intermediate data across sessions, Julep handles that natively. + +Complex Workflow Management: With Julep, you can define multi-step tasks that include conditional logic, loops, parallel processing, and more. It's like having a built-in workflow engine tailored for AI agents. This is particularly useful when your agent needs to perform a series of actions that depend on each other or on external inputs. + +Tool and API Integration: While LangChain allows for some tools integration, Julep provides a more seamless way to incorporate external tools and APIs directly into your agent's workflows. You can define tools once and reuse them across different tasks and agents. + +Agent-Centric Design: Julep is centered around the concept of agents that have their own identities, abilities, and long-term goals. This abstraction is helpful when you're building applications where the agent needs to interact with users or systems in a more autonomous or stateful way. + +So, rather than a drop-in replacement, Julep can be thought of as a higher-level framework that sits on top of or alongside tools like LangChain. If you imagine building a complex AI assistant that needs to: + +Keep track of user interactions over days or weeks. +Perform scheduled tasks, like sending daily summaries or monitoring data sources. +Make decisions based on prior interactions or stored data. +Interact with multiple external services as part of its workflow. +Then Julep provides the infrastructure to support all that without you having to build it from scratch. + +In contrast, if you're building a simpler application where you just need to chain a few prompts together and don't require persistent state or complex task management, LangChain might be sufficient and quicker to implement. + +In summary: + +Use LangChain when you need to manage LLM interactions and prompt sequences in a stateless or short-term context. +Choose Julep when you need a robust framework for stateful agents with advanced workflow capabilities, persistent sessions, and complex task orchestration. + + + + +Sure! To help you "bookmark" Julep in your mind, here are some key phrases and keywords that set it apart and highlight where it uniquely shines: + +Persistent AI Agents: Julep specializes in creating AI agents that maintain context and state over long-term interactions. + +Stateful Sessions: Think of Julep when you need sessions that remember past interactions, enabling personalized and context-aware responses. + +Customizable Workflows: It's ideal for building complex, multi-step workflows with features like conditional logic, loops, and parallel processing. + +Advanced Task Orchestration: Julep excels at orchestrating intricate tasks without requiring you to build the orchestration logic from scratch. + +Seamless Tool and API Integration: Use Julep when you want to integrate external tools and APIs directly into your agent's workflows. + +Agent-Centric Design: It's designed around autonomous agents with their own identities and long-term goals, perfect for applications needing more than simple prompt-response interactions. + +Reason to Recall Julep: + +When you're working on a project that requires an AI agent to: + +Maintain Long-Term Context: Remember user preferences or past interactions over extended periods. + +Handle Complex Operations: Perform multi-step tasks that involve decision-making, branching logic, or interacting with multiple services. + +Integrate with External Systems: Seamlessly connect with APIs, databases, or other tools as part of the agent's workflow. + +Provide Personalized Experiences: Offer responses or actions tailored to individual users based on accumulated context. + +In these scenarios, Julep uniquely shines by providing the infrastructure and tools needed to build such sophisticated, stateful AI applications without having to build the underlying systems yourself. + + + + + + +Possible Descriptions: + +"Julep is an open-source platform for building persistent AI agents that maintain long-term context and execute complex, customizable workflows." + +"Create AI agents that remember past interactions and handle intricate tasks with Julep's customizable workflows and seamless tool integration." + +"Julep enables developers to build stateful AI agents with advanced task orchestration, maintaining context over time and integrating external tools directly into workflows." + +"With Julep, develop AI agents that persist over sessions, perform multi-step tasks, and integrate various tools and APIs effortlessly." + +"Julep is a platform for creating AI agents that maintain state and execute complex workflows, offering long-term context and advanced orchestration capabilities." + + + + +Key Concepts to Include: + +Persistent AI Agents: Agents that maintain context and state over long-term interactions. +Customizable Workflows: Ability to define complex, multi-step tasks with conditional logic, loops, and more. +Seamless Tool and API Integration: Direct integration of external tools and APIs into agents' workflows. +Stateful Sessions: Sessions that remember past interactions for personalized and context-aware responses. +Advanced Task Orchestration: Orchestrate intricate tasks without building the underlying logic from scratch. + + + +Top 5 Winners +1.5 "Julep: Open-source platform for AI agents with long-term memory and complex workflows." + +2.5 "Julep: Create AI agents that remember and handle intricate tasks effortlessly." + +3.5 "Julep: Create AI agents with persistent context and advanced orchestration." + +4.5 "Julep: Craft AI agents that persist and perform complex tasks seamlessly." + +5.5 "Julep: Build AI agents with persistent state and powerful task execution." + diff --git a/sdks/node-sdk b/sdks/node-sdk index 2685cfe51..6ff96ce85 160000 --- a/sdks/node-sdk +++ b/sdks/node-sdk @@ -1 +1 @@ -Subproject commit 2685cfe512d6b2907e6bdd1b3294175e20aece99 +Subproject commit 6ff96ce8599538291aeb242e6d11650f2c490616 diff --git a/sdks/python-sdk b/sdks/python-sdk index aaa88a204..3d763379e 160000 --- a/sdks/python-sdk +++ b/sdks/python-sdk @@ -1 +1 @@ -Subproject commit aaa88a204bb85b7903f79b8fb5cca0c3e6882c73 +Subproject commit 3d763379e986b38a9d7f24b99f7f6211f19591a0 From a29434e0f99f04a0d8a4e0af2cea8c20231d3a31 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 22:38:57 -0400 Subject: [PATCH 078/113] doc: Add under construction banner to all pages --- docs/api-reference/README.md | 8 ++++++++ docs/api-reference/agents-api-1.md | 8 ++++++++ docs/api-reference/agents-api-2.md | 7 +++++++ docs/api-reference/agents-api-3.md | 7 +++++++ docs/api-reference/agents-api-4.md | 7 +++++++ docs/api-reference/agents-api-5.md | 7 +++++++ docs/api-reference/agents-api-6.md | 7 +++++++ docs/api-reference/agents-api.md | 7 +++++++ docs/concepts/agents.md | 7 +++++++ docs/concepts/documents.md | 7 +++++++ docs/concepts/sessions/README.md | 7 +++++++ docs/concepts/sessions/adaptive-context.md | 7 +++++++ docs/concepts/users.md | 7 +++++++ docs/explanation/chat_features.md | 7 +++++++ docs/explanation/context_overflow.md | 7 +++++++ docs/explanation/core_concepts.md | 7 +++++++ docs/explanation/default_system_template.md | 7 +++++++ docs/explanation/execution_state_machine.md | 7 +++++++ docs/explanation/metadata_precedence.md | 7 +++++++ docs/explanation/multi_agent_sessions.md | 7 +++++++ docs/explanation/task_workflows.md | 7 +++++++ docs/explanation/tool_integration.md | 7 +++++++ docs/how-to-guides/customizing_tasks.md | 7 +++++++ docs/how-to-guides/handling_executions.md | 7 +++++++ docs/how-to-guides/managing_users.md | 7 +++++++ docs/how-to-guides/using_chat_features.md | 7 +++++++ docs/introduction/getting_started.md | 7 +++++++ docs/introduction/overview.md | 7 +++++++ docs/reference/api_endpoints/agent_endpoints.md | 7 +++++++ docs/reference/api_endpoints/doc_endpoints.md | 7 +++++++ docs/reference/api_endpoints/session_endpoints.md | 7 +++++++ docs/reference/api_endpoints/tool_endpoints.md | 7 +++++++ docs/reference/api_endpoints/user_endpoints.md | 7 +++++++ docs/tutorials/creating_your_first_agent.md | 7 +++++++ docs/tutorials/integrating_tools.md | 7 +++++++ docs/tutorials/managing_sessions.md | 7 +++++++ 36 files changed, 254 insertions(+) diff --git a/docs/api-reference/README.md b/docs/api-reference/README.md index ed15fbb56..133cd82dc 100644 --- a/docs/api-reference/README.md +++ b/docs/api-reference/README.md @@ -1,3 +1,11 @@ + +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # Agents API [![Run In Postman](https://run.pstmn.io/button.svg)](https://god.gw.postman.com/run-collection/33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336?action=collection%2Ffork\&source=rip\_markdown\&collection-url=entityId%3D33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336%26entityType%3Dcollection%26workspaceId%3D183380b4-f2ac-44ef-b018-1f65dfc8256b) diff --git a/docs/api-reference/agents-api-1.md b/docs/api-reference/agents-api-1.md index 2f154610a..b5f4ac824 100644 --- a/docs/api-reference/agents-api-1.md +++ b/docs/api-reference/agents-api-1.md @@ -2,6 +2,14 @@ description: API for creating and modifying Users --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + + # Users ## List all users diff --git a/docs/api-reference/agents-api-2.md b/docs/api-reference/agents-api-2.md index 35a3f3000..61f601336 100644 --- a/docs/api-reference/agents-api-2.md +++ b/docs/api-reference/agents-api-2.md @@ -2,6 +2,13 @@ description: API for creating and modifying Sessions --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # Sessions ## List sessions diff --git a/docs/api-reference/agents-api-3.md b/docs/api-reference/agents-api-3.md index 8ef294087..7485ba93e 100644 --- a/docs/api-reference/agents-api-3.md +++ b/docs/api-reference/agents-api-3.md @@ -2,6 +2,13 @@ description: API for accessing Agent Memories --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # Memories ## Get an agent's memories diff --git a/docs/api-reference/agents-api-4.md b/docs/api-reference/agents-api-4.md index 0cab8dad9..863363b5a 100644 --- a/docs/api-reference/agents-api-4.md +++ b/docs/api-reference/agents-api-4.md @@ -2,6 +2,13 @@ description: API for creating and modifying docs --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # Docs ## Get all docs (for an agent or user) diff --git a/docs/api-reference/agents-api-5.md b/docs/api-reference/agents-api-5.md index 86c29ae67..a1bb28348 100644 --- a/docs/api-reference/agents-api-5.md +++ b/docs/api-reference/agents-api-5.md @@ -1,6 +1,13 @@ # Tasks +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + {% hint style="info" %} Coming Soon diff --git a/docs/api-reference/agents-api-6.md b/docs/api-reference/agents-api-6.md index f5f5bc7ed..44581cd22 100644 --- a/docs/api-reference/agents-api-6.md +++ b/docs/api-reference/agents-api-6.md @@ -1,5 +1,12 @@ # Task Runs +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + {% hint style="info" %} **Coming soon.** {% endhint %} diff --git a/docs/api-reference/agents-api.md b/docs/api-reference/agents-api.md index 783a75e74..08792d15f 100644 --- a/docs/api-reference/agents-api.md +++ b/docs/api-reference/agents-api.md @@ -2,6 +2,13 @@ description: API for creating and modifying Agents --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # Agents ## List agents diff --git a/docs/concepts/agents.md b/docs/concepts/agents.md index c2a42f9d3..1283aadb6 100644 --- a/docs/concepts/agents.md +++ b/docs/concepts/agents.md @@ -2,6 +2,13 @@ description: A fundamental building block of an AI app built using Julep. --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # 🤖 Agents ## What is an Agent? diff --git a/docs/concepts/documents.md b/docs/concepts/documents.md index 9509677ae..4db791567 100644 --- a/docs/concepts/documents.md +++ b/docs/concepts/documents.md @@ -2,6 +2,13 @@ description: Documents to be added for Retrieval Augmented Generation --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # 📖 Documents A typical RAG application has the following components: diff --git a/docs/concepts/sessions/README.md b/docs/concepts/sessions/README.md index 905665736..f8f01d501 100644 --- a/docs/concepts/sessions/README.md +++ b/docs/concepts/sessions/README.md @@ -2,6 +2,13 @@ description: A conversation "session" between a user and an agent. --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # 🔁 Sessions ## What is a Session? diff --git a/docs/concepts/sessions/adaptive-context.md b/docs/concepts/sessions/adaptive-context.md index 8bb7cf801..dba2df0fe 100644 --- a/docs/concepts/sessions/adaptive-context.md +++ b/docs/concepts/sessions/adaptive-context.md @@ -1,5 +1,12 @@ # Adaptive Context ᴺᴱᵂ +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + ### What is Adaptive Context? Adaptive Context is a feature in Julep that intelligently manages the context size for long-running sessions. It allows users to continue adding messages to a session indefinitely without worrying about hitting context window limits or incurring excessive costs. diff --git a/docs/concepts/users.md b/docs/concepts/users.md index a15eed32c..15b3d4f51 100644 --- a/docs/concepts/users.md +++ b/docs/concepts/users.md @@ -2,6 +2,13 @@ description: A real person or system that needs to interacts with the Agent in your app. --- +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + # 🙎 Users ## What is a User? diff --git a/docs/explanation/chat_features.md b/docs/explanation/chat_features.md index a3e4bf0eb..23aad265c 100644 --- a/docs/explanation/chat_features.md +++ b/docs/explanation/chat_features.md @@ -1,5 +1,12 @@ # Chat Features in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep provides a robust chat system with various features for dynamic interaction with agents. Here's an overview of the key components and functionalities: ## Chat Input diff --git a/docs/explanation/context_overflow.md b/docs/explanation/context_overflow.md index 5176db2dc..5b87811c4 100644 --- a/docs/explanation/context_overflow.md +++ b/docs/explanation/context_overflow.md @@ -1,5 +1,12 @@ # Context Overflow Handling in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep provides mechanisms to handle scenarios where the context size grows beyond the `token_budget` or the model's input limit. The behavior is determined by the `context_overflow` setting: 1. `null` (default): diff --git a/docs/explanation/core_concepts.md b/docs/explanation/core_concepts.md index a291aeedf..c8a29f0fd 100644 --- a/docs/explanation/core_concepts.md +++ b/docs/explanation/core_concepts.md @@ -1,5 +1,12 @@ # Core Concepts in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep is a powerful backend system for managing agent execution. It provides several key components that work together to create flexible and intelligent applications. Here are the core concepts: ## Agent diff --git a/docs/explanation/default_system_template.md b/docs/explanation/default_system_template.md index 3d0f5d272..4ba74b2a9 100644 --- a/docs/explanation/default_system_template.md +++ b/docs/explanation/default_system_template.md @@ -1,5 +1,12 @@ # Default System Template in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep uses a default system template for sessions when a custom one is not provided. This template is written in Jinja2 and incorporates various elements from the agent, user, and session context. Here's a breakdown of the template: ```jinja diff --git a/docs/explanation/execution_state_machine.md b/docs/explanation/execution_state_machine.md index 9acd2ccaf..648d514bd 100644 --- a/docs/explanation/execution_state_machine.md +++ b/docs/explanation/execution_state_machine.md @@ -1,5 +1,12 @@ # Execution State Machine in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + In Julep, an Execution represents an instance of a Task that has been started with some input. The Execution follows a specific state machine model, ensuring consistent and predictable behavior throughout its lifecycle. ## Execution States diff --git a/docs/explanation/metadata_precedence.md b/docs/explanation/metadata_precedence.md index f704b1373..dd36ce0ce 100644 --- a/docs/explanation/metadata_precedence.md +++ b/docs/explanation/metadata_precedence.md @@ -1,5 +1,12 @@ # Metadata Precedence in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + In Julep, several objects can have `metadata` added to them: - Agent - User diff --git a/docs/explanation/multi_agent_sessions.md b/docs/explanation/multi_agent_sessions.md index b497c0fd2..72fa5d52a 100644 --- a/docs/explanation/multi_agent_sessions.md +++ b/docs/explanation/multi_agent_sessions.md @@ -1,5 +1,12 @@ # Multi-Agent Sessions in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep supports different types of sessions based on the number of agents and users involved. This flexibility allows for complex interactions and use cases. ## Types of Sessions diff --git a/docs/explanation/task_workflows.md b/docs/explanation/task_workflows.md index 7c77ff686..847cb3157 100644 --- a/docs/explanation/task_workflows.md +++ b/docs/explanation/task_workflows.md @@ -1,5 +1,12 @@ # Task Workflows in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Tasks in Julep are powerful, Github Actions-style workflows that define long-running, multi-step actions. They allow for complex operations by defining steps and have access to all Julep integrations. ## Task Structure diff --git a/docs/explanation/tool_integration.md b/docs/explanation/tool_integration.md index a0cfd4ae9..a3a71065a 100644 --- a/docs/explanation/tool_integration.md +++ b/docs/explanation/tool_integration.md @@ -1,5 +1,12 @@ # Tool Integration in Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep provides a flexible system for integrating various types of tools that agents can use during interactions. These tools enable agents to perform actions, retrieve information, or interact with external systems. ## Types of Tools diff --git a/docs/how-to-guides/customizing_tasks.md b/docs/how-to-guides/customizing_tasks.md index 29a39dd19..a5f845214 100644 --- a/docs/how-to-guides/customizing_tasks.md +++ b/docs/how-to-guides/customizing_tasks.md @@ -1,5 +1,12 @@ # Customizing Tasks +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This guide covers how to define and customize tasks for agents in Julep. ## Creating a Basic Task diff --git a/docs/how-to-guides/handling_executions.md b/docs/how-to-guides/handling_executions.md index 22aeedaa5..fca788642 100644 --- a/docs/how-to-guides/handling_executions.md +++ b/docs/how-to-guides/handling_executions.md @@ -1,5 +1,12 @@ # Handling Executions +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This guide covers how to manage and monitor task executions in Julep. ## Starting an Execution diff --git a/docs/how-to-guides/managing_users.md b/docs/how-to-guides/managing_users.md index 6bdb94bac..b1f47a016 100644 --- a/docs/how-to-guides/managing_users.md +++ b/docs/how-to-guides/managing_users.md @@ -1,5 +1,12 @@ # Managing Users +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This guide covers how to create, update, and delete users in Julep. ## Creating a User diff --git a/docs/how-to-guides/using_chat_features.md b/docs/how-to-guides/using_chat_features.md index 63423ff0c..d9aabceaa 100644 --- a/docs/how-to-guides/using_chat_features.md +++ b/docs/how-to-guides/using_chat_features.md @@ -1,5 +1,12 @@ # Using Chat Features +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This guide covers how to use the chat features in Julep for dynamic interactions with agents. ## Starting a Chat Session diff --git a/docs/introduction/getting_started.md b/docs/introduction/getting_started.md index 6aa590121..f273bb776 100644 --- a/docs/introduction/getting_started.md +++ b/docs/introduction/getting_started.md @@ -1,5 +1,12 @@ # Getting Started with Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This guide will help you set up and start using the Julep API. ## Prerequisites diff --git a/docs/introduction/overview.md b/docs/introduction/overview.md index a914535b5..26c75bcdb 100644 --- a/docs/introduction/overview.md +++ b/docs/introduction/overview.md @@ -1,5 +1,12 @@ # Overview of Julep +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + Julep is a powerful backend system for managing agent execution and interactions. It provides a comprehensive set of features for creating and managing agents, users, sessions, tools, documents, tasks, and executions. ## Key Features diff --git a/docs/reference/api_endpoints/agent_endpoints.md b/docs/reference/api_endpoints/agent_endpoints.md index 692931bb2..8634b2098 100644 --- a/docs/reference/api_endpoints/agent_endpoints.md +++ b/docs/reference/api_endpoints/agent_endpoints.md @@ -1,5 +1,12 @@ # Agent Endpoints +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This document provides a reference for all Agent API endpoints in Julep. ## List Agents diff --git a/docs/reference/api_endpoints/doc_endpoints.md b/docs/reference/api_endpoints/doc_endpoints.md index c168ecac2..2971c1b50 100644 --- a/docs/reference/api_endpoints/doc_endpoints.md +++ b/docs/reference/api_endpoints/doc_endpoints.md @@ -1,5 +1,12 @@ # Doc Endpoints +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This document provides a reference for all Doc API endpoints in Julep. ## List Docs for a User diff --git a/docs/reference/api_endpoints/session_endpoints.md b/docs/reference/api_endpoints/session_endpoints.md index f7a649594..03bd7559d 100644 --- a/docs/reference/api_endpoints/session_endpoints.md +++ b/docs/reference/api_endpoints/session_endpoints.md @@ -1,5 +1,12 @@ # Session Endpoints +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This document provides a reference for all Session API endpoints in Julep. ## List Sessions diff --git a/docs/reference/api_endpoints/tool_endpoints.md b/docs/reference/api_endpoints/tool_endpoints.md index a0aeab36a..194713f1f 100644 --- a/docs/reference/api_endpoints/tool_endpoints.md +++ b/docs/reference/api_endpoints/tool_endpoints.md @@ -1,5 +1,12 @@ # Tool Endpoints +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This document provides a reference for all Tool API endpoints in Julep. ## List Tools for an Agent diff --git a/docs/reference/api_endpoints/user_endpoints.md b/docs/reference/api_endpoints/user_endpoints.md index 9242c7167..ac2578907 100644 --- a/docs/reference/api_endpoints/user_endpoints.md +++ b/docs/reference/api_endpoints/user_endpoints.md @@ -1,5 +1,12 @@ # User Endpoints +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This document provides a reference for all User API endpoints in Julep. ## List Users diff --git a/docs/tutorials/creating_your_first_agent.md b/docs/tutorials/creating_your_first_agent.md index a21d27b1d..ae79c1e11 100644 --- a/docs/tutorials/creating_your_first_agent.md +++ b/docs/tutorials/creating_your_first_agent.md @@ -1,5 +1,12 @@ # Creating Your First Agent +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This tutorial will guide you through the process of creating your first agent using the Julep API. ## Step 1: Prepare the Agent Data diff --git a/docs/tutorials/integrating_tools.md b/docs/tutorials/integrating_tools.md index 16889f4a6..2c3233d1a 100644 --- a/docs/tutorials/integrating_tools.md +++ b/docs/tutorials/integrating_tools.md @@ -1,5 +1,12 @@ # Integrating Tools +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This tutorial will show you how to integrate tools with your Julep agents. ## Creating a User-Defined Function Tool diff --git a/docs/tutorials/managing_sessions.md b/docs/tutorials/managing_sessions.md index 866484912..bffb301fd 100644 --- a/docs/tutorials/managing_sessions.md +++ b/docs/tutorials/managing_sessions.md @@ -1,5 +1,12 @@ # Managing Sessions +***** +> ### This docs site is currently under construction although this github README below should suffice for now. + +![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) +***** + + This tutorial will guide you through creating and managing sessions with your Julep agents. ## Creating a Session From a9cac1d675229ccf12b1c49ed7391e0e2a7dad9d Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 23:00:41 -0400 Subject: [PATCH 079/113] doc: Add integrations and step details to README --- README.md | 289 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 231 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index a66b0eee7..7ebd846fa 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Adding Tools to Agents](#adding-tools-to-agents) - [Managing Sessions and Users](#managing-sessions-and-users) - [Document Integration and Search](#document-integration-and-search) +- [Integrations](#integrations) - [SDK Reference](#sdk-reference) - [API Reference](#api-reference) @@ -104,14 +105,12 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 ## Introduction - +Julep is a platform for creating AI agents that remember past interactions and can perform complex tasks. It offers long-term memory and manages multi-step processes. -Julep is a platform for creating AI agents that maintain state and execute complex workflows. It offers long-term context and orchestrates multi-step tasks. - -Julep lets you define multi-step tasks that can include conditional logic, loops, parallel processing, and built-in integration with 100s of external tools and APIs. Typically AI applications tend to be linear and have simple chains of a handful of prompts and API calls without much branching or decision-making. +Julep lets you define multi-step tasks that can include decision-making, loops, parallel processing, and built-in integration with hundreds of external tools and APIs. Typically, AI applications tend to be simple and have linear chains of a handful of prompts and API calls without much branching or decision-making. > [!TIP] -> Imagine you want to build an AI agent that can do more than just answer simple queries—it needs to handle complex tasks, remember past interactions, and maybe even integrate with other tools or APIs. That's where Julep comes in. +> Imagine you want to build an AI agent that can do more than just answer simple questions—it needs to handle complex tasks, remember past interactions, and maybe even use other tools or APIs. That's where Julep comes in. ## Quick Example @@ -125,7 +124,7 @@ Imagine a Research AI agent that can do the following: 7. Summarize the results, 8. Send the summary to Discord -In julep, this would be a single task under 80 lines of code and run fully managed all on its own. Here's a working example: +In Julep, this would be a single task under 80 lines of code and run fully managed all on its own. Here's a working example: ```yaml name: Research Agent @@ -235,17 +234,17 @@ main: > [!TIP] > Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. > -> In this example, Julep will automatically manage parallel executions, retry failed steps, resend api requests, and keep the workflows running reliably until completion. +> In this example, Julep will automatically manage parallel executions, retry failed steps, resend API requests, and keep the tasks running reliably until completion. ## Key Features -1. **Persistent AI Agents**: Persist context and state over long-term interactions. -2. **Stateful Sessions**: Remember past interactions for personalized responses. -3. **Multi-Step Workflows**: Build complex, multi-step processes with loops and conditional logic. -4. **Task Orchestration**: Manage long-running tasks that can run indefinitely. -5. **Built-in Tools**: Integrate built-in tools and external APIs into workflows. -6. **Self-Healing**: Julep will automatically retry failed steps, resend messages, and generally keep your workflows running smoothly. -7. **RAG**: Use Julep's document store to build a RAG system for your own data. +1. **Persistent AI Agents**: Remember context and information over long-term interactions. +2. **Stateful Sessions**: Keep track of past interactions for personalized responses. +3. **Multi-Step Tasks**: Build complex, multi-step processes with loops and decision-making. +4. **Task Management**: Handle long-running tasks that can run indefinitely. +5. **Built-in Tools**: Use built-in tools and external APIs in your tasks. +6. **Self-Healing**: Julep will automatically retry failed steps, resend messages, and generally keep your tasks running smoothly. +7. **RAG**: Use Julep's document store to build a system for retrieving and using your own data. Julep is ideal for applications that require AI use cases beyond simple prompt-response models. @@ -255,34 +254,34 @@ Julep is ideal for applications that require AI use cases beyond simple prompt-r Think of LangChain and Julep as tools with different focuses within the AI development stack. -LangChain is great for creating sequences of prompts and managing interactions with LLMs. It has a large ecosystem with lots of pre-built integrations, which makes it convenient if you want to get something up and running quickly. LangChain fits well with simple use cases that involve a linear chain of prompts and API calls. +LangChain is great for creating sequences of prompts and managing interactions with AI models. It has a large ecosystem with lots of pre-built integrations, which makes it convenient if you want to get something up and running quickly. LangChain fits well with simple use cases that involve a linear chain of prompts and API calls. -Julep, on the other hand, is more about building persistent AI agents that can maintain context over long-term interactions. It shines when you need complex workflows that involve multi-step tasks, conditional logic, and integration with various tools or APIs directly within the agent's process. It's designed from the ground up to manage persistent sessions and complex workflows. +Julep, on the other hand, is more about building persistent AI agents that can remember things over long-term interactions. It shines when you need complex tasks that involve multiple steps, decision-making, and integration with various tools or APIs directly within the agent's process. It's designed from the ground up to manage persistent sessions and complex tasks. Use Julep if you imagine building a complex AI assistant that needs to: - Keep track of user interactions over days or weeks. - Perform scheduled tasks, like sending daily summaries or monitoring data sources. - Make decisions based on prior interactions or stored data. -- Interact with multiple external services as part of its workflow. +- Interact with multiple external services as part of its task. Then Julep provides the infrastructure to support all that without you having to build it from scratch. ### Different Form Factor -Julep is a **platform** that includes a language for describing workflows, a server for running those workflows, and an SDK for interacting with the platform. In order to build something with Julep, you write a description of the workflow in `YAML`, and then run the workflow in the cloud. +Julep is a **platform** that includes a language for describing tasks, a server for running those tasks, and an SDK for interacting with the platform. To build something with Julep, you write a description of the task in `YAML`, and then run the task in the cloud. -Julep is built for heavy-lifting, multi-step, and long-running workflows and there's no limit to how complex the workflow can be. +Julep is built for heavy-lifting, multi-step, and long-running tasks and there's no limit to how complex the task can be. -LangChain is a **library** that includes a few tools and a framework for building linear chains of prompts and tools. In order to build something with LangChain, you typically write Python code that configures and runs the model chains you want to use. +LangChain is a **library** that includes a few tools and a framework for building linear chains of prompts and tools. To build something with LangChain, you typically write Python code that configures and runs the model chains you want to use. LangChain might be sufficient and quicker to implement for simple use cases that involve a linear chain of prompts and API calls. ### In Summary -Use LangChain when you need to manage LLM interactions and prompt sequences in a stateless or short-term context. +Use LangChain when you need to manage AI model interactions and prompt sequences in a stateless or short-term context. -Choose Julep when you need a robust framework for stateful agents with advanced workflow capabilities, persistent sessions, and complex task orchestration. +Choose Julep when you need a robust framework for stateful agents with advanced task capabilities, persistent sessions, and complex task management. ## Installation @@ -662,55 +661,137 @@ Tasks are the core of Julep's workflow system. They allow you to define complex, ### Types of Workflow Steps -Tasks in Julep can include various types of steps: +Tasks in Julep can include various types of steps, allowing you to create complex and powerful workflows. Here's an overview of the available step types, organized by category: + +#### Common Steps 1. **Prompt**: Send a message to the AI model and receive a response. - ```python - {"prompt": "Analyze the following data: {{data}}"} + ```yaml + - prompt: "Analyze the following data: {{data}}" ``` 2. **Tool Call**: Execute an integrated tool or API. - ```python - {"tool": "web_search", "arguments": {"query": "Latest AI developments"}} + ```yaml + - tool: web_search + arguments: + query: "Latest AI developments" ``` 3. **Evaluate**: Perform calculations or manipulate data. - ```python - {"evaluate": {"average_score": "sum(scores) / len(scores)"}} + ```yaml + - evaluate: + average_score: "sum(scores) / len(scores)" + ``` + +4. **Wait for Input**: Pause workflow until input is received. + ```yaml + - wait_for_input: + info: + message: "Please provide additional information." ``` -4. **Conditional Logic**: Execute steps based on conditions. - ```python - {"if": "score > 0.8", "then": [...], "else": [...]} +5. **Log**: Log a specified value or message. + ```yaml + - log: "Processing completed for item {{item_id}}" + ``` + +#### Key-Value Steps + +6. **Get**: Retrieve a value from a key-value store. + ```yaml + - get: "user_preference" ``` -5. **Loops**: Iterate over data or repeat steps. - ```python - {"foreach": {"in": "data_list", "do": [...]}} +7. **Set**: Assign a value to a key in a key-value store. + ```yaml + - set: + user_preference: "dark_mode" ``` -| Step Name | Description | Input | -|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------| -| **Prompt** | Send a message to the AI model and receive a response. | Prompt text or template | -| **Tool Call** | Execute an integrated tool or API. | Tool name and arguments | -| **Evaluate** | Perform calculations or manipulate data. | Expressions or variables to evaluate | -| **Wait for Input** | Pause workflow until input is received. | Any required user or system input | -| **Log** | Log a specified value or message. | Message or value to log | -| **Embed** | Embed text into a specific format or system. | Text or content to embed | -| **Search** | Perform a document search based on a query. | Search query | -| **Get** | Retrieve a value from a key-value store. | Key identifier | -| **Set** | Assign a value to a key in a key-value store. | Key and value to assign | -| **Parallel** | Run multiple steps in parallel. | List of steps to execute simultaneously | -| **Foreach** | Iterate over a collection and perform steps for each item. | Collection or list to iterate over | -| **MapReduce** | Map over a collection and reduce the results based on an expression. | Collection to map and reduce expressions | -| **If Else** | Conditional execution of steps based on a condition. | Condition to evaluate | -| **Switch** | Execute steps based on multiple conditions, similar to a switch-case statement. | Multiple conditions and corresponding steps | -| **Yield** | Run a subworkflow and await its completion. | Subworkflow identifier and input data | -| **Error** | Handle errors by specifying an error message. | Error message or handling instructions | -| **Sleep** | Pause the workflow for a specified duration. | Duration (seconds, minutes, etc.) | -| **Return** | Return a value from the workflow. | Value to return | - -For detailed information on each step type and advanced usage, please refer to our [Task Documentation](https://docs.julep.ai/tasks). +#### Iteration Steps + +8. **Foreach**: Iterate over a collection and perform steps for each item. + ```yaml + - foreach: + in: "data_list" + do: + - log: "Processing item {{_}}" + ``` + +9. **Map-Reduce**: Map over a collection and reduce the results. + ```yaml + - map_reduce: + over: "numbers" + map: + - evaluate: + squared: "_ ** 2" + reduce: "sum(results)" + ``` + +10. **Parallel**: Run multiple steps in parallel. + ```yaml + - parallel: + - tool: web_search + arguments: + query: "AI news" + - tool: weather_check + arguments: + location: "New York" + ``` + +#### Conditional Steps + +11. **If-Else**: Conditional execution of steps. + ```yaml + - if: "score > 0.8" + then: + - log: "High score achieved" + else: + - log: "Score needs improvement" + ``` + +12. **Switch**: Execute steps based on multiple conditions. + ```yaml + - switch: + - case: "category == 'A'" + then: + - log: "Category A processing" + - case: "category == 'B'" + then: + - log: "Category B processing" + - case: "_" # Default case + then: + - log: "Unknown category" + ``` + +#### Other Control Flow + +13. **Sleep**: Pause the workflow for a specified duration. + ```yaml + - sleep: + seconds: 30 + ``` + +14. **Return**: Return a value from the workflow. + ```yaml + - return: + result: "Task completed successfully" + ``` + +15. **Yield**: Run a subworkflow and await its completion. + ```yaml + - yield: + workflow: "data_processing_subflow" + arguments: + input_data: "{{raw_data}}" + ``` + +16. **Error**: Handle errors by specifying an error message. + ```yaml + - error: "Invalid input provided" + ``` + +Each step type serves a specific purpose in building sophisticated AI workflows. This categorization helps in understanding the various control flows and operations available in Julep tasks. ## Advanced Features @@ -772,6 +853,98 @@ results = client.documents.search( For more advanced features and detailed usage, please refer to our [Advanced Features Documentation](https://docs.julep.ai/advanced-features). +## Integrations + +Julep supports various integrations that extend the capabilities of your AI agents. Here's a list of available integrations and their supported arguments: + +### Brave Search + +```yaml +setup: + api_key: string # The API key for Brave Search + +arguments: + query: string # The search query for searching with Brave + +output: + result: string # The result of the Brave Search +``` + +### BrowserBase + +```yaml +setup: + api_key: string # The API key for BrowserBase + project_id: string # The project ID for BrowserBase + session_id: string # (Optional) The session ID for BrowserBase + +arguments: + urls: list[string] # The URLs for loading with BrowserBase + +output: + documents: list # The documents loaded from the URLs +``` + +### Email + +```yaml +setup: + host: string # The host of the email server + port: integer # The port of the email server + user: string # The username of the email server + password: string # The password of the email server + +arguments: + to: string # The email address to send the email to + from: string # The email address to send the email from + subject: string # The subject of the email + body: string # The body of the email + +output: + success: boolean # Whether the email was sent successfully +``` + +### Spider + +```yaml +setup: + spider_api_key: string # The API key for Spider + +arguments: + url: string # The URL for which to fetch data + mode: string # The type of crawlers (default: "scrape") + params: dict # (Optional) The parameters for the Spider API + +output: + documents: list # The documents returned from the spider +``` + +### Weather + +```yaml +setup: + openweathermap_api_key: string # The API key for OpenWeatherMap + +arguments: + location: string # The location for which to fetch weather data + +output: + result: string # The weather data for the specified location +``` + +### Wikipedia + +```yaml +arguments: + query: string # The search query string + load_max_docs: integer # Maximum number of documents to load (default: 2) + +output: + documents: list # The documents returned from the Wikipedia search +``` + +These integrations can be used within your tasks to extend the capabilities of your AI agents. For more detailed information on how to use these integrations in your workflows, please refer to our [Integrations Documentation](https://docs.julep.ai/integrations). + ## SDK Reference - [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) @@ -783,4 +956,4 @@ Explore our comprehensive API documentation to learn more about agents, tasks, a - [Agents API](https://api.julep.ai/api/docs#tag/agents) - [Tasks API](https://api.julep.ai/api/docs#tag/tasks) -- [Executions API](https://api.julep.ai/api/docs#tag/executions) +- [Executions API](https://api.julep.ai/api/docs#tag/executions) \ No newline at end of file From 5a60e232992d6c32bac48394584c11b0666325ca Mon Sep 17 00:00:00 2001 From: creatorrr Date: Tue, 8 Oct 2024 03:01:20 +0000 Subject: [PATCH 080/113] chore(docs): update TOC --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 7ebd846fa..279507ea6 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,12 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Managing Sessions and Users](#managing-sessions-and-users) - [Document Integration and Search](#document-integration-and-search) - [Integrations](#integrations) + - [Brave Search](#brave-search) + - [BrowserBase](#browserbase) + - [Email](#email) + - [Spider](#spider) + - [Weather](#weather) + - [Wikipedia](#wikipedia) - [SDK Reference](#sdk-reference) - [API Reference](#api-reference) From 650e588bcce5fa512cbbab96f3e81e2ea394bcfb Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 23:11:57 -0400 Subject: [PATCH 081/113] doc: Update README with simplified example --- README.md | 60 ++++++++++++++++++------------------------------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 279507ea6..9c44f7f6d 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,14 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 Julep is a platform for creating AI agents that remember past interactions and can perform complex tasks. It offers long-term memory and manages multi-step processes. -Julep lets you define multi-step tasks that can include decision-making, loops, parallel processing, and built-in integration with hundreds of external tools and APIs. Typically, AI applications tend to be simple and have linear chains of a handful of prompts and API calls without much branching or decision-making. +Julep enables the creation of multi-step tasks incorporating decision-making, loops, parallel processing, and integration with numerous external tools and APIs. + +While many AI applications are limited to simple, linear chains of prompts and API calls with minimal branching, Julep is built to handle more complex scenarios. + +It supports: +- Intricate, multi-step processes +- Dynamic decision-making +- Parallel execution > [!TIP] > Imagine you want to build an AI agent that can do more than just answer simple questions—it needs to handle complex tasks, remember past interactions, and maybe even use other tools or APIs. That's where Julep comes in. @@ -124,13 +131,10 @@ Imagine a Research AI agent that can do the following: 1. Take a topic, 2. Come up with 100 search queries for that topic, 3. Perform those web searches in parallel, - 4. Collect and compile the results, - 5. Come up with 5 follow-up questions, - 6. Repeat the process with new queries, - 7. Summarize the results, - 8. Send the summary to Discord + 4. Summarize the results, + 5. Send the summary to Discord -In Julep, this would be a single task under 80 lines of code and run fully managed all on its own. Here's a working example: +In Julep, this would be a single task under 80 lines of code and run fully managed all on its own. All of the steps are executed on Julep's own servers and you don't need to lift a finger. Here's a working example: ```yaml name: Research Agent @@ -187,45 +191,19 @@ main: tool: web_search arguments: query: "_" - on_error: parallelism: 100 # Collect the results from the web search - evaluate: results: "'\n'.join([item.result for item in _])" -# Generate follow-up questions based on the results -- prompt: - - role: system - content: >- - Based on the following research results, generate 5 follow-up questions that would deepen our understanding of {{inputs[0].topic}}: - {{_.results}} - - Write one question per line. - unwrap: true - -- evaluate: - follow_up_queries: "_.split('\n')" - -# Run the web search in parallel for each follow-up query -- over: "_.follow_up_queries" - map: - tool: web_search - arguments: - query: "_" - - parallelism: 5 - -- evaluate: - all_results: "outputs[3].results + '\n'.join([item.result for item in _])" - # Summarize the results - prompt: - role: system content: > You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. The summary should be well-structured, informative, and highlight key findings and insights: - {{_.all_results}} + {{_.results}} unwrap: true # Send the summary to Discord @@ -244,13 +222,13 @@ main: ## Key Features -1. **Persistent AI Agents**: Remember context and information over long-term interactions. -2. **Stateful Sessions**: Keep track of past interactions for personalized responses. -3. **Multi-Step Tasks**: Build complex, multi-step processes with loops and decision-making. -4. **Task Management**: Handle long-running tasks that can run indefinitely. -5. **Built-in Tools**: Use built-in tools and external APIs in your tasks. -6. **Self-Healing**: Julep will automatically retry failed steps, resend messages, and generally keep your tasks running smoothly. -7. **RAG**: Use Julep's document store to build a system for retrieving and using your own data. +1. 🧠 **Persistent AI Agents**: Remember context and information over long-term interactions. +2. 💾 **Stateful Sessions**: Keep track of past interactions for personalized responses. +3. 🔄 **Multi-Step Tasks**: Build complex, multi-step processes with loops and decision-making. +4. ⏳ **Task Management**: Handle long-running tasks that can run indefinitely. +5. 🛠️ **Built-in Tools**: Use built-in tools and external APIs in your tasks. +6. 🔧 **Self-Healing**: Julep will automatically retry failed steps, resend messages, and generally keep your tasks running smoothly. +7. 📚 **RAG**: Use Julep's document store to build a system for retrieving and using your own data. Julep is ideal for applications that require AI use cases beyond simple prompt-response models. From 966f7d8922d478b768233ae2e0b74aa0dc252b64 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 7 Oct 2024 23:20:05 -0400 Subject: [PATCH 082/113] fix: Fix example.ts, example.py, and example.js files --- example.js | 130 +++++++++++++++++++++++++++++++ example.py | 168 ++++++++++++++++++++-------------------- example.ts | 224 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 343 insertions(+), 179 deletions(-) create mode 100644 example.js diff --git a/example.js b/example.js new file mode 100644 index 000000000..df2bf0af8 --- /dev/null +++ b/example.js @@ -0,0 +1,130 @@ +const { Julep } = require('@julep/sdk'); +const yaml = require('js-yaml'); +const readline = require('readline'); + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +async function createAgent() { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", + }); + + // 🛠️ Add an image generation tool (DALL·E) to the agent + await client.agents.tools.create(agent.id, { + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", + integration: { + provider: "dalle", + method: "generate_image", + setup: { + api_key: "your_openai_api_key", + }, + }, + }); + + return agent; +} + +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent) { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} + +async function executeTask(task) { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } + }); + + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } + + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} + +async function chatWithAgent(agent) { + const session = await client.sessions.create({ agent_id: agent.id }); + + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} + +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); +} + +runExample().catch(console.error); \ No newline at end of file diff --git a/example.py b/example.py index ef6d6f427..1d0e7deda 100644 --- a/example.py +++ b/example.py @@ -1,107 +1,109 @@ -from julep import Julep, AsyncJulep +import yaml +from julep import Julep -# 🔑 Initialize the Julep client -# Or alternatively, use AsyncJulep for async operations -client = Julep(api_key="your_api_key") +# Initialize the Julep client +client = Julep(api_key="your_julep_api_key") -################## -## 🤖 Agent 🤖 ## -################## - -# Create a research agent +# Step 1: Create an Agent agent = client.agents.create( - name="Research Agent", - about="You are a research agent designed to handle research inquiries.", - model="claude-3.5-sonnet", + name="Storytelling Agent", + model="gpt-4", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", ) -# 🔍 Add a web search tool to the agent +# Add an image generation tool (DALL·E) to the agent client.agents.tools.create( agent_id=agent.id, - name="web_search", # Should be python valid variable name - description="Use this tool to research inquiries.", + name="image_generator", + description="Use this tool to generate images based on descriptions.", integration={ - "provider": "brave", - "method": "search", + "provider": "dalle", + "method": "generate_image", "setup": { - "api_key": "your_brave_api_key", + "api_key": "your_openai_api_key", }, }, ) -################# -## 💬 Chat 💬 ## -################# +# Step 2: Create a Task that generates a story and comic strip +task_yaml = """ +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. -# Start an interactive chat session with the agent -session = client.sessions.create( - agent_id=agent.id, - context_overflow="adaptive", # 🧠 Julep will dynamically compute the context window if needed -) +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true -# 🔄 Chat loop -while (user_input := input("You: ")) != "exit": - response = client.sessions.chat( - session_id=session.id, - message=user_input, - ) + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].strip() + panels: re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ - print("Agent: ", response.choices[0].message.content) + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + Story: {{outputs[1].story}} + unwrap: true -################# -## 📋 Task 📋 ## -################# + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: "[output.image.url for output in outputs[2]]" +""" -# Create a recurring research task for the agent task = client.tasks.create( agent_id=agent.id, - name="Research Task", - description="Research the given topic every 24 hours.", - # - # 🛠️ Task specific tools - tools=[ - { - "name": "send_email", - "description": "Send an email to the user with the results.", - "api_call": { - "method": "post", - "url": "https://api.sendgrid.com/v3/mail/send", - "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"}, - }, - } - ], - # - # 🔢 Task main steps - main=[ - # - # Step 1: Research the topic - { - # `_` (underscore) variable refers to the previous step's output - # Here, it points to the topic input from the user - "prompt": "Look up topic '{{_.topic}}' and summarize the results.", - "tools": [{"ref": {"name": "web_search"}}], # 🔍 Use the web search tool from the agent - "unwrap": True, - }, - # - # Step 2: Send email with research results - { - "tool": "send_email", - "arguments": { - "subject": "Research Results", - "body": "'Here are the research results for today: ' + _.content", - "to": "inputs[0].email", # Reference the email from the user's input - }, - }, - # - # Step 3: Wait for 24 hours before repeating - {"sleep": "24 * 60 * 60"}, - ], + **yaml.safe_load(task_yaml) ) -# 🚀 Start the recurring task -client.executions.create(task_id=task.id, input={"topic": "Python"}) +# Step 3: Execute the Task +execution = client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} +) + +# Watch as the story and comic panels are generated +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) + +# Once the execution is finished, retrieve the results +result = client.executions.get(execution_id=execution.id) +print("Task Result:", result) + +# Step 4: Chat with the Agent +session = client.sessions.create(agent_id=agent.id) + +# Send messages to the agent +while True: + message = input("Enter a message (or 'quit' to exit): ") + if message.lower() == 'quit': + break + + response = client.sessions.chat( + session_id=session.id, + message=message, + ) + print("Agent:", response.choices[0].message.content) -# 🔁 This will run the task every 24 hours, -# research for the topic "Python", and -# send the results to the user's email +print("Chat session ended.") diff --git a/example.ts b/example.ts index 3ef4e1a91..df795dd5e 100644 --- a/example.ts +++ b/example.ts @@ -1,117 +1,149 @@ -import Julep from '@julep/sdk'; - -// 🔑 Initialize the Julep client -const client = new Julep({ - apiKey: 'your_api_key', - environment: 'production', // or 'dev' | 'local_multi_tenant' | 'local' -}); - -async function main() { - /* - * 🤖 Agent 🤖 - */ - - // Create a research agent - const agent = await client.agents.createOrUpdate('dad00000-0000-4000-a000-000000000000', { - name: 'Research Agent', - about: 'You are a research agent designed to handle research inquiries.', - model: 'claude-3.5-sonnet', +import { Julep } from '@julep/sdk'; +import yaml from 'js-yaml'; +import readline from 'readline'; + +// Add these type declarations at the top of the file +declare module '@julep/sdk'; +declare module 'js-yaml'; + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +interface Agent { + id: string; + // Add other properties as needed +} + +interface Task { + id: string; + // Add other properties as needed +} + +interface Execution { + id: string; + // Add other properties as needed +} + +async function createAgent(): Promise { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", }); - // 🔍 Add a web search tool to the agent + // 🛠️ Add an image generation tool (DALL·E) to the agent await client.agents.tools.create(agent.id, { - name: 'web_search', - description: 'Use this tool to research inquiries.', + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", integration: { - provider: 'brave', - method: 'search', + provider: "dalle", + method: "generate_image", setup: { - api_key: 'your_brave_api_key', + api_key: "your_openai_api_key", }, }, }); - /* - * 💬 Chat 💬 - */ + return agent; +} - // Start an interactive chat session with the agent - const session = await client.sessions.create({ - agentId: agent.id, - contextOverflow: 'adaptive', /* 🧠 Julep will dynamically compute the context window if needed */ - }); +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent: Agent): Promise { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} - // 🔄 Chat loop - const readline = require('readline').createInterface({ - input: process.stdin, - output: process.stdout, +async function executeTask(task: Task): Promise { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } }); - const askQuestion = (query: string) => new Promise((resolve) => readline.question(query, resolve)); + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } - while (true) { - const userInput = await askQuestion('You: '); - if (userInput === 'exit') break; + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} - const response = await client.sessions.chat(session.id, { - message: userInput, - }); +async function chatWithAgent(agent: Agent): Promise { + const session = await client.sessions.create({ agent_id: agent.id }); - console.log('Agent: ', response.choices[0].message.content); - } - - readline.close(); - - /* - * 📋 Task 📋 - */ - - // Create a recurring research task for the agent - const task = await client.tasks.create(agent.id, { - name: 'Research Task', - description: 'Research the given topic every 24 hours.', - /* 🛠️ Task specific tools */ - tools: [ - { - name: 'send_email', - description: 'Send an email to the user with the results.', - apiCall: { - method: 'post', - url: 'https://api.sendgrid.com/v3/mail/send', - headers: { Authorization: 'Bearer YOUR_SENDGRID_API_KEY' }, - }, - }, - ], - /* 🔢 Task main steps */ - main: [ - // Step 1: Research the topic - { - prompt: "Look up topic '{{_.topic}}' and summarize the results.", - tools: [{ ref: { name: 'web_search' } }], /* 🔍 Use the web search tool from the agent */ - unwrap: true, - }, - // Step 2: Send email with research results - { - tool: 'send_email', - arguments: { - subject: 'Research Results', - body: "'Here are the research results for today: ' + _.content", - to: 'inputs[0].email', // Reference the email from the user's input - }, - }, - // Step 3: Wait for 24 hours before repeating - { sleep: 24 * 60 * 60 }, - ], + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout }); - // 🚀 Start the recurring task - await client.executions.create(task.id, { input: { topic: 'TypeScript' } }); + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} - /* - * 🔁 This will run the task every 24 hours, - * research for the topic "TypeScript", and - * send the results to the user's email - */ +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); } -main().catch(console.error); \ No newline at end of file +runExample().catch(console.error); \ No newline at end of file From 007c2ef34de3dae600525a5e069bc648af42b8a3 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Tue, 8 Oct 2024 19:47:13 +0300 Subject: [PATCH 083/113] Docs(README): Fix mistakes in README (#613) > [!IMPORTANT] > Fixes mistakes in README files by updating provider names, session chat structures, and document handling functions. > > - **Provider and API Key Updates**: > - Change `provider` from `google` to `brave` and update `api_key` references in `README.md`, `README-CN.md`, and `README-JP.md`. > - **Session Chat Structure**: > - Update `client.sessions.chat` to use `messages` array instead of `message` string in `README.md`, `README-CN.md`, and `README-JP.md`. > - **Document Handling**: > - Change `client.documents.create` to `client.agents.docs.create` and `client.documents.search` to `client.agents.docs.search` in `README.md`, `README-CN.md`, and `README-JP.md`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 867ad7539fa922a1c98b575537666a107d7465c8. It will automatically update as commits are pushed. --- README-CN.md | 22 ++++++++++++++-------- README-JP.md | 24 +++++++++++++++--------- README.md | 19 ++++++++++++------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/README-CN.md b/README-CN.md index d5cb2c2de..b8f19f31a 100644 --- a/README-CN.md +++ b/README-CN.md @@ -596,9 +596,9 @@ client.agents.tools.create( name="web_search", description="搜索网络以获取信息。", integration={ - "provider": "google", + "provider": "brave", "method": "search", - "setup": {"api_key": "your_google_api_key"}, + "setup": {"api_key": "your_brave_api_key"}, }, ) ``` @@ -617,7 +617,12 @@ session = client.sessions.create( # 在同一会话中继续对话 response = client.sessions.chat( session_id=session.id, - message="继续我们之前的对话。" + messages=[ + { + "role": "user", + "content": "继续我们之前的对话。" + } + ] ) ``` @@ -627,15 +632,16 @@ response = client.sessions.chat( ```python # 上传文档 -document = client.documents.create( - file="path/to/document.pdf", +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", metadata={"category": "research_paper"} ) # 搜索文档 -results = client.documents.search( - query="AI 进展", - filter={"category": "research_paper"} +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} ) ``` diff --git a/README-JP.md b/README-JP.md index 8cd716ade..fb3c1dd97 100644 --- a/README-JP.md +++ b/README-JP.md @@ -600,9 +600,9 @@ client.agents.tools.create( name="web_search", description="Search the web for information.", integration={ - "provider": "google", + "provider": "brave", "method": "search", - "setup": {"api_key": "your_google_api_key"}, + "setup": {"api_key": "your_brave_api_key"}, }, ) ``` @@ -614,14 +614,19 @@ Julepは、持続的なインタラクションのための強力なセッショ ```python session = client.sessions.create( agent_id=agent.id, - user_id="user123", + user_id=user.id, context_overflow="adaptive" ) # 同じセッションで会話を続ける response = client.sessions.chat( session_id=session.id, - message="Follow up on our previous conversation." + messages=[ + { + "role": "user", + "content": "Follow up on our previous conversation." + } + ] ) ``` @@ -631,15 +636,16 @@ response = client.sessions.chat( ```python # ドキュメントをアップロードする -document = client.documents.create( - file="path/to/document.pdf", +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", metadata={"category": "research_paper"} ) # ドキュメントを検索する -results = client.documents.search( - query="AI advancements", - filter={"category": "research_paper"} +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} ) ``` diff --git a/README.md b/README.md index 9c44f7f6d..b636f4718 100644 --- a/README.md +++ b/README.md @@ -791,9 +791,9 @@ client.agents.tools.create( name="web_search", description="Search the web for information.", integration={ - "provider": "google", + "provider": "brave", "method": "search", - "setup": {"api_key": "your_google_api_key"}, + "setup": {"api_key": "your_brave_api_key"}, }, ) ``` @@ -805,14 +805,19 @@ Julep provides robust session management for persistent interactions: ```python session = client.sessions.create( agent_id=agent.id, - user_id="user123", + user_id=user.id, context_overflow="adaptive" ) # Continue conversation in the same session response = client.sessions.chat( session_id=session.id, - message="Follow up on our previous conversation." + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] ) ``` @@ -822,15 +827,15 @@ Easily manage and search through documents for your agents: ```python # Upload a document -document = client.documents.create( +document = client.agents.docs.create( title="AI advancements", content="AI is changing the world...", metadata={"category": "research_paper"} ) # Search documents -results = client.documents.search( - query="AI advancements", +results = client.agents.docs.search( + text="AI advancements", metadata_filter={"category": "research_paper"} ) ``` From 7effdd3d7491bf88edb43d76de6e30e7f7b17e28 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Tue, 8 Oct 2024 19:48:31 +0300 Subject: [PATCH 084/113] feat(memory-store): Make `cozo_data` volume external (#616) > [!IMPORTANT] > Set `cozo_data` volume to external in `docker-compose.yml`. > > - **Volumes**: > - Set `cozo_data` volume to `external: true` in `docker-compose.yml`, aligning with `cozo_backup`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 017823fcd989eaf1b242f11a9924c7f5910bfb21. It will automatically update as commits are pushed. --- memory-store/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/memory-store/docker-compose.yml b/memory-store/docker-compose.yml index 2adf50e81..e785a3526 100644 --- a/memory-store/docker-compose.yml +++ b/memory-store/docker-compose.yml @@ -33,5 +33,6 @@ services: volumes: cozo_data: + external: true cozo_backup: external: true \ No newline at end of file From 0424843417d56f8bed392f6fb45b569944cdf0a9 Mon Sep 17 00:00:00 2001 From: Shuvojit Das Date: Tue, 8 Oct 2024 23:09:49 +0530 Subject: [PATCH 085/113] Modified the import to use openai and set the API key using openai.api_key (#611) The openai library does not have a Client class that can be imported directly. Instead, we can use openai.api_key for authentication and the module's built-in methods to interact with the API. Set the API key using openai.api_key. In the RecSum-experiments.ipynb file I have converted user_input to lowercase using input("You: ").lower() before the comparison. This ensures that both "bye" and "Bye" (or any variation like "BYE") are treated the same, making the condition work as intended. PR #594, accidentally got closed. @creatorrr I removed the .DS_Store file that I checked in accidentally. Co-authored-by: Diwank Singh Tomer --- agents-api/notebooks/01-revise-entities.ipynb | 156 ++++-- agents-api/notebooks/02-trim-messages.ipynb | 107 +++- agents-api/notebooks/03-summarise.ipynb | 492 +++++++++++------- agents-api/notebooks/RecSum-experiments.ipynb | 232 +++++---- 4 files changed, 597 insertions(+), 390 deletions(-) diff --git a/agents-api/notebooks/01-revise-entities.ipynb b/agents-api/notebooks/01-revise-entities.ipynb index 00667cb82..27b2e1f0d 100644 --- a/agents-api/notebooks/01-revise-entities.ipynb +++ b/agents-api/notebooks/01-revise-entities.ipynb @@ -2,16 +2,64 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openai in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.51.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.6.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.27.2)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.5.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (2.9.2)\n", + "Requirement already satisfied: sniffio in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.66.5)\n", + "Requirement already satisfied: typing-extensions<5,>=4.11 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.12.2)\n", + "Requirement already satisfied: idna>=2.8 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", + "Requirement already satisfied: certifi in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (1.0.6)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.23.4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (2.23.4)\n" + ] + } + ], + "source": [ + "! pip install openai" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: python-dotenv in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.0.1)\n" + ] + } + ], + "source": [ + "! pip install python-dotenv" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "True" + "False" ] }, - "execution_count": 6, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -35,18 +83,22 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "from openai import Client\n", + "import openai\n", + "from openai import OpenAI\n", + "\n", + "api_key = \"YOUR_OPENAI_API_KEY\"\n", "\n", - "client = Client()" + "openai.api_key = api_key\n", + "client = OpenAI(api_key=api_key)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -89,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -290,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -314,7 +366,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -323,7 +375,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -339,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -348,7 +400,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -365,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -381,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -460,7 +512,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -468,44 +520,37 @@ "output_type": "stream", "text": [ "Starting CoT generation\n", - "{'content': 'Planning step by step:\\n'\n", + "{'content': 'To add context for future entries, we should outline the main '\n", + " 'entities in the session. These entities are the main people, '\n", + " 'places, or things that are most relevant to the conversation.\\n'\n", " '\\n'\n", - " '1. Identify key entities such as characters, games, and '\n", - " 'technology mentioned in the conversation.\\n'\n", - " '2. Provide context for each entity, explaining its relevance to '\n", - " 'the conversation and any additional useful information.\\n'\n", - " '3. Ensure the entities and their descriptions encapsulate the '\n", - " 'essence of the conversation for future reference or follow-up '\n", - " 'discussions.\\n'\n", - " '\\n'\n", - " 'Entities will be identified and described based on the '\n", - " \"conversation's content and flow. This will include the games \"\n", - " 'discussed, characters within those games, and any technology '\n", - " 'issues mentioned.',\n", + " 'Entities:\\n'\n", + " '1. User (The participant initiating the conversation, interested '\n", + " 'in video games and experiencing technical issues).\\n'\n", + " '2. Assistant (Engages in conversation about video games and '\n", + " 'offers technical advice).\\n'\n", + " '3. Red Dead Redemption 2 (Video game discussed, specifically the '\n", + " '\"Blood Feuds, Ancient and Modern\" mission and the character '\n", + " 'development of Arthur and Dutch).\\n'\n", + " '4. Helldivers 2 (Another video game discussed, focusing on '\n", + " 'gameplay, strategy, and specific in-game items like the laser '\n", + " 'cannon and guard dog).\\n'\n", + " '5. Nvidia (Referenced in relation to driver issues, particularly '\n", + " 'in the context of compatibility with Linux operating systems).',\n", " 'role': 'assistant'}\n", "End CoT generation\n", "Starting chatml generation\n", "End chatml generation\n", - "{'content': '- **User**: Engages in discussions about video games and faces '\n", + "{'content': '- User: Engages in discussions about video games and experiences '\n", " 'technical issues with Nvidia drivers on Linux.\\n'\n", - " '- **Assistant**: Provides conversation on video games, offers '\n", - " 'suggestions on game strategies, and gives technical advice '\n", - " 'regarding Nvidia drivers.\\n'\n", - " '- **Red Dead Redemption 2 (RDR2)**: A video game discussed '\n", - " 'extensively, particularly its missions and character '\n", - " 'development.\\n'\n", - " '- **Arthur Morgan**: A central character in RDR2, noted for his '\n", - " 'moral complexity and development throughout the game.\\n'\n", - " '- **Dutch van der Linde**: Another key character from RDR2, whose '\n", - " \"increasingly erratic decisions impact the game's storyline.\\n\"\n", - " '- **Helldivers 2**: A cooperative multiplayer game mentioned by '\n", - " 'the user, known for its intense gameplay and strategic team '\n", - " 'dynamics.\\n'\n", - " '- **Nvidia**: Technology company referenced in relation to driver '\n", - " 'compatibility issues with Linux operating systems.\\n'\n", - " '- **Linux**: Operating system mentioned as having compatibility '\n", - " \"issues with Nvidia drivers, affecting the user's gaming \"\n", - " 'experience.',\n", + " '- Assistant: Provides insights and engages in discussions about '\n", + " 'video games, offers technical advice.\\n'\n", + " '- Red Dead Redemption 2: A video game discussed for its missions '\n", + " 'and character development.\\n'\n", + " '- Helldivers 2: Another video game mentioned, focusing on '\n", + " 'gameplay and strategies.\\n'\n", + " '- Nvidia: Mentioned in relation to driver compatibility issues '\n", + " 'with Linux.',\n", " 'role': 'assistant'}\n" ] } @@ -513,11 +558,18 @@ "source": [ "pprint(get_entities(chat_session))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "julep", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -531,7 +583,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/agents-api/notebooks/02-trim-messages.ipynb b/agents-api/notebooks/02-trim-messages.ipynb index 2a5c58da2..bf03a76a0 100644 --- a/agents-api/notebooks/02-trim-messages.ipynb +++ b/agents-api/notebooks/02-trim-messages.ipynb @@ -4,14 +4,62 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openai in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.51.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.6.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.27.2)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.5.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (2.9.2)\n", + "Requirement already satisfied: sniffio in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.66.5)\n", + "Requirement already satisfied: typing-extensions<5,>=4.11 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.12.2)\n", + "Requirement already satisfied: idna>=2.8 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", + "Requirement already satisfied: certifi in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (1.0.6)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.23.4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (2.23.4)\n" + ] + } + ], + "source": [ + "! pip install openai" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: python-dotenv in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.0.1)\n" + ] + } + ], + "source": [ + "! pip install python-dotenv" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "True" + "False" ] }, - "execution_count": 1, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -35,18 +83,22 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "from openai import Client\n", + "import openai\n", + "from openai import OpenAI\n", "\n", - "client = Client()" + "api_key = \"YOUR_OPENAI_API_KEY\"\n", + "\n", + "openai.api_key = api_key\n", + "client = OpenAI(api_key=api_key)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -89,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -290,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -351,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -360,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -376,7 +428,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -385,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -402,7 +454,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -418,7 +470,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -493,7 +545,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -501,11 +553,11 @@ "output_type": "stream", "text": [ "Starting CoT generation\n", - "{'content': 'The messages are clear and concise, reflecting a casual '\n", - " 'conversation about gaming experiences and software issues. '\n", - " \"There's no need for trimming as each message contributes to the \"\n", - " 'flow of the conversation, maintaining user engagement and '\n", - " 'providing relevant information and responses.',\n", + "{'content': 'The conversation is generally concise and relevant to the casual, '\n", + " 'gaming-centered topic. Each message contributes to the dialogue '\n", + " 'by either providing information or prompting further discussion, '\n", + " 'and no excessive verbosity or extraneous details are present. '\n", + " 'Therefore, no trimming is required for this session.',\n", " 'role': 'assistant'}\n", "End CoT generation\n", "Starting chatml generation\n", @@ -701,11 +753,18 @@ "source": [ "pprint(trim_messages(chat_session))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "julep", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -719,7 +778,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/agents-api/notebooks/03-summarise.ipynb b/agents-api/notebooks/03-summarise.ipynb index 98e6f5e0a..7be4baf02 100644 --- a/agents-api/notebooks/03-summarise.ipynb +++ b/agents-api/notebooks/03-summarise.ipynb @@ -4,14 +4,62 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openai in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.51.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.6.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.27.2)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.5.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (2.9.2)\n", + "Requirement already satisfied: sniffio in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.66.5)\n", + "Requirement already satisfied: typing-extensions<5,>=4.11 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.12.2)\n", + "Requirement already satisfied: idna>=2.8 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", + "Requirement already satisfied: certifi in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (1.0.6)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.23.4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (2.23.4)\n" + ] + } + ], + "source": [ + "! pip install openai" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: python-dotenv in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.0.1)\n" + ] + } + ], + "source": [ + "! pip install python-dotenv" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "True" + "False" ] }, - "execution_count": 1, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -42,18 +90,22 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "from openai import Client\n", + "import openai\n", + "from openai import OpenAI\n", + "\n", + "api_key = \"YOUR_OPENAI_API_KEY\"\n", "\n", - "client = Client()" + "openai.api_key = api_key\n", + "client = OpenAI(api_key=api_key)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -100,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -124,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -315,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -355,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -429,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -474,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -490,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -506,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -515,7 +567,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -532,7 +584,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -555,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -636,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -644,41 +696,37 @@ "output_type": "stream", "text": [ "Starting CoT generation\n", - "{'content': 'To provide a comprehensive overview of the entities in the '\n", - " 'session, we need to focus on the main people, places, things, and '\n", - " 'concepts that have been discussed:\\n'\n", + "{'content': 'To summarize the important entities from this conversation:\\n'\n", " '\\n'\n", - " '1. **User**: Engages in conversation about video games, '\n", - " 'specifically mentioning experiences with \"Red Dead Redemption 2\" '\n", - " 'and \"Helldivers 2.\" Also, shares technical issues related to '\n", - " 'Nvidia graphics drivers on Linux.\\n'\n", + " '1. **User**: Engages in a casual and friendly chat with the '\n", + " 'Assistant, discussing video games and a technical issue.\\n'\n", + " '2. **Assistant**: Responds to the User, engaging in discussions '\n", + " 'about specific video games and offering technical advice '\n", + " 'regarding an Nvidia driver issue.\\n'\n", + " '3. **Video Games Discussed**:\\n'\n", + " ' - **Red Dead Redemption 2 (RDR2)**: User recently finished '\n", + " 'this game and discusses specific missions such as \"Blood Feuds, '\n", + " 'Ancient and Modern\".\\n'\n", + " ' - **Helldivers 2**: User is currently playing this game, '\n", + " 'mentioning favorite builds and discussing gameplay strategies.\\n'\n", + " '4. **Technical Issue**: User mentions having an Nvidia driver '\n", + " 'issue, particularly concerning its compatibility with Linux. The '\n", + " 'Assistant offers advice on handling this issue.\\n'\n", + " '5. **Game Characters**:\\n'\n", + " ' - **Arthur**: From RDR2, discussed in terms of his journey and '\n", + " 'character development.\\n'\n", + " ' - **Dutch**: Also from RDR2, discussed for his progressive '\n", + " 'craziness and leadership style.\\n'\n", + " '6. **Gaming Strategies**:\\n'\n", + " ' - **Run and Gun**: Mentioned by the User as a strategy used in '\n", + " 'Helldivers 2.\\n'\n", + " '7. **Operating System**:\\n'\n", + " ' - **Linux**: Mentioned in relation to the Nvidia driver '\n", + " 'compatibility issue.\\n'\n", " '\\n'\n", - " '2. **Assistant**: Offers insights and engages in discussions '\n", - " 'about the video games mentioned by the user, provides gameplay '\n", - " 'strategies, and offers technical advice regarding Nvidia driver '\n", - " 'issues on Linux.\\n'\n", - " '\\n'\n", - " '3. **Red Dead Redemption 2 (RDR2)**: A video game discussed '\n", - " 'extensively in the conversation. Key aspects such as the '\n", - " 'character Arthur, missions like \"Blood Feuds, Ancient and '\n", - " 'Modern,\" and side quests are highlighted.\\n'\n", - " '\\n'\n", - " '4. **Helldivers 2**: Another video game mentioned by the user. '\n", - " 'The conversation covers gameplay elements like the laser cannon, '\n", - " 'guard dog, and challenges like the Charger enemy.\\n'\n", - " '\\n'\n", - " '5. **Nvidia Drivers**: A technical issue brought up by the user, '\n", - " 'particularly focusing on compatibility problems with Linux. The '\n", - " 'assistant provides troubleshooting advice and recommendations for '\n", - " 'dealing with these issues.\\n'\n", - " '\\n'\n", - " '6. **Linux**: Mentioned in the context of having compatibility '\n", - " \"issues with Nvidia drivers, highlighting the user's struggle with \"\n", - " 'technical aspects of gaming on this operating system.\\n'\n", - " '\\n'\n", - " 'These entities encapsulate the core topics and issues discussed '\n", - " \"in the session, providing a clear view of the conversation's \"\n", - " 'focus areas.',\n", + " 'These entities encapsulate the main topics and references made '\n", + " 'during the conversation, focusing on video gaming experiences, '\n", + " 'character analysis, and technical troubleshooting.',\n", " 'role': 'assistant'}\n", "End CoT generation\n", "Starting chatml generation\n", @@ -699,7 +747,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -777,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -785,19 +833,45 @@ "output_type": "stream", "text": [ "Starting CoT generation\n", - "{'content': 'The conversation between the user and the assistant revolves '\n", - " 'around video games and technical issues. The assistant engages '\n", - " 'enthusiastically about the user’s gaming experiences, providing '\n", - " 'tips and engaging on a technical level about Nvidia drivers on '\n", - " 'Linux towards the end. The user is generally responsive and '\n", - " 'shares specifics about their gaming preferences and technical '\n", - " 'difficulties. The tone is casual and friendly throughout, with '\n", - " 'the assistant providing support and showing interest in the '\n", - " \"user's activities. \\n\"\n", - " '\\n'\n", - " 'No trimming is required as the messages are well-paced and '\n", - " \"relevant to the users' interests, fostering an engaging and \"\n", - " 'informative dialogue.',\n", + "{'content': '\\n'\n", + " \"- User greeted the assistant and asked what's good.\\n\"\n", + " '- Assistant replied casually, asking about recent games.\\n'\n", + " '- User mentioned finishing Red Dead Redemption 2, praising the '\n", + " 'final mission.\\n'\n", + " \"- Assistant inquired about the user's thoughts on Arthur's \"\n", + " 'journey and favorite moments.\\n'\n", + " '- User highlighted the \"Blood Feuds\" mission.\\n'\n", + " \"- Assistant discussed the mission's cinematic aspects and asked \"\n", + " \"about user's alignment with game characters.\\n\"\n", + " '- User preferred Arthur over Dutch.\\n'\n", + " '- Assistant discussed character development and suggested '\n", + " 'exploring side quests.\\n'\n", + " '- User mentioned completing side quests, liked the widow and '\n", + " 'bounty missions.\\n'\n", + " \"- Assistant praised the game's side missions and asked about \"\n", + " \"user's next gaming plans.\\n\"\n", + " '- User switched to playing Helldivers 2.\\n'\n", + " \"- Assistant described Helldivers 2's gameplay and asked about \"\n", + " \"user's experience.\\n\"\n", + " '- User shared favorite equipment setup.\\n'\n", + " '- Assistant discussed tactical options and asked about '\n", + " 'challenging missions.\\n'\n", + " '- User mentioned difficulty with a specific enemy.\\n'\n", + " \"- Assistant offered strategy tips and inquired about team's \"\n", + " 'handling of game challenges.\\n'\n", + " '- User described their run-and-gun approach.\\n'\n", + " '- Assistant acknowledged the strategy and asked about difficulty '\n", + " 'levels.\\n'\n", + " '- User mentioned needing to work and a technical issue with '\n", + " 'Nvidia drivers.\\n'\n", + " '- Assistant offered technical advice for driver issue and wished '\n", + " 'good luck with work.\\n'\n", + " '- User commented on Nvidia and Linux compatibility issues.\\n'\n", + " '- Assistant provided detailed advice for handling Nvidia drivers '\n", + " 'on Linux.\\n'\n", + " '- User ended the conversation, intending to leave.\\n'\n", + " '- Assistant said goodbye.\\n'\n", + " '',\n", " 'role': 'assistant'}\n", "End CoT generation\n", "Starting chatml generation\n", @@ -811,7 +885,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1011,7 +1085,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -1098,7 +1172,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1106,106 +1180,21 @@ "output_type": "stream", "text": [ "Starting CoT generation\n", - "{'content': '- Combine initial greetings and the start of the discussion about '\n", - " '\"Red Dead Redemption 2 (RDR2)\" into a summary.\\n'\n", - " '- Summarize the detailed conversation about specific missions and '\n", - " 'characters in \"RDR2\".\\n'\n", - " '- Retain individual entries about \"Helldivers 2\" due to the '\n", - " \"user's direct interaction and game preferences.\\n\"\n", - " '- Summarize discussions around \"Nvidia Drivers\" and \"Linux\" '\n", - " 'compatibility, emphasizing the solution offered.\\n'\n", - " '- Retain the closing conversation as it indicates the end of the '\n", - " 'session. \\n'\n", - " '\\n'\n", - " '\\n'\n", - " '[\\n'\n", - " ' {\\n'\n", - " ' \"role\": \"system\",\\n'\n", - " ' \"name\": \"summary\",\\n'\n", - " ' \"content\": \"Event: The user discussed finishing \\'Red Dead '\n", - " \"Redemption 2' and particularly enjoyed the last mission. They \"\n", - " 'also talked about favorite missions and characters, specifically '\n", - " 'Arthur over Dutch.\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 12,\\n'\n", - " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"im playing helldivers 2. do u know of it\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 13,\\n'\n", - " ' \"role\": \"assistant\",\\n'\n", - " ' \"content\": \"Yes, Helldivers 2! It\\'s a great choice if '\n", - " \"you're into intense co-op action. The game really ramps up with \"\n", - " 'its twin-stick shooter gameplay, and it\\\\u2019s super fun but '\n", - " 'also quite challenging. Working together with teammates to '\n", - " 'complete those missions can get pretty hectic. How are you '\n", - " 'finding the chaos and team dynamics so far?\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 14,\\n'\n", - " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"amazing. my fav build is laser cannon + guard '\n", - " 'dog. what about u\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 15,\\n'\n", - " ' \"role\": \"assistant\",\\n'\n", - " ' \"content\": \"Nice combo! The laser cannon is awesome for '\n", - " 'tearing through those enemy swarms, and the guard dog drone '\n", - " 'really helps in keeping the smaller threats at bay. I personally '\n", - " 'love using the railgun with a shield backpack. It gives a good '\n", - " 'balance of offense and defense, especially when things get really '\n", - " 'chaotic. What\\'s been the toughest mission for you so far?\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 16,\\n'\n", - " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"dude the charger is so difficult to kill.\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 17,\\n'\n", - " ' \"role\": \"assistant\",\\n'\n", - " ' \"content\": \"Yeah, the Charger can be brutal! They really test '\n", - " \"your reflexes and teamwork. It's all about timing and \"\n", - " 'coordination with your team to bring those heavy hitters down. '\n", - " 'Have you tried using more strategic traps or mines? Sometimes '\n", - " 'setting up the right position with static fields can really make '\n", - " 'a difference against them. How do your squadmates handle it?\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 18,\\n'\n", - " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"we just run and gun\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 19,\\n'\n", - " ' \"role\": \"assistant\",\\n'\n", - " ' \"content\": \"Classic strategy! That can definitely be fun, '\n", - " 'especially in a game as intense as Helldivers 2 where things get '\n", - " 'chaotic fast. Keeping on the move helps a ton. Just make sure '\n", - " \"someone's always got your back! Have you guys tried any of the \"\n", - " 'higher difficulty levels yet, or are you sticking to a certain '\n", - " 'comfort zone for now?\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"role\": \"system\",\\n'\n", - " ' \"name\": \"summary\",\\n'\n", - " ' \"content\": \"Event: The user discussed an Nvidia driver issue, '\n", - " 'particularly its incompatibility with Linux, and the assistant '\n", - " 'provided potential solutions and resources for assistance.\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 24,\\n'\n", - " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"yep. see u bye!\"\\n'\n", - " ' },\\n'\n", - " ' {\\n'\n", - " ' \"index\": 25,\\n'\n", - " ' \"role\": \"assistant\",\\n'\n", - " ' \"content\": \"See you, take care! Bye!\"\\n'\n", - " ' }\\n'\n", - " ']\\n',\n", + "{'content': '- Summarize the initial casual greeting between User and '\n", + " 'Assistant.\\n'\n", + " \"- Keep detailed discussion on RDR2, including User's favorite \"\n", + " 'moments and characters, as they directly relate to the entities '\n", + " 'outlined.\\n'\n", + " '- Summarize the transition from RDR2 discussion to Helldivers 2 '\n", + " 'without losing game-specific details.\\n'\n", + " '- Preserve details on Helldivers 2 gameplay strategies mentioned '\n", + " 'by User.\\n'\n", + " \"- Summarize User's mention of work and Nvidia driver issue while \"\n", + " 'retaining the essence of their tech problem.\\n'\n", + " \"- Retain Assistant's advice on Nvidia and Linux compatibility \"\n", + " \"issues, as it's relevant to the User's context.\\n\"\n", + " '- Keep the farewell message brief but intact to maintain the '\n", + " 'conversational closure.',\n", " 'role': 'assistant'}\n", "End CoT generation\n", "Starting chatml generation\n", @@ -1225,7 +1214,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -1236,88 +1225,180 @@ " ' {\\n'\n", " ' \"role\": \"system\",\\n'\n", " ' \"name\": \"summary\",\\n'\n", - " ' \"content\": \"Event: The user discussed finishing \\'Red Dead '\n", - " \"Redemption 2' and particularly enjoyed the last mission. They \"\n", - " 'also talked about favorite missions and characters, specifically '\n", - " 'Arthur over Dutch.\"\\n'\n", + " ' \"content\": \"Event: Casual greeting between User and '\n", + " 'Assistant, with User mentioning they recently finished playing '\n", + " 'Red Dead Redemption 2.\"\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"user\",\\n'\n", + " ' \"content\": \"i just got done with finishing red dead '\n", + " 'redemption 2 recently. the last mission was so fkng coolll\",\\n'\n", + " ' \"index\": 4\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"assistant\",\\n'\n", + " ' \"content\": \"Oh man, RDR2 is epic! That ending is intense, '\n", + " \"right? What did you think about Arthur's journey throughout the \"\n", + " 'game? Got any favorite moments?\",\\n'\n", + " ' \"index\": 5\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"user\",\\n'\n", + " ' \"content\": \"blood feuds mission was amazing\",\\n'\n", + " ' \"index\": 6\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"assistant\",\\n'\n", + " ' \"content\": \"Absolutely, the \\\\\"Blood Feuds, Ancient and '\n", + " 'Modern\\\\\" mission is a standout! The whole shootout at '\n", + " 'Braithwaite Manor is intense. The atmosphere Rockstar created '\n", + " 'during that mission with the burning building in the background '\n", + " 'is just cinematic perfection. Did you side more with Arthur or '\n", + " 'Dutch throughout the game?\",\\n'\n", + " ' \"index\": 7\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 12,\\n'\n", " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"im playing helldivers 2. do u know of it\"\\n'\n", + " ' \"content\": \"arthur of course. dutch just kept becoming '\n", + " 'crazier and crazier.\",\\n'\n", + " ' \"index\": 8\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"assistant\",\\n'\n", + " ' \"content\": \"Totally get that. Arthur\\'s character development '\n", + " \"is really something else. He starts questioning Dutch's decisions \"\n", + " 'and looking at things more critically, which adds so much depth '\n", + " \"to his character. Watching Dutch's descent as the gang falls \"\n", + " 'apart is pretty intense. Have you thought about checking out any '\n", + " 'of the side quests or exploring more of the open world now that '\n", + " 'you\\'ve finished the main story?\",\\n'\n", + " ' \"index\": 9\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"user\",\\n'\n", + " ' \"content\": \"oh i\\'ve done all the side quests. the widow '\n", + " 'missions are great but i also loved the bounty missions (where u '\n", + " 'have to talk to gangsters for an author)\",\\n'\n", + " ' \"index\": 10\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"assistant\",\\n'\n", + " ' \"content\": \"Ah, the bounty missions for the author are a '\n", + " 'blast! Hunting down those gunslingers for the book gives you such '\n", + " \"a great tour of the game's diverse characters. And Charlotte's \"\n", + " \"missions, the widow, they're pretty touching, right? It\\\\u2019s \"\n", + " 'nice to see Arthur helping her adapt to wilderness life. Adds a '\n", + " 'softer side to the game amidst all the chaos.\\\\n\\\\nNow that '\n", + " 'you\\'ve conquered RDR2, any other games on your radar?\",\\n'\n", + " ' \"index\": 11\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"user\",\\n'\n", + " ' \"content\": \"im playing helldivers 2. do u know of it\",\\n'\n", + " ' \"index\": 12\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 13,\\n'\n", " ' \"role\": \"assistant\",\\n'\n", " ' \"content\": \"Yes, Helldivers 2! It\\'s a great choice if '\n", " \"you're into intense co-op action. The game really ramps up with \"\n", " 'its twin-stick shooter gameplay, and it\\\\u2019s super fun but '\n", " 'also quite challenging. Working together with teammates to '\n", " 'complete those missions can get pretty hectic. How are you '\n", - " 'finding the chaos and team dynamics so far?\"\\n'\n", + " 'finding the chaos and team dynamics so far?\",\\n'\n", + " ' \"index\": 13\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 14,\\n'\n", " ' \"role\": \"user\",\\n'\n", " ' \"content\": \"amazing. my fav build is laser cannon + guard '\n", - " 'dog. what about u\"\\n'\n", + " 'dog. what about u\",\\n'\n", + " ' \"index\": 14\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 15,\\n'\n", " ' \"role\": \"assistant\",\\n'\n", " ' \"content\": \"Nice combo! The laser cannon is awesome for '\n", " 'tearing through those enemy swarms, and the guard dog drone '\n", " 'really helps in keeping the smaller threats at bay. I personally '\n", " 'love using the railgun with a shield backpack. It gives a good '\n", " 'balance of offense and defense, especially when things get really '\n", - " 'chaotic. What\\'s been the toughest mission for you so far?\"\\n'\n", + " 'chaotic. What\\'s been the toughest mission for you so far?\",\\n'\n", + " ' \"index\": 15\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 16,\\n'\n", " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"dude the charger is so difficult to kill.\"\\n'\n", + " ' \"content\": \"dude the charger is so difficult to kill.\",\\n'\n", + " ' \"index\": 16\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 17,\\n'\n", " ' \"role\": \"assistant\",\\n'\n", " ' \"content\": \"Yeah, the Charger can be brutal! They really test '\n", " \"your reflexes and teamwork. It's all about timing and \"\n", " 'coordination with your team to bring those heavy hitters down. '\n", " 'Have you tried using more strategic traps or mines? Sometimes '\n", " 'setting up the right position with static fields can really make '\n", - " 'a difference against them. How do your squadmates handle it?\"\\n'\n", + " 'a difference against them. How do your squadmates handle it?\",\\n'\n", + " ' \"index\": 17\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 18,\\n'\n", " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"we just run and gun\"\\n'\n", + " ' \"content\": \"we just run and gun\",\\n'\n", + " ' \"index\": 18\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 19,\\n'\n", " ' \"role\": \"assistant\",\\n'\n", " ' \"content\": \"Classic strategy! That can definitely be fun, '\n", " 'especially in a game as intense as Helldivers 2 where things get '\n", " 'chaotic fast. Keeping on the move helps a ton. Just make sure '\n", " \"someone's always got your back! Have you guys tried any of the \"\n", " 'higher difficulty levels yet, or are you sticking to a certain '\n", - " 'comfort zone for now?\"\\n'\n", + " 'comfort zone for now?\",\\n'\n", + " ' \"index\": 19\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"role\": \"system\",\\n'\n", - " ' \"name\": \"summary\",\\n'\n", - " ' \"content\": \"Event: The user discussed an Nvidia driver issue, '\n", - " 'particularly its incompatibility with Linux, and the assistant '\n", - " 'provided potential solutions and resources for assistance.\"\\n'\n", + " ' \"role\": \"user\",\\n'\n", + " ' \"content\": \"i think i have to go work soon. also have this '\n", + " 'nvidia driver issue that\\'s bugging me\",\\n'\n", + " ' \"index\": 20\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"assistant\",\\n'\n", + " ' \"content\": \"Ah, bummer about the driver issue \\\\u2014 it\\'s '\n", + " 'annoying when tech stuff gets in the way of gaming. Maybe try '\n", + " \"doing a clean install of the drivers if you haven't already? It \"\n", + " 'can sometimes clear up persistent issues.\\\\n\\\\nAlso, good luck '\n", + " \"with work! Hopefully, you'll get some time later to sort out the \"\n", + " 'driver thing and jump back into some gaming. Let me know how it '\n", + " \"goes, and if you need more gaming chats or tech tips, I'm \"\n", + " 'here!\",\\n'\n", + " ' \"index\": 21\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"user\",\\n'\n", + " ' \"content\": \"nvidia and linux don\\'t go well together\",\\n'\n", + " ' \"index\": 22\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"assistant\",\\n'\n", + " ' \"content\": \"That\\'s true, Nvidia drivers can be tricky to '\n", + " 'handle on Linux due to compatibility issues sometimes. You might '\n", + " 'want to check out the latest Nvidia driver from their official '\n", + " 'site or a stable version known to work well with your specific '\n", + " 'Linux distribution. Using proprietary drivers instead of Nouveau '\n", + " 'could also potentially solve a lot of issues. Additionally, '\n", + " 'forums and community support boards like those on Ubuntu, Arch, '\n", + " 'or even broader communities like Reddit\\\\u2019s r/linux_gaming '\n", + " 'can be really helpful.\\\\n\\\\nHope that helps, and your driver woes '\n", + " 'get sorted soon so you can enjoy your gaming hassle-free!\",\\n'\n", + " ' \"index\": 23\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 24,\\n'\n", " ' \"role\": \"user\",\\n'\n", - " ' \"content\": \"yep. see u bye!\"\\n'\n", + " ' \"content\": \"yep. see u bye!\",\\n'\n", + " ' \"index\": 24\\n'\n", " ' },\\n'\n", " ' {\\n'\n", - " ' \"index\": 25,\\n'\n", " ' \"role\": \"assistant\",\\n'\n", - " ' \"content\": \"See you, take care! Bye!\"\\n'\n", + " ' \"content\": \"See you, take care! Bye!\",\\n'\n", + " ' \"index\": 25\\n'\n", " ' }\\n'\n", " ']',\n", " 'role': 'assistant'}\n" @@ -1327,11 +1408,18 @@ "source": [ "pprint(summarized_messages)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "julep", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1345,7 +1433,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/agents-api/notebooks/RecSum-experiments.ipynb b/agents-api/notebooks/RecSum-experiments.ipynb index 1315533dc..466c7e6cb 100644 --- a/agents-api/notebooks/RecSum-experiments.ipynb +++ b/agents-api/notebooks/RecSum-experiments.ipynb @@ -1,18 +1,68 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "3127f8fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openai in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.51.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.6.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.27.2)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (0.5.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (2.9.2)\n", + "Requirement already satisfied: sniffio in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.66.5)\n", + "Requirement already satisfied: typing-extensions<5,>=4.11 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from openai) (4.12.2)\n", + "Requirement already satisfied: idna>=2.8 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from anyio<5,>=3.5.0->openai) (3.10)\n", + "Requirement already satisfied: certifi in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (2024.8.30)\n", + "Requirement already satisfied: httpcore==1.* in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpx<1,>=0.23.0->openai) (1.0.6)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.23.4 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->openai) (2.23.4)\n" + ] + } + ], + "source": [ + "! pip install openai" + ] + }, { "cell_type": "code", "execution_count": 2, + "id": "96efe2be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: python-dotenv in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.0.1)\n" + ] + } + ], + "source": [ + "! pip install python-dotenv" + ] + }, + { + "cell_type": "code", + "execution_count": 3, "id": "b03a4636-d57e-42e9-8a06-fdb7c6803708", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "True" + "False" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -23,24 +73,20 @@ "load_dotenv(\"../../.env\")" ] }, - { - "cell_type": "code", - "execution_count": 3, - "id": "eb80a352-ad21-423c-9284-32b21d271eba", - "metadata": {}, - "outputs": [], - "source": [ - "from openai import Client" - ] - }, { "cell_type": "code", "execution_count": 4, - "id": "4619f484-55f6-4122-8e26-27ec9e3506d5", + "id": "eb80a352-ad21-423c-9284-32b21d271eba", "metadata": {}, "outputs": [], "source": [ - "client = Client()" + "import openai\n", + "from openai import OpenAI\n", + "\n", + "api_key = \"YOUR_OPENAI_API_KEY\"\n", + "\n", + "openai.api_key = api_key\n", + "client = OpenAI(api_key=api_key)" ] }, { @@ -99,7 +145,7 @@ "\n", "\n", "def chat():\n", - " while (user_input := input(\"You: \")) != \"bye\":\n", + " while (user_input := input(\"You: \").lower()) != \"bye\": \n", " chat_session.append(user(user_input))\n", "\n", " result = generate(chat_session)\n", @@ -362,63 +408,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "You: hey\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GPT: Hey! How are you doing?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You: good, how about you?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GPT: I'm doing well, thank you for asking. Is there anything on your mind that you'd like to talk about or get some advice on?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You: no why do you say that? did I sound troubled?\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GPT: Not at all! I just thought I'd check in and see if there's anything on your mind that you might need some advice or someone to talk to about. But if you're doing well, that's great to hear!\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You: no I didnt say I was ok just that I hadnt thought of asking for advice yet\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GPT: Ah, I see. Well, I'm here whenever you need a listening ear or some advice. Just let me know how I can help!\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You: bye\n" + "GPT: Hey there! I just wanted to remind you that it's important to take care of yourself both mentally and physically. Make sure to prioritize self-care and engage in activities that bring you joy and peace. Remember, it's okay to say no to things that don't align with your values or make you uncomfortable. Trust your instincts and surround yourself with positive influences. You deserve to be happy and fulfilled, so don't be afraid to pursue your dreams and make choices that are best for you. If you ever need a listening ear or some guidance, I'm always here for you!\n", + "GPT: I'm just a program, so I don't have feelings like humans do, but I'm here and ready to help you with anything you need. How can I support you today?\n" ] } ], @@ -442,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "id": "95431b29-73e2-4954-b6fc-1c8814a9249f", "metadata": {}, "outputs": [], @@ -452,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "1eaabfe2-f399-428b-84d2-ed8c237b7d3d", "metadata": {}, "outputs": [], @@ -475,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "2a726b3c-493c-4df5-81a7-6b7b109c222e", "metadata": {}, "outputs": [], @@ -504,7 +495,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "id": "6323b7b2-0aaf-4cea-896b-0c887054ce6e", "metadata": {}, "outputs": [], @@ -596,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 17, "id": "0c2eaabc-76a1-412f-beb3-b64510e638a2", "metadata": {}, "outputs": [ @@ -604,57 +595,74 @@ "name": "stdout", "output_type": "stream", "text": [ - "1714643926.0711672\n", - "0.0017969608306884766\n", + "1728353832.57365\n", + "0.00043010711669921875\n", "Starting CoT generation\n", "{'content': 'Planning step by step:\\n'\n", - " '- Combine entries 1 and 2 into a summary of the greeting and '\n", - " 'initial chat.\\n'\n", - " '- Summarize the conversation about Red Dead Redemption 2 from '\n", - " 'entries 3 to 10, noting key points about the game and missions '\n", - " 'discussed.\\n'\n", - " '- Combine entries 11 and 12 into a summary about transitioning to '\n", - " 'the game Helldivers 2, including initial thoughts.\\n'\n", - " '- Summarize the specific discussion about Helldivers 2 gameplay '\n", - " 'and strategy from entries 13 to 18.\\n'\n", - " '- Summarize entries 19 and 20 discussing the user having to go to '\n", - " 'work and dealing with Nvidia driver issues.\\n'\n", - " '- Combine entries 21 and 22 to summarize the Nvidia and Linux '\n", - " 'driver compatibility discussion.\\n'\n", - " '- Combine entries 23 and 24 to a summary of the farewell.',\n", + " '- We can consolidate the initial greetings and mention of Red '\n", + " 'Dead Redemption 2 into a summary.\\n'\n", + " '- The detailed discussion about RDR2 and Helldivers 2 can be '\n", + " 'summarized while retaining key elements of the conversation.\\n'\n", + " \"- The user's brief mention of work and technical issues can be \"\n", + " 'summarized into one entry to capture the issue without losing '\n", + " 'context.\\n'\n", + " '- Farewells can be combined into a single entry.\\n'\n", + " '\\n'\n", + " \"Here's how we can compact the history: \\n\"\n", + " '\\n'\n", + " '1. Summarize the greeting and initial conversation about Red Dead '\n", + " 'Redemption 2.\\n'\n", + " '2. Summarize the detailed discussion on RDR2, focusing on the '\n", + " \"user's favorite moments and questions from the assistant.\\n\"\n", + " '3. Summarize the conversation about Helldivers 2, highlighting '\n", + " 'user preferences and challenges faced in gameplay.\\n'\n", + " \"4. Combine the entries about the user's Nvidia driver issue and \"\n", + " 'the farewell into two concise entries.',\n", " 'role': 'assistant'}\n", "End CoT generation\n", - "7.267635345458984\n", - "7.2676897048950195\n", + "6.3223512172698975\n", + "6.322365999221802\n", "Starting chatml generation\n", "End chatml generation\n", - "19.629928588867188\n", + "26.040874004364014\n", "{'content': '[\\n'\n", " ' {\\n'\n", " ' \"role\": \"system\",\\n'\n", - " ' \"content\": \"User greets the assistant and mentions finishing '\n", - " 'Red Dead Redemption 2, praising the final mission. The assistant '\n", - " \"responds enthusiastically, discussing the game's ending and key \"\n", - " 'missions.\"\\n'\n", + " ' \"name\": \"summary\",\\n'\n", + " ' \"content\": \"The user greeted the assistant and shared their '\n", + " 'recent completion of Red Dead Redemption 2, expressing excitement '\n", + " 'about the game\\'s final mission.\"\\n'\n", + " ' },\\n'\n", + " ' {\\n'\n", + " ' \"role\": \"system\",\\n'\n", + " ' \"name\": \"summary\",\\n'\n", + " ' \"content\": \"The user and the assistant discussed favorite '\n", + " \"moments from Red Dead Redemption 2, focusing on the 'Blood Feuds, \"\n", + " \"Ancient and Modern' mission and Arthur's character development. \"\n", + " 'The user expressed a preference for Arthur over Dutch and '\n", + " 'mentioned completing all side quests, including the widow and '\n", + " 'bounty missions.\"\\n'\n", " ' },\\n'\n", " ' {\\n'\n", " ' \"role\": \"system\",\\n'\n", - " ' \"content\": \"The conversation shifts to Helldivers 2, with the '\n", - " 'user sharing their favorite build and the assistant suggesting '\n", - " 'strategies. They discuss gameplay dynamics and the challenges of '\n", - " 'specific missions.\"\\n'\n", + " ' \"name\": \"summary\",\\n'\n", + " ' \"content\": \"The conversation shifted to Helldivers 2, where '\n", + " 'the user described their favorite build and gameplay strategy. '\n", + " 'They discussed the challenges of facing the Charger enemy and the '\n", + " 'run-and-gun approach they use with their squad.\"\\n'\n", " ' },\\n'\n", " ' {\\n'\n", " ' \"role\": \"system\",\\n'\n", - " ' \"content\": \"User mentions having to go to work soon and '\n", - " 'dealing with an Nvidia driver issue. The assistant offers '\n", - " 'troubleshooting advice for Nvidia drivers on Linux and wishes the '\n", - " 'user good luck with work.\"\\n'\n", + " ' \"name\": \"summary\",\\n'\n", + " ' \"content\": \"The user mentioned having to go to work soon and '\n", + " 'experiencing issues with Nvidia drivers on Linux. The assistant '\n", + " 'provided suggestions for resolving driver compatibility issues.\"\\n'\n", " ' },\\n'\n", " ' {\\n'\n", " ' \"role\": \"system\",\\n'\n", - " ' \"content\": \"User acknowledges the advice and says goodbye. '\n", - " 'The assistant wishes them well.\"\\n'\n", + " ' \"name\": \"summary\",\\n'\n", + " ' \"content\": \"The user said goodbye, indicating they would see '\n", + " 'the assistant later.\"\\n'\n", " ' }\\n'\n", " ']',\n", " 'role': 'assistant'}\n" @@ -676,7 +684,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -690,7 +698,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.12.1" } }, "nbformat": 4, From d2759b3780cd7c3c96424cddfbe81bf536d6c851 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Tue, 8 Oct 2024 21:08:39 +0300 Subject: [PATCH 086/113] Feat(agents-api): Replace Retry Policies with Temporal Interceptors & Add more non-retryable errors (#612) > [!IMPORTANT] > Replaces retry policies with Temporal interceptors to handle non-retryable errors and updates worker to use these interceptors. > > - **Interceptors**: > - Add `CustomActivityInterceptor` and `CustomWorkflowInterceptor` in `interceptors.py` to handle non-retryable errors by raising `ApplicationError`. > - `CustomInterceptor` combines both activity and workflow interceptors. > - **Non-Retryable Errors**: > - Define `NON_RETRYABLE_ERROR_TYPES` and `is_non_retryable_error()` in `exceptions/tasks.py` to identify non-retryable errors. > - **Retry Policy**: > - Set `DEFAULT_RETRY_POLICY` to `None` in `retry_policies.py` due to conflict with interceptors. > - **Worker**: > - Update `create_worker()` in `worker.py` to use `CustomInterceptor`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 7a50b72a4677195f7d73fc444fa56fd6472afa4b. It will automatically update as commits are pushed. --------- Co-authored-by: HamadaSalhab --- .../agents_api/common/exceptions/tasks.py | 107 ++++++++++++++++++ agents-api/agents_api/common/interceptors.py | 92 +++++++++++++++ .../agents_api/common/retry_policies.py | 73 ++---------- agents-api/agents_api/worker/worker.py | 2 + 4 files changed, 213 insertions(+), 61 deletions(-) create mode 100644 agents-api/agents_api/common/exceptions/tasks.py create mode 100644 agents-api/agents_api/common/interceptors.py diff --git a/agents-api/agents_api/common/exceptions/tasks.py b/agents-api/agents_api/common/exceptions/tasks.py new file mode 100644 index 000000000..6e1df0734 --- /dev/null +++ b/agents-api/agents_api/common/exceptions/tasks.py @@ -0,0 +1,107 @@ +""" +This module defines non-retryable error types and provides a function to check +if a given error is non-retryable. These are used in conjunction with custom +Temporal interceptors to prevent unnecessary retries of certain error types. +""" + +import asyncio + +import beartype +import beartype.roar +import box +import box.exceptions +import fastapi +import httpx +import jinja2 +import jsonschema.exceptions +import pydantic +import requests +import temporalio.exceptions + +# List of error types that should not be retried +NON_RETRYABLE_ERROR_TYPES = [ + # Temporal-specific errors + temporalio.exceptions.WorkflowAlreadyStartedError, + temporalio.exceptions.TerminatedError, + temporalio.exceptions.CancelledError, + # + # Built-in Python exceptions + TypeError, + AssertionError, + SyntaxError, + ValueError, + ZeroDivisionError, + IndexError, + AttributeError, + LookupError, + BufferError, + ArithmeticError, + KeyError, + NameError, + NotImplementedError, + RecursionError, + RuntimeError, + StopIteration, + StopAsyncIteration, + IndentationError, + TabError, + # + # Unicode-related errors + UnicodeError, + UnicodeEncodeError, + UnicodeDecodeError, + UnicodeTranslateError, + # + # HTTP and API-related errors + fastapi.exceptions.HTTPException, + fastapi.exceptions.RequestValidationError, + httpx.RequestError, + httpx.HTTPStatusError, + # + # Asynchronous programming errors + asyncio.CancelledError, + asyncio.InvalidStateError, + GeneratorExit, + # + # Third-party library exceptions + jinja2.exceptions.TemplateSyntaxError, + jinja2.exceptions.TemplateNotFound, + jsonschema.exceptions.ValidationError, + pydantic.ValidationError, + requests.exceptions.InvalidURL, + requests.exceptions.MissingSchema, + # Box exceptions + box.exceptions.BoxKeyError, + box.exceptions.BoxTypeError, + box.exceptions.BoxValueError, + # Beartype exceptions + beartype.roar.BeartypeException, + beartype.roar.BeartypeDecorException, + beartype.roar.BeartypeDecorHintException, + beartype.roar.BeartypeDecorHintNonpepException, + beartype.roar.BeartypeDecorHintPepException, + beartype.roar.BeartypeDecorHintPepUnsupportedException, + beartype.roar.BeartypeDecorHintTypeException, + beartype.roar.BeartypeDecorParamException, + beartype.roar.BeartypeDecorParamNameException, + beartype.roar.BeartypeCallHintParamViolation, + beartype.roar.BeartypeCallHintReturnViolation, + beartype.roar.BeartypeDecorHintParamDefaultViolation, + beartype.roar.BeartypeDoorHintViolation, +] + + +def is_non_retryable_error(error: Exception) -> bool: + """ + Determines if the given error is non-retryable. + + This function checks if the error is an instance of any of the error types + defined in NON_RETRYABLE_ERROR_TYPES. + + Args: + error (Exception): The error to check. + + Returns: + bool: True if the error is non-retryable, False otherwise. + """ + return isinstance(error, tuple(NON_RETRYABLE_ERROR_TYPES)) diff --git a/agents-api/agents_api/common/interceptors.py b/agents-api/agents_api/common/interceptors.py new file mode 100644 index 000000000..2fb077c45 --- /dev/null +++ b/agents-api/agents_api/common/interceptors.py @@ -0,0 +1,92 @@ +""" +This module defines custom interceptors for Temporal activities and workflows. +The main purpose of these interceptors is to handle errors and prevent retrying +certain types of errors that are known to be non-retryable. +""" + +from typing import Optional, Type + +from temporalio.exceptions import ApplicationError +from temporalio.worker import ( + ActivityInboundInterceptor, + ExecuteActivityInput, + ExecuteWorkflowInput, + Interceptor, + WorkflowInboundInterceptor, + WorkflowInterceptorClassInput, +) + +from .exceptions.tasks import is_non_retryable_error + + +class CustomActivityInterceptor(ActivityInboundInterceptor): + """ + Custom interceptor for Temporal activities. + + This interceptor catches exceptions during activity execution and + raises them as non-retryable ApplicationErrors if they are identified + as non-retryable errors. + """ + + async def execute_activity(self, input: ExecuteActivityInput): + try: + return await super().execute_activity(input) + except Exception as e: + if is_non_retryable_error(e): + raise ApplicationError( + str(e), + type=type(e).__name__, + non_retryable=True, + ) + raise + + +class CustomWorkflowInterceptor(WorkflowInboundInterceptor): + """ + Custom interceptor for Temporal workflows. + + This interceptor catches exceptions during workflow execution and + raises them as non-retryable ApplicationErrors if they are identified + as non-retryable errors. + """ + + async def execute_workflow(self, input: ExecuteWorkflowInput): + try: + return await super().execute_workflow(input) + except Exception as e: + if is_non_retryable_error(e): + raise ApplicationError( + str(e), + type=type(e).__name__, + non_retryable=True, + ) + raise + + +class CustomInterceptor(Interceptor): + """ + Custom Interceptor that combines both activity and workflow interceptors. + + This class is responsible for creating and returning the custom + interceptors for both activities and workflows. + """ + + def intercept_activity( + self, next: ActivityInboundInterceptor + ) -> ActivityInboundInterceptor: + """ + Creates and returns a CustomActivityInterceptor. + + This method is called by Temporal to intercept activity executions. + """ + return CustomActivityInterceptor(super().intercept_activity(next)) + + def workflow_interceptor_class( + self, input: WorkflowInterceptorClassInput + ) -> Optional[Type[WorkflowInboundInterceptor]]: + """ + Returns the CustomWorkflowInterceptor class. + + This method is called by Temporal to get the workflow interceptor class. + """ + return CustomWorkflowInterceptor diff --git a/agents-api/agents_api/common/retry_policies.py b/agents-api/agents_api/common/retry_policies.py index fc343553c..c6c1c362c 100644 --- a/agents-api/agents_api/common/retry_policies.py +++ b/agents-api/agents_api/common/retry_policies.py @@ -1,63 +1,14 @@ -from datetime import timedelta +# from datetime import timedelta -from temporalio.common import RetryPolicy +# from temporalio.common import RetryPolicy -DEFAULT_RETRY_POLICY = RetryPolicy( - initial_interval=timedelta(seconds=1), - backoff_coefficient=2, - maximum_attempts=25, - maximum_interval=timedelta(seconds=300), - non_retryable_error_types=[ - # Temporal-specific errors - "WorkflowExecutionAlreadyStarted", - "temporalio.exceptions.TerminalFailure", - "temporalio.exceptions.CanceledError", - # - # Built-in Python exceptions - "TypeError", - "AssertionError", - "SyntaxError", - "ValueError", - "ZeroDivisionError", - "IndexError", - "AttributeError", - "LookupError", - "BufferError", - "ArithmeticError", - "KeyError", - "NameError", - "NotImplementedError", - "RecursionError", - "RuntimeError", - "StopIteration", - "StopAsyncIteration", - "IndentationError", - "TabError", - # - # Unicode-related errors - "UnicodeError", - "UnicodeEncodeError", - "UnicodeDecodeError", - "UnicodeTranslateError", - # - # HTTP and API-related errors - "HTTPException", - "fastapi.exceptions.HTTPException", - "fastapi.exceptions.RequestValidationError", - "httpx.RequestError", - "httpx.HTTPStatusError", - # - # Asynchronous programming errors - "asyncio.CancelledError", - "asyncio.InvalidStateError", - "GeneratorExit", - # - # Third-party library exceptions - "jinja2.exceptions.TemplateSyntaxError", - "jinja2.exceptions.TemplateNotFound", - "jsonschema.exceptions.ValidationError", - "pydantic.ValidationError", - "requests.exceptions.InvalidURL", - "requests.exceptions.MissingSchema", - ], -) +# DEFAULT_RETRY_POLICY = RetryPolicy( +# initial_interval=timedelta(seconds=1), +# backoff_coefficient=2, +# maximum_attempts=25, +# maximum_interval=timedelta(seconds=300), +# ) + +# FIXME: Adding both interceptors and retry policy (even with `non_retryable_errors` not set) +# is causing the errors to be retried. We need to find a workaround for this. +DEFAULT_RETRY_POLICY = None diff --git a/agents-api/agents_api/worker/worker.py b/agents-api/agents_api/worker/worker.py index dc02cb4a7..54f2bcdd5 100644 --- a/agents-api/agents_api/worker/worker.py +++ b/agents-api/agents_api/worker/worker.py @@ -22,6 +22,7 @@ def create_worker(client: Client) -> Any: from ..activities.mem_rating import mem_rating from ..activities.summarization import summarization from ..activities.truncation import truncation + from ..common.interceptors import CustomInterceptor from ..env import ( temporal_task_queue, ) @@ -61,6 +62,7 @@ def create_worker(client: Client) -> Any: summarization, truncation, ], + interceptors=[CustomInterceptor()], ) return worker From 7cfa193e4b34dfa160021a1edce2f45d55a819d1 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Tue, 8 Oct 2024 18:45:57 -0400 Subject: [PATCH 087/113] doc: Copy README.md to docs/README (#619) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Replace `docs/README.md` with a symbolic link to `README.md` for consistency and reduced redundancy. > > - **Documentation**: > - Replace `docs/README.md` with a symbolic link to `README.md` to ensure consistency and reduce redundancy. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 00cba9fcec1d101fde9dd603ba2bfe46ff28b242. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- README.md | 30 +- docs/README.md | 1146 ++++++++++++++++++++++++++++++----------------- docs/SUMMARY.md | 1 - 3 files changed, 757 insertions(+), 420 deletions(-) diff --git a/README.md b/README.md index b636f4718..d57877707 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -English | [中文翻译](/README-CN.md) | [日本語翻訳](/README-JP.md) +English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md)
julep @@ -57,7 +57,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 > [!NOTE] > Get your API key [here](https://dashboard-dev.julep.ai). -> +> > While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key. ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) @@ -113,9 +113,9 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 Julep is a platform for creating AI agents that remember past interactions and can perform complex tasks. It offers long-term memory and manages multi-step processes. -Julep enables the creation of multi-step tasks incorporating decision-making, loops, parallel processing, and integration with numerous external tools and APIs. +Julep enables the creation of multi-step tasks incorporating decision-making, loops, parallel processing, and integration with numerous external tools and APIs. -While many AI applications are limited to simple, linear chains of prompts and API calls with minimal branching, Julep is built to handle more complex scenarios. +While many AI applications are limited to simple, linear chains of prompts and API calls with minimal branching, Julep is built to handle more complex scenarios. It supports: - Intricate, multi-step processes @@ -201,7 +201,7 @@ main: - prompt: - role: system content: > - You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. + You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. The summary should be well-structured, informative, and highlight key findings and insights: {{_.results}} unwrap: true @@ -217,7 +217,7 @@ main: > [!TIP] > Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. -> +> > In this example, Julep will automatically manage parallel executions, retry failed steps, resend API requests, and keep the tasks running reliably until completion. ## Key Features @@ -283,13 +283,13 @@ pip install julep > [!NOTE] > Get your API key [here](https://dashboard-dev.julep.ai). -> +> > While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key. > [!TIP] -> 💻 Are you a _show me the code!™_ kind of person? We have created a ton of cookbooks for you to get started with. **Check out the [cookbooks](/cookbooks)** to browse through examples. -> -> 💡 There's also lots of ideas that you can build on top of Julep. **Check out the [list of ideas](/cookbooks/IDEAS.md)** to get some inspiration. +> 💻 Are you a _show me the code!™_ kind of person? We have created a ton of cookbooks for you to get started with. **Check out the [cookbooks](https://github.com/julep-ai/julep/tree/dev/cookbooks)** to browse through examples. +> +> 💡 There's also lots of ideas that you can build on top of Julep. **Check out the [list of ideas](https://github.com/julep-ai/julep/tree/dev/cookbooks/IDEAS.md)** to get some inspiration. ## Python Quick Start 🐍 @@ -413,7 +413,7 @@ while (message := input("Enter a message: ")) != "quit": ) print(response) -``` +``` > [!TIP] > You can find the full python example [here](example.py). @@ -581,7 +581,7 @@ Julep is made up of the following components: ### Mental Model
- +
Think of Julep as a platform that combines both client-side and server-side components to help you build advanced AI agents. Here's how to visualize it: @@ -620,7 +620,7 @@ graph TD classDef client fill:#9ff,stroke:#333,stroke-width:1px; class User client; - + classDef core fill:#f9f,stroke:#333,stroke-width:2px; class Agent,Tasks,Session core; ``` @@ -633,7 +633,7 @@ graph TD - **Documents**: Text or data objects associated with agents or users, vectorized and stored for semantic search and retrieval. - **Executions**: Instances of tasks that have been initiated with specific inputs, with their own lifecycle and state machine. -For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](/docs/julep-concepts.md). +For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md). ## Understanding Tasks @@ -945,4 +945,4 @@ Explore our comprehensive API documentation to learn more about agents, tasks, a - [Agents API](https://api.julep.ai/api/docs#tag/agents) - [Tasks API](https://api.julep.ai/api/docs#tag/tasks) -- [Executions API](https://api.julep.ai/api/docs#tag/executions) \ No newline at end of file +- [Executions API](https://api.julep.ai/api/docs#tag/executions) diff --git a/docs/README.md b/docs/README.md index 6b030fc50..d57877707 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,267 +1,314 @@ ---- -description: Introducing Julep -layout: - title: - visible: true - description: - visible: false - tableOfContents: - visible: true - outline: - visible: false - pagination: - visible: true ---- +English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) + +
+ julep +
+ +

+
+ Explore Docs + · + Discord + · + 𝕏 + · + LinkedIn +

+ + +

+ NPM Version +   + PyPI - Version +   + Docker Image Version +   + GitHub License +

***** -> ### This docs site is currently under construction although this github README below should suffice for now. -![](https://i.giphy.com/vR1dPIYzQmkRzLZk2w.webp) -***** - -## Introduction +> [!NOTE] +> 👨‍💻 Here for the devfest.ai event? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below. -Julep is an open-source platform for creating persistent AI agents with customizable workflows. It provides tools to develop, manage, and deploy AI-driven applications, focusing on flexibility and ease of use. +
+🌟 Contributors and DevFest.AI Participants (Click to expand) -With Julep, you can: -- Quickly develop AI agents that retain context and state across interactions -- Design and execute sophisticated workflows tailored to your AI agents -- Seamlessly integrate various tools and APIs into your AI workflows -- Effortlessly manage persistent sessions and user interactions +## 🌟 Call for Contributors! -Whether you're developing a chatbot, automating tasks, or building a complex AI assistant, Julep provides the flexibility and features you need to turn your ideas into reality swiftly and efficiently. +We're excited to welcome new contributors to the Julep project! We've created several "good first issues" to help you get started. Here's how you can contribute: - +1. Check out our [CONTRIBUTING.md](CONTRIBUTING.md) file for guidelines on how to contribute. +2. Browse our [good first issues](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to find a task that interests you. +3. If you have any questions or need help, don't hesitate to reach out on our [Discord](https://discord.com/invite/JTSBGRZrzj) channel. -
-Here's a quick python example: +Your contributions, big or small, are valuable to us. Let's build something amazing together! 🚀 - +### 🎉 DevFest.AI October 2024 -

-from julep import Julep, AsyncJulep
+Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓️
 
-# 🔑 Initialize the Julep client
-#     Or alternatively, use AsyncJulep for async operations
-client = Julep(api_key="your_api_key")
+- Contribute to Julep during this event and get a chance to win awesome Julep merch and swag! 🎁
+- Join developers from around the world in contributing to AI repositories and participating in amazing events.
+- A big thank you to DevFest.AI for organizing this fantastic initiative!
 
-##################
-## 🤖 Agent 🤖 ##
-##################
+> [!TIP]
+> Ready to join the fun? **[Tweet that you are participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️
 
-# Create a research agent
-agent = client.agents.create(
-    name="Research Agent",
-    model="claude-3.5-sonnet",
-    about="You are a research agent designed to handle research inquiries.",
-)
+> [!NOTE]
+> Get your API key [here](https://dashboard-dev.julep.ai).
+>
+> While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key.
 
-# 🔍 Add a web search tool to the agent
-client.agents.tools.create(
-    agent_id=agent.id,
-    name="web_search",  # Should be python valid variable name
-    description="Use this tool to research inquiries.",
-    integration={
-        "provider": "brave",
-        "method": "search",
-        "setup": {
-            "api_key": "your_brave_api_key",
-        },
-    },
-)
+![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
 
-#################
-## 💬 Chat 💬 ##
-#################
+
-# Start an interactive chat session with the agent -session = client.sessions.create( - agent_id=agent.id, - context_overflow="adaptive", # 🧠 Julep will dynamically compute the context window if needed -) + + +
+

📖 Table of Contents

+ +- [Introduction](#introduction) +- [Quick Example](#quick-example) +- [Key Features](#key-features) +- [Why Julep vs. LangChain?](#why-julep-vs-langchain) + - [Different Use Cases](#different-use-cases) + - [Different Form Factor](#different-form-factor) + - [In Summary](#in-summary) +- [Installation](#installation) +- [Python Quick Start 🐍](#python-quick-start-) + - [Step 1: Create an Agent](#step-1-create-an-agent) + - [Step 2: Create a Task that generates a story and comic strip](#step-2-create-a-task-that-generates-a-story-and-comic-strip) + - [Step 3: Execute the Task](#step-3-execute-the-task) + - [Step 4: Chat with the Agent](#step-4-chat-with-the-agent) +- [Node.js Quick Start 🟩](#nodejs-quick-start-) + - [Step 1: Create an Agent](#step-1-create-an-agent-1) + - [Step 2: Create a Task that generates a story and comic strip](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) + - [Step 3: Execute the Task](#step-3-execute-the-task-1) + - [Step 4: Chat with the Agent](#step-4-chat-with-the-agent-1) +- [Components](#components) + - [Mental Model](#mental-model) +- [Concepts](#concepts) +- [Understanding Tasks](#understanding-tasks) + - [Types of Workflow Steps](#types-of-workflow-steps) +- [Advanced Features](#advanced-features) + - [Adding Tools to Agents](#adding-tools-to-agents) + - [Managing Sessions and Users](#managing-sessions-and-users) + - [Document Integration and Search](#document-integration-and-search) +- [Integrations](#integrations) + - [Brave Search](#brave-search) + - [BrowserBase](#browserbase) + - [Email](#email) + - [Spider](#spider) + - [Weather](#weather) + - [Wikipedia](#wikipedia) +- [SDK Reference](#sdk-reference) +- [API Reference](#api-reference) -# 🔄 Chat loop -while (user_input := input("You: ")) != "exit": - response = client.sessions.chat( - session_id=session.id, - message=user_input, - ) +
+ - print("Agent: ", response.choices[0].message.content) +## Introduction +Julep is a platform for creating AI agents that remember past interactions and can perform complex tasks. It offers long-term memory and manages multi-step processes. -################# -## 📋 Task 📋 ## -################# +Julep enables the creation of multi-step tasks incorporating decision-making, loops, parallel processing, and integration with numerous external tools and APIs. -# Create a recurring research task for the agent -task = client.tasks.create( - agent_id=agent.id, - name="Research Task", - description="Research the given topic every 24 hours.", - # - # 🛠️ Task specific tools - tools=[ - { - "name": "send_email", - "description": "Send an email to the user with the results.", - "api_call": { - "method": "post", - "url": "https://api.sendgrid.com/v3/mail/send", - "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"}, - }, - } - ], - # - # 🔢 Task main steps - main=[ - # - # Step 1: Research the topic - { - # `_` (underscore) variable refers to the previous step's output - # Here, it points to the topic input from the user - "prompt": "Look up topic '{{_.topic}}' and summarize the results.", - "tools": [{"ref": {"name": "web_search"}}], # 🔍 Use the web search tool from the agent - "unwrap": True, - }, - # - # Step 2: Send email with research results - { - "tool": "send_email", - "arguments": { - "subject": "Research Results", - "body": "'Here are the research results for today: ' + _.content", - "to": "inputs[0].email", # Reference the email from the user's input - }, - }, - # - # Step 3: Wait for 24 hours before repeating - {"sleep": "24 * 60 * 60"}, - ], -) +While many AI applications are limited to simple, linear chains of prompts and API calls with minimal branching, Julep is built to handle more complex scenarios. -# 🚀 Start the recurring task -client.executions.create(task_id=task.id, input={"topic": "Python"}) +It supports: +- Intricate, multi-step processes +- Dynamic decision-making +- Parallel execution -# 🔁 This will run the task every 24 hours, -# research for the topic "Python", and -# send the results to the user's email -
-
+> [!TIP] +> Imagine you want to build an AI agent that can do more than just answer simple questions—it needs to handle complex tasks, remember past interactions, and maybe even use other tools or APIs. That's where Julep comes in. + +## Quick Example + +Imagine a Research AI agent that can do the following: + 1. Take a topic, + 2. Come up with 100 search queries for that topic, + 3. Perform those web searches in parallel, + 4. Summarize the results, + 5. Send the summary to Discord + +In Julep, this would be a single task under 80 lines of code and run fully managed all on its own. All of the steps are executed on Julep's own servers and you don't need to lift a finger. Here's a working example: + +```yaml +name: Research Agent + +# Optional: Define the input schema for the task +input_schema: + type: object + properties: + topic: + type: string + description: The main topic to research + +# Define the tools that the agent can use +tools: +- name: web_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +- name: discord_webhook + type: api_call + api_call: + url: "YOUR_DISCORD_WEBHOOK_URL" + method: POST + headers: + Content-Type: application/json + +# Special variables: +# - inputs: for accessing the input to the task +# - outputs: for accessing the output of previous steps +# - _: for accessing the output of the previous step + +# Define the main workflow +main: +- prompt: + - role: system + content: >- + You are a research assistant. + Generate 100 diverse search queries related to the topic: + {{inputs[0].topic}} + + Write one query per line. + unwrap: true + +# Evaluate the search queries using a simple python expression +- evaluate: + search_queries: "_.split('\n')" + +# Run the web search in parallel for each query +- over: "_.search_queries" + map: + tool: web_search + arguments: + query: "_" + parallelism: 100 + +# Collect the results from the web search +- evaluate: + results: "'\n'.join([item.result for item in _])" + +# Summarize the results +- prompt: + - role: system + content: > + You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. + The summary should be well-structured, informative, and highlight key findings and insights: + {{_.results}} + unwrap: true + +# Send the summary to Discord +- tool: discord_webhook + arguments: + content: > + **Research Summary for {{inputs[0].topic}}** + + {{_}} +``` +> [!TIP] +> Julep is really useful when you want to build AI agents that can maintain context and state over long-term interactions. It's great for designing complex, multi-step workflows and integrating various tools and APIs directly into your agent's processes. +> +> In this example, Julep will automatically manage parallel executions, retry failed steps, resend API requests, and keep the tasks running reliably until completion. -## Features +## Key Features -Julep simplifies the process of building persistent AI agents with customizable workflows. Key features include: +1. 🧠 **Persistent AI Agents**: Remember context and information over long-term interactions. +2. 💾 **Stateful Sessions**: Keep track of past interactions for personalized responses. +3. 🔄 **Multi-Step Tasks**: Build complex, multi-step processes with loops and decision-making. +4. ⏳ **Task Management**: Handle long-running tasks that can run indefinitely. +5. 🛠️ **Built-in Tools**: Use built-in tools and external APIs in your tasks. +6. 🔧 **Self-Healing**: Julep will automatically retry failed steps, resend messages, and generally keep your tasks running smoothly. +7. 📚 **RAG**: Use Julep's document store to build a system for retrieving and using your own data. -- **Persistent AI Agents**: Create and manage AI agents that maintain context across interactions. -- **Customizable Workflows**: Design complex, multi-step AI workflows using Tasks. -- **Tool Integration**: Seamlessly integrate various tools and APIs into your AI workflows. -- **Document Management**: Efficiently manage and search through documents for your agents. -- **Session Management**: Handle persistent sessions for continuous interactions. -- **Flexible Execution**: Support for parallel processing, conditional logic, and error handling in workflows. +Julep is ideal for applications that require AI use cases beyond simple prompt-response models. -## Installation +## Why Julep vs. LangChain? -To get started with Julep, install it using [npm](https://www.npmjs.com/package/@julep/sdk) or [pip](https://pypi.org/project/julep/): +### Different Use Cases -```bash -npm install @julep/sdk -``` +Think of LangChain and Julep as tools with different focuses within the AI development stack. -or +LangChain is great for creating sequences of prompts and managing interactions with AI models. It has a large ecosystem with lots of pre-built integrations, which makes it convenient if you want to get something up and running quickly. LangChain fits well with simple use cases that involve a linear chain of prompts and API calls. -```bash -pip install julep -``` +Julep, on the other hand, is more about building persistent AI agents that can remember things over long-term interactions. It shines when you need complex tasks that involve multiple steps, decision-making, and integration with various tools or APIs directly within the agent's process. It's designed from the ground up to manage persistent sessions and complex tasks. -> [!TIP] -> ~~Get your API key [here](https://app.julep.ai/api-keys).~~ -> -> While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key. +Use Julep if you imagine building a complex AI assistant that needs to: -## Quick Start Guide +- Keep track of user interactions over days or weeks. +- Perform scheduled tasks, like sending daily summaries or monitoring data sources. +- Make decisions based on prior interactions or stored data. +- Interact with multiple external services as part of its task. -### Step 1: Import Julep +Then Julep provides the infrastructure to support all that without you having to build it from scratch. -First, import the Julep SDK into your project: +### Different Form Factor -```javascript -const Julep = require('@julep/sdk'); -``` +Julep is a **platform** that includes a language for describing tasks, a server for running those tasks, and an SDK for interacting with the platform. To build something with Julep, you write a description of the task in `YAML`, and then run the task in the cloud. -or +Julep is built for heavy-lifting, multi-step, and long-running tasks and there's no limit to how complex the task can be. -```python -from julep import AsyncJulep -``` +LangChain is a **library** that includes a few tools and a framework for building linear chains of prompts and tools. To build something with LangChain, you typically write Python code that configures and runs the model chains you want to use. -### Step 2: Initialize the Agent +LangChain might be sufficient and quicker to implement for simple use cases that involve a linear chain of prompts and API calls. -Create a new agent with basic settings: +### In Summary -```javascript -const julep = new Julep({ apiKey: 'your-api-key' }); +Use LangChain when you need to manage AI model interactions and prompt sequences in a stateless or short-term context. -const agent = await julep.agents.create({ - name: 'ResearchAssistant', - model: 'gpt-4-turbo', - about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", -}); -``` +Choose Julep when you need a robust framework for stateful agents with advanced task capabilities, persistent sessions, and complex task management. -or +## Installation -```python -client = AsyncJulep(api_key="your_api_key") +To get started with Julep, install it using [npm](https://www.npmjs.com/package/@julep/sdk) or [pip](https://pypi.org/project/julep/): -agent = await client.agents.create( - name="Storytelling Agent", - model="gpt-4-turbo", - about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", -) +```bash +npm install @julep/sdk ``` -### Step 3: Chat with the Agent - -Start an interactive chat session with the agent: - -```javascript -const session = await julep.sessions.create({ - agentId: agent.id, -}); - -// Send messages to the agent -const response = await julep.sessions.chat({ - sessionId: session.id, - message: 'Hello, can you tell me a story?', -}); +or -console.log(response); +```bash +pip install julep ``` -or +> [!NOTE] +> Get your API key [here](https://dashboard-dev.julep.ai). +> +> While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key. -```python -session = await client.sessions.create(agent_id=agent.id) +> [!TIP] +> 💻 Are you a _show me the code!™_ kind of person? We have created a ton of cookbooks for you to get started with. **Check out the [cookbooks](https://github.com/julep-ai/julep/tree/dev/cookbooks)** to browse through examples. +> +> 💡 There's also lots of ideas that you can build on top of Julep. **Check out the [list of ideas](https://github.com/julep-ai/julep/tree/dev/cookbooks/IDEAS.md)** to get some inspiration. -# Send messages to the agent -response = await client.sessions.chat( - session_id=session.id, - message="Hello, can you tell me a story?", -) +## Python Quick Start 🐍 -print(response) -``` +### Step 1: Create an Agent +```python +import yaml +from julep import Julep # or AsyncJulep -### Step 4: Create a multi-step Task +client = Julep(api_key="your_julep_api_key") -Let's define a multi-step task to create a story and generate a paneled comic strip based on an input idea: +agent = client.agents.create( + name="Storytelling Agent", + model="gpt-4o", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +) -```python # 🛠️ Add an image generation tool (DALL·E) to the agent -await client.agents.tools.create( +client.agents.tools.create( agent_id=agent.id, name="image_generator", description="Use this tool to generate images based on descriptions.", @@ -269,182 +316,323 @@ await client.agents.tools.create( "provider": "dalle", "method": "generate_image", "setup": { - "api_key": "your_dalle_api_key", + "api_key": "your_openai_api_key", }, }, ) +``` +### Step 2: Create a Task that generates a story and comic strip + +Let's define a multi-step task to create a story and generate a paneled comic strip based on an input idea: + +```python # 📋 Task # Create a task that takes an idea and creates a story and a 4-panel comic strip -task = await client.tasks.create( +task_yaml = """ +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].strip() + panels: re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: "[output.image.url for output in outputs[2]]" +""" + +task = client.tasks.create( agent_id=agent.id, - name="Story and Comic Creator", - description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.", - main=[ - # Step 1: Generate a story and outline into 4 panels - { - "prompt": [ - { - "role": "system", - "content": "You are {{agent.name}}. {{agent.about}}" - }, - { - "role": "user", - "content": ( - "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. " - "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story." - ), - }, - ], - "unwrap": True, - }, - # Step 2: Extract the panel descriptions and story - { - "evaluate": { - "story": "_.split('1. ')[0].strip()", - "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", - } - }, - # Step 3: Generate images for each panel using the image generator tool - { - "foreach": { - "in": "_.panels", - "do": { - "tool": "image_generator", - "arguments": { - "description": "_", - }, - }, - }, - }, - # Step 4: Generate a catchy title for the story - { - "prompt": [ - { - "role": "system", - "content": "You are {{agent.name}}. {{agent.about}}" - }, - { - "role": "user", - "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}", - }, - ], - "unwrap": True, - }, - # Step 5: Return the story, the generated images, and the title - { - "return": { - "title": "outputs[3]", - "story": "outputs[1].story", - "comic_panels": "[output.image.url for output in outputs[2]]", - } - }, - ], + **yaml.safe_load(task_yaml) ) ``` -> [!TIP] -> node.js version of this is similar. - -### Step 5: Execute the Task +### Step 3: Execute the Task ```python # 🚀 Execute the task with an input idea -execution = await client.executions.create( +execution = client.executions.create( task_id=task.id, input={"idea": "A cat who learns to fly"} ) # 🎉 Watch as the story and comic panels are generated -await client.executions.stream(execution_id=execution.id) +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) + +# 📦 Once the execution is finished, retrieve the results +result = client.executions.get(execution_id=execution.id) ``` -This example demonstrates how to create an agent with a custom tool, define a complex task with multiple steps, and execute it to generate a creative output. +### Step 4: Chat with the Agent + +Start an interactive chat session with the agent: + +```python +session = client.sessions.create(agent_id=agent.id) + +# 💬 Send messages to the agent +while (message := input("Enter a message: ")) != "quit": + response = client.sessions.chat( + session_id=session.id, + message=message, + ) - + print(response) +``` > [!TIP] -> You can find another node.js example [here](example.ts) or python example [here](example.py). +> You can find the full python example [here](example.py). -## Concepts -Julep is built on several key technical components that work together to create powerful AI workflows: +## Node.js Quick Start 🟩 -### Agents -AI-powered entities backed by large language models (LLMs) that execute tasks and interact with users. Agents are the core functional units of Julep. +### Step 1: Create an Agent -```mermaid -graph TD - Agent[Agent] --> LLM[Large Language Model] - Agent --> Tasks[Tasks] - Agent --> Users[Users] - Tasks --> Tools[Tools] +```javascript +import { Julep } from '@julep/sdk'; +import yaml from 'js-yaml'; + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +async function createAgent() { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", + }); + + // 🛠️ Add an image generation tool (DALL·E) to the agent + await client.agents.tools.create(agent.id, { + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", + integration: { + provider: "dalle", + method: "generate_image", + setup: { + api_key: "your_openai_api_key", + }, + }, + }); + + return agent; +} ``` -### Users -Entities that interact with agents. Users can be associated with sessions and have their own metadata, allowing for personalized interactions. +### Step 2: Create a Task that generates a story and comic strip -```mermaid -graph LR - User[User] --> Sessions[Sessions] - Sessions --> Agents[Agents] - Sessions --> Metadata[Metadata] +```javascript +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent) { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} ``` -### Sessions -Stateful interactions between agents and users. Sessions maintain context across multiple exchanges and can be configured for different behaviors, including context management and overflow handling. +### Step 3: Execute the Task -```mermaid -graph LR - Sessions[Sessions] --> Agents[Agents] - Sessions --> Users[Users] - Sessions --> ContextManagement[Context Management] - Sessions --> OverflowHandling[Overflow Handling] +```javascript +async function executeTask(task) { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } + }); + + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } + + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} ``` -### Tasks -Multi-step, programmatic workflows that agents can execute. Tasks define complex operations and can include various types of steps, such as prompts, tool calls, and conditional logic. +### Step 4: Chat with the Agent -```mermaid -graph TD - Tasks[Tasks] --> Steps[Workflow Steps] - Steps --> Prompt[Prompt] - Steps --> ToolCalls[Tool Calls] - Steps --> ConditionalLogic[Conditional Logic] +```javascript +async function chatWithAgent(agent) { + const session = await client.sessions.create({ agent_id: agent.id }); + + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} + +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); +} + +runExample().catch(console.error); ``` -### Tools -Integrations that extend an agent's capabilities. Tools can be user-defined functions, system tools, or third-party API integrations. They allow agents to perform actions beyond text generation. +> [!TIP] +> You can find the full Node.js example [here](example.js). -```mermaid -graph LR - Tools[Tools] --> UserDefinedFunctions[User-Defined Functions] - Tools --> SystemTools[System Tools] - Tools --> ThirdPartyAPIs[Third-Party APIs] -``` +## Components -### Documents -Text or data objects that can be associated with agents or users. Documents are vectorized and stored in a vector database, enabling semantic search and retrieval during agent interactions. +Julep is made up of the following components: -```mermaid -graph LR - Documents[Documents] --> VectorDatabase[Vector Database] - Documents --> SemanticSearch[Semantic Search] - Documents --> AgentsOrUsers[Agents or Users] -``` +- **Julep Platform**: The Julep platform is a cloud service that runs your workflows. It includes a language for describing workflows, a server for running those workflows, and an SDK for interacting with the platform. +- **Julep SDKs**: Julep SDKs are a set of libraries for building workflows. There are SDKs for Python and JavaScript, with more on the way. +- **Julep API**: The Julep API is a RESTful API that you can use to interact with the Julep platform. + +### Mental Model + +
+ +
+ +Think of Julep as a platform that combines both client-side and server-side components to help you build advanced AI agents. Here's how to visualize it: + +1. **Your Application Code:** + - You use the Julep SDK in your application to define agents, tasks, and workflows. + - The SDK provides functions and classes that make it easy to set up and manage these components. -### Executions -Instances of tasks that have been initiated with specific inputs. Executions have their own lifecycle and state machine, allowing for monitoring, management, and resumption of long-running processes. +2. **Julep Backend Service:** + - The SDK communicates with the Julep backend over the network. + - The backend handles execution of tasks, maintains session state, stores documents, and orchestrates workflows. + +3. **Integration with Tools and APIs:** + - Within your workflows, you can integrate external tools and services. + - The backend facilitates these integrations, so your agents can, for example, perform web searches, access databases, or call third-party APIs. + +In simpler terms: +- Julep is a platform for building stateful AI agents. +- You use the SDK (like a toolkit) in your code to define what your agents do. +- The backend service (which you can think of as the engine) runs these definitions, manages state, and handles complexity. + +## Concepts + +Julep is built on several key technical components that work together to create powerful AI workflows: ```mermaid -graph LR - Executions[Executions] --> Tasks[Tasks] - Executions --> Lifecycle[Lifecycle] - Executions --> Monitoring[Monitoring] - Executions --> Management[Management] - Executions --> Resumption[Resumption] +graph TD + User[User] ==> Session[Session] + Session --> Agent[Agent] + Agent --> Tasks[Tasks] + Agent --> LLM[Large Language Model] + Tasks --> Tools[Tools] + Agent --> Documents[Documents] + Documents --> VectorDB[Vector Database] + Tasks --> Executions[Executions] + + classDef client fill:#9ff,stroke:#333,stroke-width:1px; + class User client; + + classDef core fill:#f9f,stroke:#333,stroke-width:2px; + class Agent,Tasks,Session core; ``` +- **Agents**: AI-powered entities backed by large language models (LLMs) that execute tasks and interact with users. +- **Users**: Entities that interact with agents through sessions. +- **Sessions**: Stateful interactions between agents and users, maintaining context across multiple exchanges. +- **Tasks**: Multi-step, programmatic workflows that agents can execute, including various types of steps like prompts, tool calls, and conditional logic. +- **Tools**: Integrations that extend an agent's capabilities, including user-defined functions, system tools, or third-party API integrations. +- **Documents**: Text or data objects associated with agents or users, vectorized and stored for semantic search and retrieval. +- **Executions**: Instances of tasks that have been initiated with specific inputs, with their own lifecycle and state machine. + For a more detailed explanation of these concepts and their interactions, please refer to our [Concepts Documentation](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md). ## Understanding Tasks @@ -457,55 +645,137 @@ Tasks are the core of Julep's workflow system. They allow you to define complex, ### Types of Workflow Steps -Tasks in Julep can include various types of steps: +Tasks in Julep can include various types of steps, allowing you to create complex and powerful workflows. Here's an overview of the available step types, organized by category: + +#### Common Steps 1. **Prompt**: Send a message to the AI model and receive a response. - ```python - {"prompt": "Analyze the following data: {{data}}"} + ```yaml + - prompt: "Analyze the following data: {{data}}" ``` 2. **Tool Call**: Execute an integrated tool or API. - ```python - {"tool": "web_search", "arguments": {"query": "Latest AI developments"}} + ```yaml + - tool: web_search + arguments: + query: "Latest AI developments" ``` 3. **Evaluate**: Perform calculations or manipulate data. - ```python - {"evaluate": {"average_score": "sum(scores) / len(scores)"}} + ```yaml + - evaluate: + average_score: "sum(scores) / len(scores)" + ``` + +4. **Wait for Input**: Pause workflow until input is received. + ```yaml + - wait_for_input: + info: + message: "Please provide additional information." + ``` + +5. **Log**: Log a specified value or message. + ```yaml + - log: "Processing completed for item {{item_id}}" + ``` + +#### Key-Value Steps + +6. **Get**: Retrieve a value from a key-value store. + ```yaml + - get: "user_preference" + ``` + +7. **Set**: Assign a value to a key in a key-value store. + ```yaml + - set: + user_preference: "dark_mode" ``` -4. **Conditional Logic**: Execute steps based on conditions. - ```python - {"if": "score > 0.8", "then": [...], "else": [...]} +#### Iteration Steps + +8. **Foreach**: Iterate over a collection and perform steps for each item. + ```yaml + - foreach: + in: "data_list" + do: + - log: "Processing item {{_}}" ``` -5. **Loops**: Iterate over data or repeat steps. - ```python - {"foreach": {"in": "data_list", "do": [...]}} +9. **Map-Reduce**: Map over a collection and reduce the results. + ```yaml + - map_reduce: + over: "numbers" + map: + - evaluate: + squared: "_ ** 2" + reduce: "sum(results)" ``` -| Step Name | Description | Input | -|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------| -| **Prompt** | Send a message to the AI model and receive a response. | Prompt text or template | -| **Tool Call** | Execute an integrated tool or API. | Tool name and arguments | -| **Evaluate** | Perform calculations or manipulate data. | Expressions or variables to evaluate | -| **Wait for Input** | Pause workflow until input is received. | Any required user or system input | -| **Log** | Log a specified value or message. | Message or value to log | -| **Embed** | Embed text into a specific format or system. | Text or content to embed | -| **Search** | Perform a document search based on a query. | Search query | -| **Get** | Retrieve a value from a key-value store. | Key identifier | -| **Set** | Assign a value to a key in a key-value store. | Key and value to assign | -| **Parallel** | Run multiple steps in parallel. | List of steps to execute simultaneously | -| **Foreach** | Iterate over a collection and perform steps for each item. | Collection or list to iterate over | -| **MapReduce** | Map over a collection and reduce the results based on an expression. | Collection to map and reduce expressions | -| **If Else** | Conditional execution of steps based on a condition. | Condition to evaluate | -| **Switch** | Execute steps based on multiple conditions, similar to a switch-case statement. | Multiple conditions and corresponding steps | -| **Yield** | Run a subworkflow and await its completion. | Subworkflow identifier and input data | -| **Error** | Handle errors by specifying an error message. | Error message or handling instructions | -| **Sleep** | Pause the workflow for a specified duration. | Duration (seconds, minutes, etc.) | -| **Return** | Return a value from the workflow. | Value to return | - -For detailed information on each step type and advanced usage, please refer to our [Task Documentation](https://docs.julep.ai/tasks). +10. **Parallel**: Run multiple steps in parallel. + ```yaml + - parallel: + - tool: web_search + arguments: + query: "AI news" + - tool: weather_check + arguments: + location: "New York" + ``` + +#### Conditional Steps + +11. **If-Else**: Conditional execution of steps. + ```yaml + - if: "score > 0.8" + then: + - log: "High score achieved" + else: + - log: "Score needs improvement" + ``` + +12. **Switch**: Execute steps based on multiple conditions. + ```yaml + - switch: + - case: "category == 'A'" + then: + - log: "Category A processing" + - case: "category == 'B'" + then: + - log: "Category B processing" + - case: "_" # Default case + then: + - log: "Unknown category" + ``` + +#### Other Control Flow + +13. **Sleep**: Pause the workflow for a specified duration. + ```yaml + - sleep: + seconds: 30 + ``` + +14. **Return**: Return a value from the workflow. + ```yaml + - return: + result: "Task completed successfully" + ``` + +15. **Yield**: Run a subworkflow and await its completion. + ```yaml + - yield: + workflow: "data_processing_subflow" + arguments: + input_data: "{{raw_data}}" + ``` + +16. **Error**: Handle errors by specifying an error message. + ```yaml + - error: "Invalid input provided" + ``` + +Each step type serves a specific purpose in building sophisticated AI workflows. This categorization helps in understanding the various control flows and operations available in Julep tasks. ## Advanced Features @@ -521,9 +791,9 @@ client.agents.tools.create( name="web_search", description="Search the web for information.", integration={ - "provider": "google", + "provider": "brave", "method": "search", - "setup": {"api_key": "your_google_api_key"}, + "setup": {"api_key": "your_brave_api_key"}, }, ) ``` @@ -535,14 +805,19 @@ Julep provides robust session management for persistent interactions: ```python session = client.sessions.create( agent_id=agent.id, - user_id="user123", + user_id=user.id, context_overflow="adaptive" ) # Continue conversation in the same session response = client.sessions.chat( session_id=session.id, - message="Follow up on our previous conversation." + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] ) ``` @@ -552,59 +827,122 @@ Easily manage and search through documents for your agents: ```python # Upload a document -document = client.documents.create( - file="path/to/document.pdf", +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", metadata={"category": "research_paper"} ) # Search documents -results = client.documents.search( - query="AI advancements", - filter={"category": "research_paper"} +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} ) ``` For more advanced features and detailed usage, please refer to our [Advanced Features Documentation](https://docs.julep.ai/advanced-features). -## SDK Reference +## Integrations -- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) -- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) +Julep supports various integrations that extend the capabilities of your AI agents. Here's a list of available integrations and their supported arguments: -## API Reference +### Brave Search -Explore our comprehensive API documentation to learn more about agents, tasks, and executions: +```yaml +setup: + api_key: string # The API key for Brave Search -- [Agents API](https://api.julep.ai/api/docs#tag/agents) -- [Tasks API](https://api.julep.ai/api/docs#tag/tasks) -- [Executions API](https://api.julep.ai/api/docs#tag/executions) +arguments: + query: string # The search query for searching with Brave -## Examples and Tutorials +output: + result: string # The result of the Brave Search +``` -Discover example projects and tutorials to help you get started and build upon provided examples: +### BrowserBase -- [Example Projects](https://github.com/julep-ai/julep/tree/main/examples) -- [Tutorials](https://docs.julep.ai/tutorials) +```yaml +setup: + api_key: string # The API key for BrowserBase + project_id: string # The project ID for BrowserBase + session_id: string # (Optional) The session ID for BrowserBase -## Contributing +arguments: + urls: list[string] # The URLs for loading with BrowserBase -We welcome contributions to the project! Learn how to contribute and our code of conduct: +output: + documents: list # The documents loaded from the URLs +``` -- [Contributing Guidelines](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) -- [Code of Conduct](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) +### Email -## Support and Community +```yaml +setup: + host: string # The host of the email server + port: integer # The port of the email server + user: string # The username of the email server + password: string # The password of the email server -Join our community to get help, ask questions, and share your ideas: +arguments: + to: string # The email address to send the email to + from: string # The email address to send the email from + subject: string # The subject of the email + body: string # The body of the email -- [Discord](https://discord.com/invite/JTSBGRZrzj) -- [GitHub Discussions](https://github.com/julep-ai/julep/discussions) -- [Twitter](https://twitter.com/julep_ai) +output: + success: boolean # Whether the email was sent successfully +``` -## License +### Spider -This project is licensed under the [Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE). +```yaml +setup: + spider_api_key: string # The API key for Spider -## Acknowledgements +arguments: + url: string # The URL for which to fetch data + mode: string # The type of crawlers (default: "scrape") + params: dict # (Optional) The parameters for the Spider API -We would like to express our gratitude to all contributors and the open-source community for their valuable resources and contributions. +output: + documents: list # The documents returned from the spider +``` + +### Weather + +```yaml +setup: + openweathermap_api_key: string # The API key for OpenWeatherMap + +arguments: + location: string # The location for which to fetch weather data + +output: + result: string # The weather data for the specified location +``` + +### Wikipedia + +```yaml +arguments: + query: string # The search query string + load_max_docs: integer # Maximum number of documents to load (default: 2) + +output: + documents: list # The documents returned from the Wikipedia search +``` + +These integrations can be used within your tasks to extend the capabilities of your AI agents. For more detailed information on how to use these integrations in your workflows, please refer to our [Integrations Documentation](https://docs.julep.ai/integrations). + +## SDK Reference + +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## API Reference + +Explore our comprehensive API documentation to learn more about agents, tasks, and executions: + +- [Agents API](https://api.julep.ai/api/docs#tag/agents) +- [Tasks API](https://api.julep.ai/api/docs#tag/tasks) +- [Executions API](https://api.julep.ai/api/docs#tag/executions) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 85a3f43b3..61df6b682 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -52,4 +52,3 @@ * [⭐ Github](https://github.com/julep-ai/julep) * [🐍 PyPI package](https://pypi.org/project/julep/) * [📦 npm package](https://www.npmjs.com/package/@julep/sdk) -* [📫 Postman Collection](https://god.gw.postman.com/run-collection/33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336?action=collection%2Ffork\&source=rip_markdown\&collection-url=entityId%3D33213061-a0a1e3a9-9681-44ae-a5c2-703912b32336%26entityType%3Dcollection%26workspaceId%3D183380b4-f2ac-44ef-b018-1f65dfc8256b) From 4fe49d120523f5fa80fcd4d4e84063df0e4b1e53 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Thu, 10 Oct 2024 18:00:24 +0300 Subject: [PATCH 088/113] feat(agents-api): Add some LiteLLM exceptions to the list of non-retryable errors (#622) Added the following exceptions: - `litellm.exceptions.NotFoundError`. - `litellm.exceptions.InvalidRequestError`. - `litellm.exceptions.AuthenticationError`. - `litellm.exceptions.ServiceUnavailableError`. - `litellm.exceptions.OpenAIError`. - `litellm.exceptions.APIError`. ---- > [!IMPORTANT] > Add LiteLLM exceptions to non-retryable errors in `tasks.py`. > > - **Exceptions**: > - Added `litellm.exceptions.NotFoundError`, `InvalidRequestError`, `AuthenticationError`, `ServiceUnavailableError`, `OpenAIError`, and `APIError` to `NON_RETRYABLE_ERROR_TYPES` in `tasks.py`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 018360cfe4c489b62de1b6ee3eaea2cb7e3e92b4. It will automatically update as commits are pushed. --- agents-api/agents_api/common/exceptions/tasks.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/agents-api/agents_api/common/exceptions/tasks.py b/agents-api/agents_api/common/exceptions/tasks.py index 6e1df0734..8ead1e7e2 100644 --- a/agents-api/agents_api/common/exceptions/tasks.py +++ b/agents-api/agents_api/common/exceptions/tasks.py @@ -14,6 +14,7 @@ import httpx import jinja2 import jsonschema.exceptions +import litellm import pydantic import requests import temporalio.exceptions @@ -70,10 +71,12 @@ pydantic.ValidationError, requests.exceptions.InvalidURL, requests.exceptions.MissingSchema, + # # Box exceptions box.exceptions.BoxKeyError, box.exceptions.BoxTypeError, box.exceptions.BoxValueError, + # # Beartype exceptions beartype.roar.BeartypeException, beartype.roar.BeartypeDecorException, @@ -88,6 +91,14 @@ beartype.roar.BeartypeCallHintReturnViolation, beartype.roar.BeartypeDecorHintParamDefaultViolation, beartype.roar.BeartypeDoorHintViolation, + # + # LiteLLM exceptions + litellm.exceptions.NotFoundError, + litellm.exceptions.InvalidRequestError, + litellm.exceptions.AuthenticationError, + litellm.exceptions.ServiceUnavailableError, + litellm.exceptions.OpenAIError, + litellm.exceptions.APIError, ] From 3291120866469ac738c25f4c141b9533fad80128 Mon Sep 17 00:00:00 2001 From: Hamada Salhab Date: Fri, 11 Oct 2024 01:45:40 +0300 Subject: [PATCH 089/113] feat(agents-api): Add `wait_for_input` step to the acceptable steps inside `foreach` step (#625) > [!IMPORTANT] > Add `WaitForInputStep` to `foreach` step in agents API, updating `Tasks.py`, `steps.tsp`, and OpenAPI specs. > > - **Behavior**: > - Add `WaitForInputStep` to `ForeachDo` and `ForeachDoUpdateItem` in `Tasks.py`, allowing it as a valid step in `foreach`. > - Update `SequentialWorkflowStep` alias in `steps.tsp` to include `WaitForInputStep`. > - **OpenAPI**: > - Update `openapi-0.4.0.yaml` and `openapi-1.0.0.yaml` to include `WaitForInputStep` in `ForeachDo` and `ForeachDoUpdateItem` schemas. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for ac9b7c163b009a1a95bbc2a19533a674eeed4b6a. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: Diwank Singh Tomer --- agents-api/agents_api/autogen/Tasks.py | 6 +- agents-api/tests/test_execution_workflow.py | 82 +++++++++++++++++-- scheduler/docker-compose.yml | 18 +++- typespec/tasks/steps.tsp | 6 +- .../@typespec/openapi3/openapi-0.4.0.yaml | 2 + .../@typespec/openapi3/openapi-1.0.0.yaml | 2 + 6 files changed, 105 insertions(+), 11 deletions(-) diff --git a/agents-api/agents_api/autogen/Tasks.py b/agents-api/agents_api/autogen/Tasks.py index c7067ea0c..77dcfefd6 100644 --- a/agents-api/agents_api/autogen/Tasks.py +++ b/agents-api/agents_api/autogen/Tasks.py @@ -191,7 +191,8 @@ class ForeachDo(BaseModel): VALIDATION: Should NOT return more than 1000 elements. """ do: ( - EvaluateStep + WaitForInputStep + | EvaluateStep | ToolCallStep | PromptStep | GetStep @@ -214,7 +215,8 @@ class ForeachDoUpdateItem(BaseModel): VALIDATION: Should NOT return more than 1000 elements. """ do: ( - EvaluateStep + WaitForInputStep + | EvaluateStep | ToolCallStep | PromptStepUpdateItem | GetStep diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index c701a2e2f..e5ef7110a 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -671,8 +671,7 @@ async def _( assert result == expected_output -# FIXME: This test is not working. It gets stuck -# @test("workflow: wait for input step start") +@test("workflow: wait for input step start") async def _( client=cozo_client, developer_id=test_developer_id, @@ -710,7 +709,12 @@ async def _( mock_run_task_execution_workflow.assert_called_once() # Let it run for a bit - await asyncio.sleep(3) + result_coroutine = handle.result() + task = asyncio.create_task(result_coroutine) + try: + await asyncio.wait_for(task, timeout=3) + except asyncio.TimeoutError: + task.cancel() # Get the history history = await handle.fetch_history() @@ -728,12 +732,78 @@ async def _( activity for activity in activities_scheduled if activity ] - future = handle.result() - await future - assert "wait_for_input_step" in activities_scheduled +@test("workflow: foreach wait for input step start") +async def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, +): + data = CreateExecutionRequest(input={"test": "input"}) + + task = create_task( + developer_id=developer_id, + agent_id=agent.id, + data=CreateTaskRequest( + **{ + "name": "test task", + "description": "test task about", + "input_schema": {"type": "object", "additionalProperties": True}, + "main": [ + { + "foreach": { + "in": "'a b c'.split()", + "do": {"wait_for_input": {"info": {"hi": '"bye"'}}}, + }, + }, + ], + } + ), + client=client, + ) + + async with patch_testing_temporal() as (_, mock_run_task_execution_workflow): + execution, handle = await start_execution( + developer_id=developer_id, + task_id=task.id, + data=data, + client=client, + ) + + assert handle is not None + assert execution.task_id == task.id + assert execution.input == data.input + mock_run_task_execution_workflow.assert_called_once() + + # Let it run for a bit + result_coroutine = handle.result() + task = asyncio.create_task(result_coroutine) + try: + await asyncio.wait_for(task, timeout=3) + except asyncio.TimeoutError: + task.cancel() + + # Get the history + history = await handle.fetch_history() + events = [MessageToDict(e) for e in history.events] + assert len(events) > 0 + + activities_scheduled = [ + event.get("activityTaskScheduledEventAttributes", {}) + .get("activityType", {}) + .get("name") + for event in events + if "ACTIVITY_TASK_SCHEDULED" in event["eventType"] + ] + activities_scheduled = [ + activity for activity in activities_scheduled if activity + ] + + assert "for_each_step" in activities_scheduled + + @test("workflow: if-else step") async def _( client=cozo_client, diff --git a/scheduler/docker-compose.yml b/scheduler/docker-compose.yml index e0f86ec9d..613cc9e67 100644 --- a/scheduler/docker-compose.yml +++ b/scheduler/docker-compose.yml @@ -53,7 +53,7 @@ services: - POSTGRES_PASSWORD=${TEMPORAL_POSTGRES_PASSWORD} healthcheck: test: [ "CMD-SHELL", "pg_isready -d ${TEMPORAL_POSTGRES_DB:-temporal} -U ${TEMPORAL_POSTGRES_USER:-temporal}" ] - + interval: 1s timeout: 5s retries: 10 @@ -63,8 +63,22 @@ services: profiles: - temporal-ui environment: + # See: https://github.com/temporalio/ui-server/blob/main/docker/config-template.yaml - TEMPORAL_ADDRESS=${TEMPORAL_ADDRESS:-temporal:7233} - - TEMPORAL_CORS_ORIGINS=${TEMPORAL_CORS_ORIGINS:-http://localhost:3000} + # Note: Not setting it enables all origins + # - TEMPORAL_CORS_ORIGINS=${TEMPORAL_CORS_ORIGINS:-http://localhost:3000} + - TEMPORAL_CODEC_ENDPOINT=http://localhost/api/temporal + - TEMPORAL_UI_ENABLED=true + - TEMPORAL_FEEDBACK_URL=https://github.com/julep-ai/julep + - TEMPORAL_NOTIFY_ON_NEW_VERSION=false + - TEMPORAL_CSRF_COOKIE_INSECURE=true + # - TEMPORAL_HIDE_LOGS=true + # - TEMPORAL_BANNER_TEXT=gagagaga + # - TEMPORAL_DISABLE_WRITE_ACTIONS=true + # - TEMPORAL_HIDE_WORKFLOW_QUERY_ERRORS=true + # - TEMPORAL_REFRESH_WORKFLOW_COUNTS_DISABLED=true + - TEMPORAL_OPEN_API_ENABLED=true + ports: - 9000:8080 # Since 8080 is already used by agents-api diff --git a/typespec/tasks/steps.tsp b/typespec/tasks/steps.tsp index 1d8c19209..4b14ef6ae 100644 --- a/typespec/tasks/steps.tsp +++ b/typespec/tasks/steps.tsp @@ -41,6 +41,10 @@ model BaseWorkflowStep { kind_: T; } +alias SequentialWorkflowStep = + | WaitForInputStep + | MappableWorkflowStep; + alias MappableWorkflowStep = | EvaluateStep | ToolCallStep @@ -208,7 +212,7 @@ model ForeachDo { in: TypedExpression>; /** The steps to run for each iteration */ - do: MappableWorkflowStep; + do: SequentialWorkflowStep; } model ForeachStep extends BaseWorkflowStep<"foreach"> { diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml index d00a5b9d2..61d89edaa 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml @@ -4167,6 +4167,7 @@ components: VALIDATION: Should NOT return more than 1000 elements. do: anyOf: + - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.EvaluateStep' - $ref: '#/components/schemas/Tasks.ToolCallStep' - $ref: '#/components/schemas/Tasks.PromptStep' @@ -4189,6 +4190,7 @@ components: VALIDATION: Should NOT return more than 1000 elements. do: anyOf: + - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.EvaluateStep' - $ref: '#/components/schemas/Tasks.ToolCallStep' - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml index b3f3919a9..36fbc0147 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml @@ -4167,6 +4167,7 @@ components: VALIDATION: Should NOT return more than 1000 elements. do: anyOf: + - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.EvaluateStep' - $ref: '#/components/schemas/Tasks.ToolCallStep' - $ref: '#/components/schemas/Tasks.PromptStep' @@ -4189,6 +4190,7 @@ components: VALIDATION: Should NOT return more than 1000 elements. do: anyOf: + - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.EvaluateStep' - $ref: '#/components/schemas/Tasks.ToolCallStep' - $ref: '#/components/schemas/Tasks.PromptStepUpdateItem' From a51441ac209aa6e4f2ac7e936b892c4f5a7a169d Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 11 Oct 2024 05:37:04 -0400 Subject: [PATCH 090/113] Misc fixes (#627) - **fix(agents-api): Allow url etc to be overridden by arguments** - **fix(agents-api): base64 encode http content** - **feat(agents-api): Extend stdlib** - **fix(agents-api): Fix interceptors and simplify get/set steps** - **fix(agents-api): Fix the bug where execution.output was not being set** ---- > [!IMPORTANT] > This PR enhances API call execution, extends the standard library, improves error handling, refines execution transitions, and updates workflow execution in the `agents-api` module. > > - **API Call Execution**: > - `execute_api_call` in `excecute_api_call.py` now supports overriding `url` and `headers` via `RequestArgs`. > - HTTP content is base64 encoded before being returned. > - **Standard Library Extension**: > - `utils.py` extended with classes for `re`, `json`, `yaml`, `time`, `random`, `itertools`, `functools`, `base64`, `urllib`, `string`, `zoneinfo`, `datetime`, `math`, and `statistics`. > - **Error Handling**: > - Updated `is_non_retryable_error` in `exceptions/tasks.py` to accept `BaseException`. > - `CustomActivityInterceptor` and `CustomWorkflowInterceptor` in `interceptors.py` now handle `BaseException`. > - **Execution Transition**: > - Fixed bug in `create_execution_transition.py` where `execution.output` was not set correctly for non-error transitions. > - **Workflow Execution**: > - Removed user state management from `TaskExecutionWorkflow` in `task_execution/__init__.py`. > - Updated `continue_as_child` in `helpers.py` to handle user state via workflow memo. > - **Testing**: > - Updated tests in `test_execution_workflow.py` to cover new functionalities and ensure correct behavior. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 2b785597f98c66380d79a79d249ba95ddf79dcf0. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: creatorrr --- .../activities/excecute_api_call.py | 14 +- agents-api/agents_api/activities/utils.py | 189 ++++++++++++++++-- .../agents_api/common/exceptions/tasks.py | 8 +- agents-api/agents_api/common/interceptors.py | 4 +- .../agents_api/common/protocol/tasks.py | 3 +- .../execution/create_execution_transition.py | 2 +- .../workflows/task_execution/__init__.py | 43 +--- .../workflows/task_execution/helpers.py | 24 ++- agents-api/tests/test_execution_workflow.py | 6 +- 9 files changed, 218 insertions(+), 75 deletions(-) diff --git a/agents-api/agents_api/activities/excecute_api_call.py b/agents-api/agents_api/activities/excecute_api_call.py index 88fabce89..e7752aa06 100644 --- a/agents-api/agents_api/activities/excecute_api_call.py +++ b/agents-api/agents_api/activities/excecute_api_call.py @@ -1,3 +1,4 @@ +import base64 from typing import Annotated, Any, Optional, TypedDict, Union import httpx @@ -20,6 +21,8 @@ class RequestArgs(TypedDict): json_: Optional[dict[str, Any]] cookies: Optional[dict[str, str]] params: Optional[Union[str, dict[str, Any]]] + url: Optional[str] + headers: Optional[dict[str, str]] @beartype @@ -29,18 +32,23 @@ async def execute_api_call( ) -> Any: try: async with httpx.AsyncClient() as client: + arg_url = request_args.pop("url", None) + arg_headers = request_args.pop("headers", None) + response = await client.request( method=api_call.method, - url=str(api_call.url), - headers=api_call.headers, + url=arg_url or str(api_call.url), + headers=arg_headers or api_call.headers, follow_redirects=api_call.follow_redirects, **request_args, ) + content_base64 = base64.b64encode(response.content).decode("ascii") + response_dict = { "status_code": response.status_code, "headers": dict(response.headers), - "content": response.content, + "content": content_base64, "json": response.json(), } diff --git a/agents-api/agents_api/activities/utils.py b/agents-api/agents_api/activities/utils.py index f9f7ded12..fca62578a 100644 --- a/agents-api/agents_api/activities/utils.py +++ b/agents-api/agents_api/activities/utils.py @@ -1,20 +1,33 @@ +import base64 +import datetime as dt +import functools +import itertools import json -from functools import reduce -from itertools import accumulate -from random import random -from time import time -from typing import Any, Callable +import math +import random +import statistics +import string +import time +import urllib.parse +from typing import Any, Callable, ParamSpec, Type, TypeVar, cast import re2 import yaml +import zoneinfo from beartype import beartype from simpleeval import EvalWithCompoundTypes, SimpleEval -from yaml import CSafeLoader +from yaml import CSafeDumper, CSafeLoader + +T = TypeVar("T") + + +P = ParamSpec("P") +R = TypeVar("R") + # TODO: We need to make sure that we dont expose any security issues ALLOWED_FUNCTIONS = { "abs": abs, - "accumulate": accumulate, "all": all, "any": any, "bool": bool, @@ -25,23 +38,169 @@ "int": int, "len": len, "list": list, - "load_json": json.loads, - "load_yaml": lambda string: yaml.load(string, Loader=CSafeLoader), "map": map, - "match_regex": lambda pattern, string: bool(re2.fullmatch(pattern, string)), "max": max, "min": min, - "random": random, "range": range, - "reduce": reduce, "round": round, - "search_regex": lambda pattern, string: re2.search(pattern, string), "set": set, "str": str, "sum": sum, - "time": time, "tuple": tuple, + "reduce": functools.reduce, "zip": zip, + "search_regex": lambda pattern, string: re2.search(pattern, string), + "load_json": json.loads, + "load_yaml": lambda string: yaml.load(string, Loader=CSafeLoader), + "match_regex": lambda pattern, string: bool(re2.fullmatch(pattern, string)), +} + + +class stdlib_re: + fullmatch = re2.fullmatch + search = re2.search + escape = re2.escape + findall = re2.findall + finditer = re2.finditer + match = re2.match + split = re2.split + sub = re2.sub + subn = re2.subn + + +class stdlib_json: + loads = json.loads + dumps = json.dumps + + +class stdlib_yaml: + load = lambda string: yaml.load(string, Loader=CSafeLoader) # noqa: E731 + dump = lambda value: yaml.dump(value, Dumper=CSafeDumper) # noqa: E731 + + +class stdlib_time: + strftime = time.strftime + strptime = time.strptime + time = time + + +class stdlib_random: + choice = random.choice + choices = random.choices + sample = random.sample + shuffle = random.shuffle + randrange = random.randrange + randint = random.randint + random = random.random + + +class stdlib_itertools: + accumulate = itertools.accumulate + + +class stdlib_functools: + partial = functools.partial + reduce = functools.reduce + + +class stdlib_base64: + b64encode = base64.b64encode + b64decode = base64.b64decode + + +class stdlib_urllib: + class parse: + urlparse = urllib.parse.urlparse + urlencode = urllib.parse.urlencode + unquote = urllib.parse.unquote + quote = urllib.parse.quote + parse_qs = urllib.parse.parse_qs + parse_qsl = urllib.parse.parse_qsl + urlsplit = urllib.parse.urlsplit + urljoin = urllib.parse.urljoin + unwrap = urllib.parse.unwrap + + +class stdlib_string: + ascii_letters = string.ascii_letters + ascii_lowercase = string.ascii_lowercase + ascii_uppercase = string.ascii_uppercase + digits = string.digits + hexdigits = string.hexdigits + octdigits = string.octdigits + punctuation = string.punctuation + whitespace = string.whitespace + printable = string.printable + + +class stdlib_zoneinfo: + ZoneInfo = zoneinfo.ZoneInfo + + +class stdlib_datetime: + class timezone: + class utc: + utc = dt.timezone.utc + + class datetime: + now = dt.datetime.now + datetime = dt.datetime + timedelta = dt.timedelta + date = dt.date + time = dt.time + + timedelta = dt.timedelta + + +class stdlib_math: + sqrt = math.sqrt + exp = math.exp + ceil = math.ceil + floor = math.floor + isinf = math.isinf + isnan = math.isnan + log = math.log + log10 = math.log10 + log2 = math.log2 + pow = math.pow + sin = math.sin + cos = math.cos + tan = math.tan + asin = math.asin + acos = math.acos + atan = math.atan + atan2 = math.atan2 + + pi = math.pi + e = math.e + + +class stdlib_statistics: + mean = statistics.mean + stdev = statistics.stdev + geometric_mean = statistics.geometric_mean + median = statistics.median + median_low = statistics.median_low + median_high = statistics.median_high + mode = statistics.mode + quantiles = statistics.quantiles + + +stdlib = { + "re": stdlib_re, + "json": stdlib_json, + "yaml": stdlib_yaml, + "time": stdlib_time, + "random": stdlib_random, + "itertools": stdlib_itertools, + "functools": stdlib_functools, + "base64": stdlib_base64, + "urllib": stdlib_urllib, + "string": stdlib_string, + "zoneinfo": stdlib_zoneinfo, + "datetime": stdlib_datetime, + "math": stdlib_math, + "statistics": stdlib_statistics, } @@ -50,7 +209,7 @@ def get_evaluator( names: dict[str, Any], extra_functions: dict[str, Callable] | None = None ) -> SimpleEval: evaluator = EvalWithCompoundTypes( - names=names, functions=ALLOWED_FUNCTIONS | (extra_functions or {}) + names=names | stdlib, functions=ALLOWED_FUNCTIONS | (extra_functions or {}) ) return evaluator diff --git a/agents-api/agents_api/common/exceptions/tasks.py b/agents-api/agents_api/common/exceptions/tasks.py index 8ead1e7e2..81331234c 100644 --- a/agents-api/agents_api/common/exceptions/tasks.py +++ b/agents-api/agents_api/common/exceptions/tasks.py @@ -20,7 +20,7 @@ import temporalio.exceptions # List of error types that should not be retried -NON_RETRYABLE_ERROR_TYPES = [ +NON_RETRYABLE_ERROR_TYPES = ( # Temporal-specific errors temporalio.exceptions.WorkflowAlreadyStartedError, temporalio.exceptions.TerminatedError, @@ -99,10 +99,10 @@ litellm.exceptions.ServiceUnavailableError, litellm.exceptions.OpenAIError, litellm.exceptions.APIError, -] +) -def is_non_retryable_error(error: Exception) -> bool: +def is_non_retryable_error(error: BaseException) -> bool: """ Determines if the given error is non-retryable. @@ -115,4 +115,4 @@ def is_non_retryable_error(error: Exception) -> bool: Returns: bool: True if the error is non-retryable, False otherwise. """ - return isinstance(error, tuple(NON_RETRYABLE_ERROR_TYPES)) + return isinstance(error, NON_RETRYABLE_ERROR_TYPES) diff --git a/agents-api/agents_api/common/interceptors.py b/agents-api/agents_api/common/interceptors.py index 2fb077c45..c6e8e2eaf 100644 --- a/agents-api/agents_api/common/interceptors.py +++ b/agents-api/agents_api/common/interceptors.py @@ -31,7 +31,7 @@ class CustomActivityInterceptor(ActivityInboundInterceptor): async def execute_activity(self, input: ExecuteActivityInput): try: return await super().execute_activity(input) - except Exception as e: + except BaseException as e: if is_non_retryable_error(e): raise ApplicationError( str(e), @@ -53,7 +53,7 @@ class CustomWorkflowInterceptor(WorkflowInboundInterceptor): async def execute_workflow(self, input: ExecuteWorkflowInput): try: return await super().execute_workflow(input) - except Exception as e: + except BaseException as e: if is_non_retryable_error(e): raise ApplicationError( str(e), diff --git a/agents-api/agents_api/common/protocol/tasks.py b/agents-api/agents_api/common/protocol/tasks.py index bbb5c28d3..bd4aaa5a2 100644 --- a/agents-api/agents_api/common/protocol/tasks.py +++ b/agents-api/agents_api/common/protocol/tasks.py @@ -118,7 +118,8 @@ } # type: ignore -PartialTransition: Type[BaseModel] = create_partial_model(CreateTransitionRequest) +class PartialTransition(create_partial_model(CreateTransitionRequest)): + user_state: dict[str, Any] = Field(default_factory=dict) class ExecutionInput(BaseModel): diff --git a/agents-api/agents_api/models/execution/create_execution_transition.py b/agents-api/agents_api/models/execution/create_execution_transition.py index f40395126..2b1c09ae8 100644 --- a/agents-api/agents_api/models/execution/create_execution_transition.py +++ b/agents-api/agents_api/models/execution/create_execution_transition.py @@ -176,7 +176,7 @@ def create_execution_transition( data=UpdateExecutionRequest( status=transition_to_execution_status[data.type] ), - output=data.output if data.type == "finish" else None, + output=data.output if data.type != "error" else None, error=str(data.output) if data.type == "error" and data.output else None, diff --git a/agents-api/agents_api/workflows/task_execution/__init__.py b/agents-api/agents_api/workflows/task_execution/__init__.py index edf54fb12..155b49397 100644 --- a/agents-api/agents_api/workflows/task_execution/__init__.py +++ b/agents-api/agents_api/workflows/task_execution/__init__.py @@ -118,30 +118,6 @@ # Main workflow definition @workflow.defn class TaskExecutionWorkflow: - user_state: dict[str, Any] = {} - - def __init__(self) -> None: - self.user_state = {} - - # TODO: Add endpoints for getting and setting user state for an execution - # Query methods for user state - @workflow.query - def get_user_state(self) -> dict[str, Any]: - return self.user_state - - @workflow.query - def get_user_state_by_key(self, key: str) -> Any: - return self.user_state.get(key) - - # Signal methods for updating user state - @workflow.signal - def set_user_state(self, key: str, value: Any) -> None: - self.user_state[key] = value - - @workflow.signal - def update_user_state(self, values: dict[str, Any]) -> None: - self.user_state.update(values) - # Main workflow run method @workflow.run async def run( @@ -149,11 +125,7 @@ async def run( execution_input: ExecutionInput, start: TransitionTarget = TransitionTarget(workflow="main", step=0), previous_inputs: list[Any] = [], - user_state: dict[str, Any] = {}, ) -> Any: - # Set the initial user state - self.user_state = user_state - workflow.logger.info( f"TaskExecutionWorkflow for task {execution_input.task.id}" f" [LOC {start.workflow}.{start.step}]" @@ -258,7 +230,6 @@ async def run( switch=switch, index=index, previous_inputs=previous_inputs, - user_state=self.user_state, ) state = PartialTransition(output=result) @@ -276,7 +247,6 @@ async def run( else_branch=else_branch, condition=condition, previous_inputs=previous_inputs, - user_state=self.user_state, ) state = PartialTransition(output=result) @@ -288,7 +258,6 @@ async def run( do_step=do_step, items=items, previous_inputs=previous_inputs, - user_state=self.user_state, ) state = PartialTransition(output=result) @@ -303,7 +272,6 @@ async def run( reduce=reduce, initial=initial, previous_inputs=previous_inputs, - user_state=self.user_state, ) state = PartialTransition(output=result) @@ -316,7 +284,6 @@ async def run( map_defn=map_defn, items=items, previous_inputs=previous_inputs, - user_state=self.user_state, initial=initial, reduce=reduce, parallelism=parallelism, @@ -376,7 +343,6 @@ async def run( context, start=yield_next_target, previous_inputs=[output], - user_state=self.user_state, ) state = PartialTransition(output=result) @@ -439,14 +405,15 @@ async def run( case SetStep(), StepOutcome(output=evaluated_output): workflow.logger.info("Set step: Updating user state") - self.update_user_state(evaluated_output) # Pass along the previous output unchanged - state = PartialTransition(output=context.current_input) + state = PartialTransition( + output=context.current_input, user_state=evaluated_output + ) case GetStep(get=key), _: workflow.logger.info(f"Get step: Fetching '{key}' from user state") - value = self.get_user_state_by_key(key) + value = workflow.memo_value(key, default=None) workflow.logger.debug(f"Retrieved value: {value}") state = PartialTransition(output=value) @@ -596,5 +563,5 @@ def model_dump(obj): context.execution_input, start=final_state.next, previous_inputs=previous_inputs + [final_state.output], - user_state=self.user_state, + user_state=state.user_state, ) diff --git a/agents-api/agents_api/workflows/task_execution/helpers.py b/agents-api/agents_api/workflows/task_execution/helpers.py index 04449db58..271f33dbf 100644 --- a/agents-api/agents_api/workflows/task_execution/helpers.py +++ b/agents-api/agents_api/workflows/task_execution/helpers.py @@ -27,15 +27,23 @@ async def continue_as_child( previous_inputs: list[Any], user_state: dict[str, Any] = {}, ) -> Any: - return await workflow.execute_child_workflow( - "TaskExecutionWorkflow", + info = workflow.info() + + if info.is_continue_as_new_suggested(): + run = workflow.continue_as_new + else: + run = lambda *args, **kwargs: workflow.execute_child_workflow( # noqa: E731 + info.workflow_type, *args, **kwargs + ) + + return await run( args=[ execution_input, start, previous_inputs, - user_state, ], retry_policy=DEFAULT_RETRY_POLICY, + memo=workflow.memo() | user_state, ) @@ -46,7 +54,7 @@ async def execute_switch_branch( switch: list, index: int, previous_inputs: list[Any], - user_state: dict[str, Any], + user_state: dict[str, Any] = {}, ) -> Any: workflow.logger.info(f"Switch step: Chose branch {index}") chosen_branch = switch[index] @@ -77,7 +85,7 @@ async def execute_if_else_branch( else_branch: WorkflowStep, condition: bool, previous_inputs: list[Any], - user_state: dict[str, Any], + user_state: dict[str, Any] = {}, ) -> Any: workflow.logger.info(f"If-Else step: Condition evaluated to {condition}") chosen_branch = then_branch if condition else else_branch @@ -108,7 +116,7 @@ async def execute_foreach_step( do_step: WorkflowStep, items: list[Any], previous_inputs: list[Any], - user_state: dict[str, Any], + user_state: dict[str, Any] = {}, ) -> Any: workflow.logger.info(f"Foreach step: Iterating over {len(items)} items") results = [] @@ -142,7 +150,7 @@ async def execute_map_reduce_step( map_defn: WorkflowStep, items: list[Any], previous_inputs: list[Any], - user_state: dict[str, Any], + user_state: dict[str, Any] = {}, reduce: str | None = None, initial: Any = [], ) -> Any: @@ -185,7 +193,7 @@ async def execute_map_reduce_step_parallel( map_defn: WorkflowStep, items: list[Any], previous_inputs: list[Any], - user_state: dict[str, Any], + user_state: dict[str, Any] = {}, initial: Any = [], reduce: str | None = None, parallelism: int = task_max_parallelism, diff --git a/agents-api/tests/test_execution_workflow.py b/agents-api/tests/test_execution_workflow.py index e5ef7110a..f8a89cb62 100644 --- a/agents-api/tests/test_execution_workflow.py +++ b/agents-api/tests/test_execution_workflow.py @@ -819,9 +819,9 @@ async def _( "input_schema": {"type": "object", "additionalProperties": True}, "main": [ { - "if": "True", + "if": "False", "then": {"evaluate": {"hello": '"world"'}}, - "else": {"evaluate": {"hello": '"nope"'}}, + "else": {"evaluate": {"hello": "random.randint(0, 10)"}}, }, ], } @@ -849,7 +849,7 @@ async def _( mock_run_task_execution_workflow.assert_called_once() result = await handle.result() - assert result["hello"] == "world" + assert result["hello"] in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] @test("workflow: switch step") From d0bef2c844266d9d37abe5d7e38ac058442f00b3 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Fri, 11 Oct 2024 15:01:38 -0400 Subject: [PATCH 091/113] doc: Add cookbooks and ideas for what to build with julep (#592) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Add Claude-generated notebooks for task execution and management using Julep client, with updates to execution handling and agent models. > > - **Behavior**: > - Adds `time.sleep()` to wait for task execution completion in `01-Website_Crawler_using_Spider.py`, `02-Sarcastic_News_Headline_Generator.py`, `03-SmartResearcher_With_WebSearch.py`, `04-TripPlanner_With_Weather_And_WikiInfo.py`, `07-Integrating_External_Tools_and_APIs.py`, `08-Managing_Persistent_Sessions.py`, `09-User_Management_and_Personalization.py`, `10-Document_Management_and_Search.py`, `11-Advanced_Chat_Interactions.py`, `12-Monitoring_Task_Executions.py`, and `13-Error_Handling_and_Recovery.py`. > - Updates print statements for execution steps in `01-Website_Crawler_using_Spider.py`, `02-Sarcastic_News_Headline_Generator.py`, `03-SmartResearcher_With_WebSearch.py`, `04-TripPlanner_With_Weather_And_WikiInfo.py`, `07-Integrating_External_Tools_and_APIs.py`, `08-Managing_Persistent_Sessions.py`, `09-User_Management_and_Personalization.py`, `10-Document_Management_and_Search.py`, `11-Advanced_Chat_Interactions.py`, `12-Monitoring_Task_Executions.py`, and `13-Error_Handling_and_Recovery.py`. > - Changes agent model to `gpt-4o` in `05-Basic_Agent_Creation_and_Interaction.py`, `06-Designing_Multi-Step_Tasks.py`, `07-Integrating_External_Tools_and_APIs.py`, `08-Managing_Persistent_Sessions.py`, `09-User_Management_and_Personalization.py`, `10-Document_Management_and_Search.py`, `11-Advanced_Chat_Interactions.py`, `12-Monitoring_Task_Executions.py`, and `13-Error_Handling_and_Recovery.py`. > - **Misc**: > - Adds "UNDER CONSTRUCTION" comments to indicate incomplete functionality in `05-Basic_Agent_Creation_and_Interaction.py`, `10-Document_Management_and_Search.py`, `11-Advanced_Chat_Interactions.py`, `12-Monitoring_Task_Executions.py`, and `13-Error_Handling_and_Recovery.py`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 7ffae7f6d6bdd34ce9a44d085d2e4d735c4ded4a. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer Co-authored-by: vedantsahai18 Co-authored-by: Ikko Eltociear Ashimine Co-authored-by: creatorrr --- .../01-Website_Crawler_using_Spider.ipynb | 6 +- cookbooks/01-Website_Crawler_using_Spider.py | 13 ++- ...02-Sarcastic_News_Headline_Generator.ipynb | 6 +- .../02-Sarcastic_News_Headline_Generator.py | 12 ++- .../03-SmartResearcher_With_WebSearch.ipynb | 6 +- .../03-SmartResearcher_With_WebSearch.py | 14 ++- ...ripPlanner_With_Weather_And_WikiInfo.ipynb | 8 +- ...4-TripPlanner_With_Weather_And_WikiInfo.py | 17 ++-- ...05-Basic_Agent_Creation_and_Interaction.py | 4 +- cookbooks/06-Designing_Multi-Step_Tasks.py | 19 ++-- .../07-Integrating_External_Tools_and_APIs.py | 36 +++---- cookbooks/08-Managing_Persistent_Sessions.py | 39 +++++--- .../09-User_Management_and_Personalization.py | 88 +++++++++-------- .../10-Document_Management_and_Search.py | 48 ++++++++-- cookbooks/11-Advanced_Chat_Interactions.py | 94 +++++++++---------- cookbooks/12-Monitoring_Task_Executions.py | 4 +- cookbooks/13-Error_Handling_and_Recovery.py | 70 +++++++------- 17 files changed, 278 insertions(+), 206 deletions(-) diff --git a/cookbooks/01-Website_Crawler_using_Spider.ipynb b/cookbooks/01-Website_Crawler_using_Spider.ipynb index 36a77d525..c65a3cb40 100644 --- a/cookbooks/01-Website_Crawler_using_Spider.ipynb +++ b/cookbooks/01-Website_Crawler_using_Spider.ipynb @@ -173,7 +173,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo search tool.\n", + "Here is a Task to crawl a website using the Spider Integration tool.\n", "\n", "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." ] @@ -207,7 +207,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + "Creating/Updating a task" ] }, { @@ -237,7 +237,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creates a execution worflow for the Task defined in the yaml file." + "Creates a execution worklow for the Task defined in the yaml file." ] }, { diff --git a/cookbooks/01-Website_Crawler_using_Spider.py b/cookbooks/01-Website_Crawler_using_Spider.py index 978fd3286..69d5785be 100644 --- a/cookbooks/01-Website_Crawler_using_Spider.py +++ b/cookbooks/01-Website_Crawler_using_Spider.py @@ -57,15 +57,20 @@ input={} ) +# Waiting for the execution to complete +import time +time.sleep(5) + # Getting the execution details execution = client.executions.get(execution.id) print("Execution output:", execution.output) # Listing all the steps of a defined task transitions = client.executions.transitions.list(execution_id=execution.id).items -print("Execution transitions:", transitions) +print("Execution Steps:") +for transition in transitions: + print(transition) -# Streaming the execution steps +# Stream the steps of the defined task print("Streaming execution transitions:") -for transition in client.executions.transitions.stream(execution_id=execution.id): - print(transition) \ No newline at end of file +print(client.executions.transitions.stream(execution_id=execution.id)) \ No newline at end of file diff --git a/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb b/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb index fded810a1..fb7957a5f 100644 --- a/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb +++ b/cookbooks/02-Sarcastic_News_Headline_Generator.ipynb @@ -200,8 +200,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo search tool.\n", - "\n", "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." ] }, @@ -242,7 +240,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + "Creating/Updating a task." ] }, { @@ -272,7 +270,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creates a execution worflow for the Task defined in the yaml file." + "Creates a execution worklow for the Task defined in the yaml file." ] }, { diff --git a/cookbooks/02-Sarcastic_News_Headline_Generator.py b/cookbooks/02-Sarcastic_News_Headline_Generator.py index c658a6569..cf305c15e 100644 --- a/cookbooks/02-Sarcastic_News_Headline_Generator.py +++ b/cookbooks/02-Sarcastic_News_Headline_Generator.py @@ -75,15 +75,21 @@ } ) +# Waiting for the execution to complete +import time +time.sleep(5) + # Getting the execution details execution = client.executions.get(execution.id) print("Execution output:", execution.output) # Listing all the steps of a defined task transitions = client.executions.transitions.list(execution_id=execution.id).items -print("Execution transitions:", transitions) +print("Execution Steps:") +for transition in transitions: + print(transition) # Stream the steps of the defined task print("Streaming execution transitions:") -for transition in client.executions.transitions.stream(execution_id=execution.id): - print(transition) +print(client.executions.transitions.stream(execution_id=execution.id)) + diff --git a/cookbooks/03-SmartResearcher_With_WebSearch.ipynb b/cookbooks/03-SmartResearcher_With_WebSearch.ipynb index c01b54652..9bb6436c4 100644 --- a/cookbooks/03-SmartResearcher_With_WebSearch.ipynb +++ b/cookbooks/03-SmartResearcher_With_WebSearch.ipynb @@ -213,8 +213,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo and Wikipedia tool.\n", - "\n", "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." ] }, @@ -272,7 +270,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + "Creating/Updating a task." ] }, { @@ -302,7 +300,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creates a execution worflow for the Task defined in the yaml file." + "Creates a execution worklow for the Task defined in the yaml file." ] }, { diff --git a/cookbooks/03-SmartResearcher_With_WebSearch.py b/cookbooks/03-SmartResearcher_With_WebSearch.py index 9996a5dd5..6b0b210fb 100644 --- a/cookbooks/03-SmartResearcher_With_WebSearch.py +++ b/cookbooks/03-SmartResearcher_With_WebSearch.py @@ -1,6 +1,6 @@ import uuid from julep import Client -import yaml +import yaml, time # Global UUID is generated for agent and task AGENT_UUID = uuid.uuid4() @@ -92,13 +92,19 @@ print(execution.id) +# Wait for the execution to complete +time.sleep(10) + # Getting the execution details execution = client.executions.get(execution.id) print(execution.output) # Listing all the steps of a defined task transitions = client.executions.transitions.list(execution_id=execution.id).items -print(transitions) +print("Execution Steps:") +for transition in transitions: + print(transition) -# Streaming the execution steps -client.executions.transitions.stream(execution_id=execution.id) \ No newline at end of file +# Stream the steps of the defined task +print("Streaming execution transitions:") +print(client.executions.transitions.stream(execution_id=execution.id)) \ No newline at end of file diff --git a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb index d7fc39840..dad492f20 100644 --- a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb +++ b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "div align=\"center\">\n", + "
\n", " \"julep\"\n", "
\n", "\n", @@ -219,8 +219,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here is a Task which uses a agent to generate a sarcastic response to a given text using a DuckDuckGo and Wikipedia tool.\n", - "\n", "More on how to define a task can be found [here](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)." ] }, @@ -295,7 +293,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creating/Updating a task to generate a sarcastic response to a given text using a Intergation." + "Creating/Updating a task." ] }, { @@ -325,7 +323,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Creates a execution worflow for the Task defined in the yaml file." + "Creates a execution worklow for the Task defined in the yaml file." ] }, { diff --git a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py index cde5d71a6..bd446a849 100644 --- a/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py +++ b/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.py @@ -107,6 +107,10 @@ print(f"Execution ID: {execution.id}") +# Wait for the execution to complete +import time +time.sleep(10) + # Getting the execution details execution = client.executions.get(execution.id) print("Execution Output:") @@ -114,10 +118,11 @@ # List all steps of the executed task print("Execution Steps:") -for item in client.executions.transitions.list(execution_id=execution.id).items: - print(item) +transitions = client.executions.transitions.list(execution_id=execution.id).items +print("Execution Steps:") +for transition in transitions: + print(transition) -# Stream the execution steps in real-time -print("Streaming Execution Steps:") -for step in client.executions.transitions.stream(execution_id=execution.id): - print(step) \ No newline at end of file +# Stream the steps of the defined task +print("Streaming execution transitions:") +print(client.executions.transitions.stream(execution_id=execution.id)) \ No newline at end of file diff --git a/cookbooks/05-Basic_Agent_Creation_and_Interaction.py b/cookbooks/05-Basic_Agent_Creation_and_Interaction.py index c701471f7..05b16f7bd 100644 --- a/cookbooks/05-Basic_Agent_Creation_and_Interaction.py +++ b/cookbooks/05-Basic_Agent_Creation_and_Interaction.py @@ -1,3 +1,5 @@ +# UNDER CONSTRUCTION - NOT WORKING YET + import uuid from julep import Client @@ -26,7 +28,7 @@ agent_id=AGENT_UUID, name=name, about=about, - model="gpt-4-turbo", + model="gpt-4o", ) print(f"Agent created with ID: {agent.id}") diff --git a/cookbooks/06-Designing_Multi-Step_Tasks.py b/cookbooks/06-Designing_Multi-Step_Tasks.py index 395f409cf..b623ae378 100644 --- a/cookbooks/06-Designing_Multi-Step_Tasks.py +++ b/cookbooks/06-Designing_Multi-Step_Tasks.py @@ -1,5 +1,5 @@ import uuid -import yaml +import yaml, time from julep import Client # Global UUID is generated for agent and task @@ -28,14 +28,13 @@ agent_id=AGENT_UUID, name=name, about=about, - model="gpt-4-turbo", + model="gpt-4o", ) # Add a web search tool to the agent client.agents.tools.create( agent_id=AGENT_UUID, name="web_search", - description="Search the web for information.", integration={ "provider": "brave", "method": "search", @@ -71,7 +70,7 @@ # Step 2: Tool Call - Web search for each question - foreach: - in: "_.split('\n')" + in: _.split('\\n') do: tool: web_search arguments: @@ -121,10 +120,13 @@ print(f"Execution ID: {execution.id}") +# Wait for the execution to complete +time.sleep(10) + # Getting the execution details execution = client.executions.get(execution.id) print("Execution Output:") -print(execution.output) +print(client.executions.transitions.list(execution_id=execution.id).items[0].output) # Listing all the steps of a defined task transitions = client.executions.transitions.list(execution_id=execution.id).items @@ -132,7 +134,6 @@ for transition in transitions: print(transition) -# Streaming the execution steps -print("Streaming Execution Steps:") -for transition in client.executions.transitions.stream(execution_id=execution.id): - print(transition) \ No newline at end of file +# Stream the steps of the defined task +print("Streaming execution transitions:") +print(client.executions.transitions.stream(execution_id=execution.id)) \ No newline at end of file diff --git a/cookbooks/07-Integrating_External_Tools_and_APIs.py b/cookbooks/07-Integrating_External_Tools_and_APIs.py index fa93f687a..71d8780d3 100644 --- a/cookbooks/07-Integrating_External_Tools_and_APIs.py +++ b/cookbooks/07-Integrating_External_Tools_and_APIs.py @@ -19,10 +19,10 @@ agent_id=AGENT_UUID, name=name, about=about, - model="gpt-4-turbo", + model="gpt-4o", ) -# Defining a Task +# Defining a Task with various step types task_def = yaml.safe_load(""" name: Comprehensive Analysis Report @@ -42,14 +42,14 @@ integration: provider: brave setup: - api_key: "YOUR_BRAVE_API_KEY" + api_key: "YOUR_API_KEY" - name: weather type: integration integration: provider: weather setup: - openweathermap_api_key: "YOUR_OPENWEATHERMAP_API_KEY" + openweathermap_api_key: "YOUR_API_KEY" - name: wikipedia type: integration @@ -59,20 +59,20 @@ main: - tool: brave_search arguments: - query: "{{inputs[0].topic}} latest developments" + query: "inputs[0].topic + ' latest developments'" - tool: weather arguments: - location: "{{inputs[0].location}}" + location: inputs[0].location - tool: wikipedia arguments: - query: "{{inputs[0].topic}}" + query: inputs[0].topic - prompt: - role: system content: >- - You are a comprehensive analyst. Your task is to create a detailed report on the topic "{{inputs[0].topic}}" + You are a comprehensive analyst. Your task is to create a detailed report on the topic {{inputs[0].topic}} using the information gathered from various sources. Include the following sections in your report: 1. Overview (based on Wikipedia data) @@ -88,8 +88,6 @@ Provide a well-structured, informative report that synthesizes information from all these sources. unwrap: true - -- return: _ """) # Creating/Updating a task @@ -104,23 +102,27 @@ task_id=task.id, input={ "topic": "Renewable Energy", - "location": "Berlin, Germany" + "location": "Berlin" } ) print(f"Execution ID: {execution.id}") +# Waiting for the execution to complete +import time +time.sleep(5) + # Getting the execution details execution = client.executions.get(execution.id) print("Execution Output:") print(execution.output) # List all steps of the executed task +transitions = client.executions.transitions.list(execution_id=execution.id).items print("Execution Steps:") -for item in client.executions.transitions.list(execution_id=execution.id).items: - print(item) +for transition in transitions: + print(transition) -# Stream the execution steps in real-time -print("Streaming Execution Steps:") -for step in client.executions.transitions.stream(execution_id=execution.id): - print(step) \ No newline at end of file +# Stream the steps of the defined task +print("Streaming execution transitions:") +print(client.executions.transitions.stream(execution_id=execution.id)) \ No newline at end of file diff --git a/cookbooks/08-Managing_Persistent_Sessions.py b/cookbooks/08-Managing_Persistent_Sessions.py index 40077b7df..ab2472ac8 100644 --- a/cookbooks/08-Managing_Persistent_Sessions.py +++ b/cookbooks/08-Managing_Persistent_Sessions.py @@ -27,7 +27,7 @@ agent_id=AGENT_UUID, name="Session Manager", about="An AI agent specialized in managing persistent sessions and context.", - model="gpt-4-turbo", + model="gpt-4o", ) # Defining a task for managing user context @@ -44,7 +44,7 @@ main: - prompt: - role: system + - role: system content: >- You are a session management agent. Your task is to maintain context across user interactions. Here's the current context: {{inputs[0].session_context}} @@ -53,16 +53,17 @@ Respond to the user and update the context with any new relevant information. unwrap: true - + - evaluate: - updated_context: >- - {**inputs[0].session_context, + session_context: >- + { + **inputs[0].session_context, 'last_interaction': inputs[0].user_input, - 'agent_response': _} + 'agent_response': _} - return: response: _ - context: outputs[1].updated_context + context: outputs[1].session_context """) # Creating the task @@ -78,7 +79,7 @@ def user_interaction(prompt): # Create a session session = client.sessions.create( - agent_id=AGENT_UUID, + agent=agent.id, context_overflow="adaptive" # Use adaptive context management ) @@ -100,10 +101,16 @@ def user_interaction(prompt): # Get the execution result result = client.executions.get(execution.id) + + # Wait for the execution to complete + time.sleep(2) # Update the context and print the response - context = result.output['context'] - print(f"Agent: {result.output['response']}") + final_response = client.executions.transitions.list(execution_id=result.id).items[0].output + print(final_response) + # print(client.executions.transitions.list(execution_id=result.id).items[0]) + context = final_response['session_context'] + print(f"Agent: {final_response['session_context']['agent_response']}") print(f"Updated Context: {context}") print() @@ -127,11 +134,13 @@ def user_interaction(prompt): ) overflow_result = client.executions.get(overflow_execution.id) -print(f"Agent response to large input: {overflow_result.output['response']}") -print(f"Updated context after overflow: {overflow_result.output['context']}") +# Wait for the execution to complete +time.sleep(2) +overflow_response = client.executions.transitions.list(execution_id=overflow_result.id).items[0].output +print(f"Agent response to large input: {overflow_response['session_context']['agent_response']}") +print(f"Updated context after overflow: {overflow_response['session_context']}") # Display session history print("\nSession History:") -history = client.sessions.messages.list(session_id=session.id) -for message in history.items: - print(f"{message.role}: {message.content}") \ No newline at end of file +history = client.sessions.history(session_id=session.id) +print(history) diff --git a/cookbooks/09-User_Management_and_Personalization.py b/cookbooks/09-User_Management_and_Personalization.py index 18f9df238..50ada9570 100644 --- a/cookbooks/09-User_Management_and_Personalization.py +++ b/cookbooks/09-User_Management_and_Personalization.py @@ -12,7 +12,7 @@ # 9. Display updated personalized recommendations after preference changes import uuid -import yaml +import yaml, time from julep import Client # Global UUIDs for agent and tasks @@ -29,7 +29,7 @@ agent_id=AGENT_UUID, name="Personalization Assistant", about="An AI agent specialized in user management and personalized content recommendations.", - model="gpt-4-turbo", + model="gpt-4o", ) # Defining a task for user registration and profile creation @@ -48,7 +48,7 @@ main: - prompt: - role: system + - role: system content: >- You are a user registration assistant. Create a user profile based on the following information: Username: {{inputs[0].username}} @@ -58,15 +58,13 @@ unwrap: true - evaluate: - user_profile: >- - { - "username": inputs[0].username, - "interests": inputs[0].interests, - "bio": _.split('\n\n')[0], - "content_preferences": _.split('\n\n')[1] - } - -- return: outputs[1].user_profile + username: inputs[0].username + interests: inputs[0].interests + bio: _.split('\\n')[0] + content_preferences: _.split('\\n')[1] + +- return: + profile: _ """) # Creating the registration task @@ -85,44 +83,38 @@ properties: user_profile: type: object - -tools: -- name: content_database - type: integration - integration: - provider: mock - setup: - data: [ - {"id": 1, "title": "Introduction to AI", "category": "Technology"}, - {"id": 2, "title": "Healthy Eating Habits", "category": "Health"}, - {"id": 3, "title": "Financial Planning 101", "category": "Finance"}, - {"id": 4, "title": "The Art of Photography", "category": "Art"}, - {"id": 5, "title": "Beginner's Guide to Yoga", "category": "Fitness"} - ] + description: User's profile containing their interests and preferences. + content_list: + type: array + description: List of available content to recommend from. + items: + type: object + properties: + id: + type: integer + title: + type: string + category: + type: string main: -- tool: content_database - arguments: {} - - prompt: - role: system + - role: system content: >- You are a content recommendation system. Based on the user's profile and the available content, recommend 3 pieces of content that best match the user's interests and preferences. - + User Profile: {{inputs[0].user_profile}} - + Available Content: - {{outputs[0]}} - + {{inputs[0].content_list}} + Provide your recommendations in the following format: 1. [Content ID] - [Content Title] - Reason for recommendation 2. [Content ID] - [Content Title] - Reason for recommendation 3. [Content ID] - [Content Title] - Reason for recommendation unwrap: true - -- return: _ """) # Creating the recommendation task @@ -141,19 +133,35 @@ def register_user(username, interests): "interests": interests } ) + # Wait for the execution to complete + time.sleep(2) result = client.executions.get(execution.id) - return result.output + user_result = client.executions.transitions.list(execution_id=result.id).items[0].output + return user_result -# Function to get personalized content recommendations +# Function to get personalized recommendations for a user def get_recommendations(user_profile): + content_list = [ + {"id": 1, "title": "Introduction to AI", "category": "Technology"}, + {"id": 2, "title": "Healthy Eating Habits", "category": "Health"}, + {"id": 3, "title": "Financial Planning 101", "category": "Finance"}, + {"id": 4, "title": "The Art of Photography", "category": "Art"}, + {"id": 5, "title": "Beginner's Guide to Yoga", "category": "Fitness"} + ] + execution = client.executions.create( task_id=RECOMMENDATION_TASK_UUID, input={ - "user_profile": user_profile + "user_profile": user_profile, + "content_list": content_list } ) + # Wait for the execution to complete + time.sleep(2) result = client.executions.get(execution.id) - return result.output + recommendation_respose = client.executions.transitions.list(execution_id=result.id).items[0].output + return recommendation_respose + # Function to update user preferences def update_user_preferences(user_profile, new_interests): diff --git a/cookbooks/10-Document_Management_and_Search.py b/cookbooks/10-Document_Management_and_Search.py index 87cc492aa..70db82d3f 100644 --- a/cookbooks/10-Document_Management_and_Search.py +++ b/cookbooks/10-Document_Management_and_Search.py @@ -10,8 +10,10 @@ # 7. Execute the document search task # 8. Display the search results +# UNDER CONSTRUCTION - YAML is working but the flow is not correct yet + import uuid -import yaml +import yaml,time from julep import Client # Global UUID is generated for agent and tasks @@ -43,21 +45,32 @@ items: type: object properties: + tile: + type: string content: type: string metadata: type: object + +tools: +- name: document_create + system: + resource: agent + subresource: doc + operation: create main: - over: inputs[0].documents map: tool: document_upload arguments: + agent_id: "'{agent.id}'" + title: _.title content: _.content metadata: _.metadata - prompt: - role: system + - role: system content: >- You have successfully uploaded and indexed {{len(outputs[0])}} documents. Provide a summary of the uploaded documents. @@ -82,14 +95,22 @@ filters: type: object +tools: +- name: document_search + system: + resource: agent + subresource: doc + operation: search + main: - tool: document_search arguments: - query: inputs[0].query - filters: inputs[0].filters + agent_id: "'{agent.id}'" + text: inputs[0].query + metadata_filters: inputs[0].filters - prompt: - role: system + - role: system content: >- Based on the search results, provide a summary of the most relevant documents found. Search query: {{inputs[0].query}} @@ -97,6 +118,7 @@ Results: {{outputs[0]}} + unwrap: true """) # Creating the search task @@ -109,14 +131,17 @@ # Sample documents sample_documents = [ { + "Title": "The Impact of Technology on Society", "content": "Artificial Intelligence (AI) is revolutionizing various industries, including healthcare, finance, and transportation.", "metadata": {"category": "technology", "author": "John Doe"} }, { + "Title": "Climate Change and Global Warming", "content": "Climate change is a pressing global issue that requires immediate action from governments, businesses, and individuals.", "metadata": {"category": "environment", "author": "Jane Smith"} }, { + "Title": "Remote Work and Digital Transformation", "content": "The COVID-19 pandemic has accelerated the adoption of remote work and digital technologies across many organizations.", "metadata": {"category": "business", "author": "Alice Johnson"} } @@ -129,8 +154,12 @@ ) print("Uploading and indexing documents...") +# Wait for the execution to complete +time.sleep(5) upload_result = client.executions.get(upload_execution.id) -print(upload_result.output) +upload_response = client.executions.transitions.list(upload_execution.id).items[0].output +print("Upload Result:") +print(upload_response) # Execute the document search task search_execution = client.executions.create( @@ -142,9 +171,9 @@ ) print("\nSearching documents...") +# Wait for the execution to complete +time.sleep(5) search_result = client.executions.get(search_execution.id) -print(search_result.output) - # Display the search results print("\nSearch Results:") for transition in client.executions.transitions.list(execution_id=search_execution.id).items: @@ -153,4 +182,5 @@ print(f"- {doc['content']} (Score: {doc['score']})") print("\nSearch Summary:") -print(search_result.output) \ No newline at end of file +search_response = client.executions.transitions.list(search_result.id).items[0].output +print(search_response) \ No newline at end of file diff --git a/cookbooks/11-Advanced_Chat_Interactions.py b/cookbooks/11-Advanced_Chat_Interactions.py index 692112be1..1a6b13026 100644 --- a/cookbooks/11-Advanced_Chat_Interactions.py +++ b/cookbooks/11-Advanced_Chat_Interactions.py @@ -12,6 +12,8 @@ # d. Integrating external information during the conversation # 6. Display the chat history and any relevant metrics +# UNDER CONSTRUCTION - YAML is working but the flow is not correct yet + import uuid import yaml import os @@ -34,14 +36,13 @@ agent_id=AGENT_UUID, name="Advanced Chat Assistant", about="An AI agent capable of handling complex conversations with context management and external integrations.", - model="gpt-4-turbo", + model="gpt-4o", ) # Add a web search tool to the agent client.agents.tools.create( agent_id=AGENT_UUID, name="web_search", - description="Search the web for information.", integration={ "provider": "brave", "method": "search", @@ -74,48 +75,49 @@ integration: provider: weather setup: - api_key: "YOUR_WEATHER_API_KEY" + api_key: "API_KEY" main: - evaluate: context_length: len(inputs[0].chat_history) -- if: - condition: _.context_length > 10 - then: - - evaluate: - summarized_history: "Summarize the following chat history: " + str(inputs[0].chat_history[-10:]) - - prompt: - role: system - content: >- - You are an advanced chat assistant. Here's a summary of the recent conversation: - {{outputs[1].summarized_history}} - - Now, respond to the user's latest input: {{inputs[0].user_input}} - else: - - prompt: - role: system - content: >- - You are an advanced chat assistant. Here's the conversation history: - {{inputs[0].chat_history}} - - Now, respond to the user's latest input: {{inputs[0].user_input}} - -- if: - condition: "weather" in inputs[0].user_input.lower() - then: - - tool: weather_api - arguments: - location: "New York" - - prompt: - role: system - content: >- - The user mentioned weather. Here's the current weather information for New York: - {{outputs[3]}} - - Incorporate this information into your response. - -- return: _ +- if: "_.context_length > '10'" + then: + evaluate: + summarized_history: str(inputs[0].chat_history[-10:]) + prompt: + - role: system + content: >- + You are an advanced chat assistant. Here's a summary of the recent conversation: + {{outputs[1].summarized_history}} + + Now, respond to the user's latest input: {{inputs[0].user_input}} + unwrap: true + else: + prompt: + - role: system + content: >- + You are an advanced chat assistant. Here's the conversation history: + {{inputs[0].chat_history}} + + Now, respond to the user's latest input: {{inputs[0].user_input}} + unwrap: true + +- if: "'weather' in inputs[0].user_input.lower()" + then: + tool: weather_api + arguments: + location: inputs[0].user_input.lower.split('weather')[1].strip() + prompt: + - role: system + content: >- + The user mentioned weather. Here's the current weather information for {{inputs[0].user_input.lower.split('weather')[1].strip()}} + + Incorporate this information into your response. + unwrap: true + +- return: + summary: _ """) # Creating the chat task @@ -139,7 +141,7 @@ def run_chat_session(): chat_history = [] print("Starting advanced chat session. Type 'exit' to end the conversation.") - session = client.sessions.create(agent_id=AGENT_UUID) + session = client.sessions.create(agent=AGENT_UUID) while True: user_input = get_user_input() @@ -155,8 +157,11 @@ def run_chat_session(): "chat_history": chat_history } ) - + # Wait for the execution to complete + time.sleep(3) result = client.executions.get(execution.id) + print(client.executions.transitions.list(execution.id).items) + print(f"Execution result: {result.output}") assistant_response = result.output chat_history.append({"role": "assistant", "content": assistant_response}) @@ -169,9 +174,4 @@ def run_chat_session(): display_chat_history(chat_history) # Run the chat session -run_chat_session() - -# Display execution metrics (optional) -print("\nExecution Metrics:") -for transition in client.executions.transitions.list(execution_id=execution.id).items: - print(f"Step: {transition.type}, Duration: {transition.duration_ms}ms") \ No newline at end of file +run_chat_session() \ No newline at end of file diff --git a/cookbooks/12-Monitoring_Task_Executions.py b/cookbooks/12-Monitoring_Task_Executions.py index 7e5f576a0..675ff27a1 100644 --- a/cookbooks/12-Monitoring_Task_Executions.py +++ b/cookbooks/12-Monitoring_Task_Executions.py @@ -12,6 +12,8 @@ # 5. Execute the task and demonstrate real-time monitoring # 6. Display execution summary and metrics +# UNDER CONSTRUCTION - NOT WORKING YET + import uuid import yaml from julep import Client @@ -30,7 +32,7 @@ agent_id=AGENT_UUID, name="Task Execution Monitor", about="An AI agent designed to monitor and manage complex task executions.", - model="gpt-4-turbo", + model="gpt-4o", ) # Defining a multi-step task that simulates a complex workflow diff --git a/cookbooks/13-Error_Handling_and_Recovery.py b/cookbooks/13-Error_Handling_and_Recovery.py index b45732ed5..f0cdf68be 100644 --- a/cookbooks/13-Error_Handling_and_Recovery.py +++ b/cookbooks/13-Error_Handling_and_Recovery.py @@ -9,6 +9,8 @@ # 6. Show how to log and report errors # 7. Demonstrate graceful degradation when a step fails +# UNDER CONSTRUCTION - NOT WORKING YET + import uuid import yaml import time @@ -27,7 +29,7 @@ agent_id=AGENT_UUID, name="Error Handler", about="An AI agent specialized in demonstrating error handling and recovery mechanisms.", - model="gpt-4-turbo", + model="gpt-4o", ) # Defining a task with potential errors and recovery mechanisms @@ -73,45 +75,45 @@ type: string main: + - switch: - value: inputs[0].operation - cases: - divide: - - tool: divide - arguments: - divisor: inputs[0].value - on_error: - retry: - max_attempts: 3 - delay: 2 - fallback: - return: "Error: Division by zero or invalid input" - api_call: - - tool: api_call - arguments: - endpoint: "/status/{{inputs[0].value}}" - on_error: - retry: - max_attempts: 3 - delay: 5 - fallback: - return: "Error: API call failed after multiple attempts" - process_data: - - evaluate: - data: "'Sample data: ' + str(inputs[0].value)" - - tool: process_data - arguments: - data: _.data - on_error: - log: "Error occurred while processing data" - return: "Error: Data processing failed" + case: "inputs[0].operation == 'divide'" + tool: divide + arguments: + divisor: inputs[0].value + on_error: + retry: + max_attempts: 3 + delay: 2 + fallback: + return: "Error: Division by zero or invalid input" + case: "inputs[0].operation == 'api_call'" + tool: api_call + arguments: + endpoint: "/status/{{inputs[0].value}}" + on_error: + retry: + max_attempts: 3 + delay: 5 + fallback: + return: "Error: API call failed after multiple attempts" + case: "inputs[0].operation == 'process_data'" + evaluate: + data: "'Sample data: ' + str(inputs[0].value)" + tool: process_data + arguments: + data: _.data + on_error: + log: "Error occurred while processing data" + return: "Error: Data processing failed" - prompt: - role: system + - role: system content: >- Summarize the result of the operation: Operation: {{inputs[0].operation}} - Result: {{_}} + Result: {{_}}] + unwrap: true """) # Creating the task From 2cd6ab0598c0aa7db2479489c7cc739c710dc612 Mon Sep 17 00:00:00 2001 From: Bilal Mirza <84387676+bilalmirza74@users.noreply.github.com> Date: Sat, 12 Oct 2024 00:44:46 +0530 Subject: [PATCH 092/113] Fix: 404 - page not found #631 (#632) > [!IMPORTANT] > Fix broken `CONTRIBUTING.md` link and update Table of Contents in `README.md` and `docs/README.md`. > > - **Links**: > - Update `CONTRIBUTING.md` link to absolute URL in `README.md` and `docs/README.md`. > - **Table of Contents**: > - Add "Call for Contributors!" and "DevFest.AI October 2024" sections to TOC in `README.md` and `docs/README.md`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for e31f2471037ff7ba56941017845573647ebb88c6. It will automatically update as commits are pushed. Co-authored-by: Diwank Singh Tomer --- README.md | 9 ++++++++- docs/README.md | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d57877707..5359f6c38 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ We're excited to welcome new contributors to the Julep project! We've created several "good first issues" to help you get started. Here's how you can contribute: -1. Check out our [CONTRIBUTING.md](CONTRIBUTING.md) file for guidelines on how to contribute. +1. Check out our [CONTRIBUTING.md](https://github.com/julep-ai/julep/blob/dev/CONTRIBUTING.md) file for guidelines on how to contribute. 2. Browse our [good first issues](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to find a task that interests you. 3. If you have any questions or need help, don't hesitate to reach out on our [Discord](https://discord.com/invite/JTSBGRZrzj) channel. @@ -69,6 +69,8 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓

📖 Table of Contents

+- [🌟 Call for Contributors!](#-call-for-contributors) + - [🎉 DevFest.AI October 2024](#-devfestai-october-2024) - [Introduction](#introduction) - [Quick Example](#quick-example) - [Key Features](#key-features) @@ -92,6 +94,11 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Concepts](#concepts) - [Understanding Tasks](#understanding-tasks) - [Types of Workflow Steps](#types-of-workflow-steps) + - [Common Steps](#common-steps) + - [Key-Value Steps](#key-value-steps) + - [Iteration Steps](#iteration-steps) + - [Conditional Steps](#conditional-steps) + - [Other Control Flow](#other-control-flow) - [Advanced Features](#advanced-features) - [Adding Tools to Agents](#adding-tools-to-agents) - [Managing Sessions and Users](#managing-sessions-and-users) diff --git a/docs/README.md b/docs/README.md index d57877707..5359f6c38 100644 --- a/docs/README.md +++ b/docs/README.md @@ -38,7 +38,7 @@ We're excited to welcome new contributors to the Julep project! We've created several "good first issues" to help you get started. Here's how you can contribute: -1. Check out our [CONTRIBUTING.md](CONTRIBUTING.md) file for guidelines on how to contribute. +1. Check out our [CONTRIBUTING.md](https://github.com/julep-ai/julep/blob/dev/CONTRIBUTING.md) file for guidelines on how to contribute. 2. Browse our [good first issues](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to find a task that interests you. 3. If you have any questions or need help, don't hesitate to reach out on our [Discord](https://discord.com/invite/JTSBGRZrzj) channel. @@ -69,6 +69,8 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓

📖 Table of Contents

+- [🌟 Call for Contributors!](#-call-for-contributors) + - [🎉 DevFest.AI October 2024](#-devfestai-october-2024) - [Introduction](#introduction) - [Quick Example](#quick-example) - [Key Features](#key-features) @@ -92,6 +94,11 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Concepts](#concepts) - [Understanding Tasks](#understanding-tasks) - [Types of Workflow Steps](#types-of-workflow-steps) + - [Common Steps](#common-steps) + - [Key-Value Steps](#key-value-steps) + - [Iteration Steps](#iteration-steps) + - [Conditional Steps](#conditional-steps) + - [Other Control Flow](#other-control-flow) - [Advanced Features](#advanced-features) - [Adding Tools to Agents](#adding-tools-to-agents) - [Managing Sessions and Users](#managing-sessions-and-users) From 1f340e7e9c5ebdc2f80b368244f23a5049806e0a Mon Sep 17 00:00:00 2001 From: creatorrr Date: Fri, 11 Oct 2024 19:15:00 +0000 Subject: [PATCH 093/113] chore(docs): update TOC --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 5359f6c38..3d82661b5 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,6 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓

📖 Table of Contents

-- [🌟 Call for Contributors!](#-call-for-contributors) - - [🎉 DevFest.AI October 2024](#-devfestai-october-2024) - [Introduction](#introduction) - [Quick Example](#quick-example) - [Key Features](#key-features) @@ -94,11 +92,6 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Concepts](#concepts) - [Understanding Tasks](#understanding-tasks) - [Types of Workflow Steps](#types-of-workflow-steps) - - [Common Steps](#common-steps) - - [Key-Value Steps](#key-value-steps) - - [Iteration Steps](#iteration-steps) - - [Conditional Steps](#conditional-steps) - - [Other Control Flow](#other-control-flow) - [Advanced Features](#advanced-features) - [Adding Tools to Agents](#adding-tools-to-agents) - [Managing Sessions and Users](#managing-sessions-and-users) From 5ba7f44ec9ac2ddc142d7ce7c84b6533d7d8bb3a Mon Sep 17 00:00:00 2001 From: whiterabbit1983 Date: Fri, 11 Oct 2024 23:09:49 +0300 Subject: [PATCH 094/113] feat: Add prometheus and grafana support (#523) > [!IMPORTANT] > Add Prometheus and Grafana support with FastAPI metrics and Docker Compose configurations. > > - **Metrics Integration**: > - Add `prometheus-fastapi-instrumentator` to `web.py` for FastAPI metrics. > - Update `pyproject.toml` to include `prometheus-fastapi-instrumentator` dependency. > - **Docker Compose**: > - Add `prometheus/docker-compose.yml` for Prometheus configuration. > - Add `grafana/docker-compose.yml` for Grafana configuration. > - Update root `docker-compose.yml` to include Prometheus and Grafana services. > - **Traefik Configuration**: > - Update `traefik.yml.template` to route `/grafana` to Grafana service. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 124ecc7319b4d2b32075be47b9b5dbe69432a013. It will automatically update as commits are pushed. --------- Co-authored-by: Diwank Singh Tomer --- agents-api/agents_api/web.py | 4 + agents-api/poetry.lock | 1434 +++++++++-------- agents-api/pyproject.toml | 1 + docker-compose.yml | 2 + grafana/docker-compose.yml | 20 + .../provisioning/datasources/datasource.yml | 9 + prometheus/config/prometheus.yml | 24 + prometheus/docker-compose.yml | 23 + 8 files changed, 880 insertions(+), 637 deletions(-) create mode 100644 grafana/docker-compose.yml create mode 100644 grafana/provisioning/datasources/datasource.yml create mode 100644 prometheus/config/prometheus.yml create mode 100644 prometheus/docker-compose.yml diff --git a/agents-api/agents_api/web.py b/agents-api/agents_api/web.py index 048887f68..56bdbb48a 100644 --- a/agents-api/agents_api/web.py +++ b/agents-api/agents_api/web.py @@ -13,6 +13,7 @@ from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from litellm.exceptions import APIError +from prometheus_fastapi_instrumentator import Instrumentator from pycozo.client import QueryException from scalar_fastapi import get_scalar_api_reference from temporalio.service import RPCError @@ -100,6 +101,9 @@ def register_exceptions(app: FastAPI) -> None: root_path=api_prefix, ) +# Enable metrics +Instrumentator().instrument(app).expose(app) + # Create a new router for the docs scalar_router = APIRouter() diff --git a/agents-api/poetry.lock b/agents-api/poetry.lock index 907669721..3c071ae9d 100644 --- a/agents-api/poetry.lock +++ b/agents-api/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -13,102 +13,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.9" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, - {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, - {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, - {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, - {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, - {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, - {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, - {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, - {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, - {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, - {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, - {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, - {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, - {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, - {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, - {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, ] [package.dependencies] @@ -180,13 +180,13 @@ files = [ [[package]] name = "argcomplete" -version = "3.5.0" +version = "3.5.1" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" files = [ - {file = "argcomplete-3.5.0-py3-none-any.whl", hash = "sha256:d4bcf3ff544f51e16e54228a7ac7f486ed70ebf2ecfe49a63a91171c76bf029b"}, - {file = "argcomplete-3.5.0.tar.gz", hash = "sha256:4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b"}, + {file = "argcomplete-3.5.1-py3-none-any.whl", hash = "sha256:1a1d148bdaa3e3b93454900163403df41448a248af01b6e849edc5ac08e6c363"}, + {file = "argcomplete-3.5.1.tar.gz", hash = "sha256:eb1ee355aa2557bd3d0145de7b06b2a45b0ce461e1e7813f5d066039ab4177b4"}, ] [package.extras] @@ -371,33 +371,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "24.8.0" +version = "24.10.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, ] [package.dependencies] @@ -409,7 +409,7 @@ platformdirs = ">=2" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -523,101 +523,116 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -762,7 +777,10 @@ inflect = ">=4.1.0,<6.0" isort = ">=4.3.21,<6.0" jinja2 = ">=2.10.1,<4.0" packaging = "*" -pydantic = {version = ">=1.10.0,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.12\" and python_version < \"4.0\""} +pydantic = [ + {version = ">=1.10.0,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, + {version = ">=1.10.0,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.11\" and python_version < \"4.0\""}, +] pyyaml = ">=6.0.1" [package.extras] @@ -773,33 +791,37 @@ validation = ["openapi-spec-validator (>=0.2.8,<0.7.0)", "prance (>=0.18.2)"] [[package]] name = "debugpy" -version = "1.8.6" +version = "1.8.7" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, - {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, - {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, - {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, - {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, - {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, - {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, - {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, - {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, - {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, - {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, - {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, - {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, - {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, - {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, - {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, - {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, - {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, - {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, - {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, - {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, - {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, + {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, + {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, + {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, + {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, + {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, + {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, + {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, + {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, + {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, + {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, + {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, + {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, + {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, + {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, + {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, + {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, + {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, + {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, + {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, + {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, + {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, + {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, + {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, + {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, + {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, + {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, ] [[package]] @@ -1235,13 +1257,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.25.1" +version = "0.25.2" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, - {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, + {file = "huggingface_hub-0.25.2-py3-none-any.whl", hash = "sha256:1897caf88ce7f97fe0110603d8f66ac264e3ba6accdf30cd66cc0fed5282ad25"}, + {file = "huggingface_hub-0.25.2.tar.gz", hash = "sha256:a1014ea111a5f40ccd23f7f7ba8ac46e20fa3b658ced1f86a00c75c06ec6423c"}, ] [package.dependencies] @@ -1513,72 +1535,84 @@ Jinja2 = ">=2.2" [[package]] name = "jiter" -version = "0.5.0" +version = "0.6.1" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, - {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, - {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, - {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, - {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, - {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, - {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, - {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, - {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, - {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, - {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, - {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, - {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, - {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, - {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, - {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, - {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, - {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, - {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, - {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, - {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, - {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, - {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, - {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, - {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, - {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, - {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, - {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, - {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, - {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, - {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, + {file = "jiter-0.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d08510593cb57296851080018006dfc394070178d238b767b1879dc1013b106c"}, + {file = "jiter-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adef59d5e2394ebbad13b7ed5e0306cceb1df92e2de688824232a91588e77aa7"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e02f7a27f2bcc15b7d455c9df05df8ffffcc596a2a541eeda9a3110326e7a3"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed69a7971d67b08f152c17c638f0e8c2aa207e9dd3a5fcd3cba294d39b5a8d2d"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2019d966e98f7c6df24b3b8363998575f47d26471bfb14aade37630fae836a1"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36c0b51a285b68311e207a76c385650322734c8717d16c2eb8af75c9d69506e7"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:220e0963b4fb507c525c8f58cde3da6b1be0bfddb7ffd6798fb8f2531226cdb1"}, + {file = "jiter-0.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa25c7a9bf7875a141182b9c95aed487add635da01942ef7ca726e42a0c09058"}, + {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e90552109ca8ccd07f47ca99c8a1509ced93920d271bb81780a973279974c5ab"}, + {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:67723a011964971864e0b484b0ecfee6a14de1533cff7ffd71189e92103b38a8"}, + {file = "jiter-0.6.1-cp310-none-win32.whl", hash = "sha256:33af2b7d2bf310fdfec2da0177eab2fedab8679d1538d5b86a633ebfbbac4edd"}, + {file = "jiter-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:7cea41c4c673353799906d940eee8f2d8fd1d9561d734aa921ae0f75cb9732f4"}, + {file = "jiter-0.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b03c24e7da7e75b170c7b2b172d9c5e463aa4b5c95696a368d52c295b3f6847f"}, + {file = "jiter-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47fee1be677b25d0ef79d687e238dc6ac91a8e553e1a68d0839f38c69e0ee491"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0d2f6e01a8a0fb0eab6d0e469058dab2be46ff3139ed2d1543475b5a1d8e7"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b809e39e342c346df454b29bfcc7bca3d957f5d7b60e33dae42b0e5ec13e027"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9ac7c2f092f231f5620bef23ce2e530bd218fc046098747cc390b21b8738a7a"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e51a2d80d5fe0ffb10ed2c82b6004458be4a3f2b9c7d09ed85baa2fbf033f54b"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3343d4706a2b7140e8bd49b6c8b0a82abf9194b3f0f5925a78fc69359f8fc33c"}, + {file = "jiter-0.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82521000d18c71e41c96960cb36e915a357bc83d63a8bed63154b89d95d05ad1"}, + {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c843e7c1633470708a3987e8ce617ee2979ee18542d6eb25ae92861af3f1d62"}, + {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2e861658c3fe849efc39b06ebb98d042e4a4c51a8d7d1c3ddc3b1ea091d0784"}, + {file = "jiter-0.6.1-cp311-none-win32.whl", hash = "sha256:7d72fc86474862c9c6d1f87b921b70c362f2b7e8b2e3c798bb7d58e419a6bc0f"}, + {file = "jiter-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:3e36a320634f33a07794bb15b8da995dccb94f944d298c8cfe2bd99b1b8a574a"}, + {file = "jiter-0.6.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1fad93654d5a7dcce0809aff66e883c98e2618b86656aeb2129db2cd6f26f867"}, + {file = "jiter-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4e6e340e8cd92edab7f6a3a904dbbc8137e7f4b347c49a27da9814015cc0420c"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:691352e5653af84ed71763c3c427cff05e4d658c508172e01e9c956dfe004aba"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:defee3949313c1f5b55e18be45089970cdb936eb2a0063f5020c4185db1b63c9"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26d2bdd5da097e624081c6b5d416d3ee73e5b13f1703bcdadbb1881f0caa1933"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18aa9d1626b61c0734b973ed7088f8a3d690d0b7f5384a5270cd04f4d9f26c86"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a3567c8228afa5ddcce950631c6b17397ed178003dc9ee7e567c4c4dcae9fa0"}, + {file = "jiter-0.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c0507131c922defe3f04c527d6838932fcdfd69facebafd7d3574fa3395314"}, + {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:540fcb224d7dc1bcf82f90f2ffb652df96f2851c031adca3c8741cb91877143b"}, + {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e7b75436d4fa2032b2530ad989e4cb0ca74c655975e3ff49f91a1a3d7f4e1df2"}, + {file = "jiter-0.6.1-cp312-none-win32.whl", hash = "sha256:883d2ced7c21bf06874fdeecab15014c1c6d82216765ca6deef08e335fa719e0"}, + {file = "jiter-0.6.1-cp312-none-win_amd64.whl", hash = "sha256:91e63273563401aadc6c52cca64a7921c50b29372441adc104127b910e98a5b6"}, + {file = "jiter-0.6.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:852508a54fe3228432e56019da8b69208ea622a3069458252f725d634e955b31"}, + {file = "jiter-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f491cc69ff44e5a1e8bc6bf2b94c1f98d179e1aaf4a554493c171a5b2316b701"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc56c8f0b2a28ad4d8047f3ae62d25d0e9ae01b99940ec0283263a04724de1f3"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51b58f7a0d9e084a43b28b23da2b09fc5e8df6aa2b6a27de43f991293cab85fd"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f79ce15099154c90ef900d69c6b4c686b64dfe23b0114e0971f2fecd306ec6c"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03a025b52009f47e53ea619175d17e4ded7c035c6fbd44935cb3ada11e1fd592"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74a8d93718137c021d9295248a87c2f9fdc0dcafead12d2930bc459ad40f885"}, + {file = "jiter-0.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40b03b75f903975f68199fc4ec73d546150919cb7e534f3b51e727c4d6ccca5a"}, + {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:825651a3f04cf92a661d22cad61fc913400e33aa89b3e3ad9a6aa9dc8a1f5a71"}, + {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:928bf25eb69ddb292ab8177fe69d3fbf76c7feab5fce1c09265a7dccf25d3991"}, + {file = "jiter-0.6.1-cp313-none-win32.whl", hash = "sha256:352cd24121e80d3d053fab1cc9806258cad27c53cad99b7a3cac57cf934b12e4"}, + {file = "jiter-0.6.1-cp313-none-win_amd64.whl", hash = "sha256:be7503dd6f4bf02c2a9bacb5cc9335bc59132e7eee9d3e931b13d76fd80d7fda"}, + {file = "jiter-0.6.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:31d8e00e1fb4c277df8ab6f31a671f509ebc791a80e5c61fdc6bc8696aaa297c"}, + {file = "jiter-0.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77c296d65003cd7ee5d7b0965f6acbe6cffaf9d1fa420ea751f60ef24e85fed5"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeeb0c0325ef96c12a48ea7e23e2e86fe4838e6e0a995f464cf4c79fa791ceeb"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a31c6fcbe7d6c25d6f1cc6bb1cba576251d32795d09c09961174fe461a1fb5bd"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59e2b37f3b9401fc9e619f4d4badcab2e8643a721838bcf695c2318a0475ae42"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bae5ae4853cb9644144e9d0755854ce5108d470d31541d83f70ca7ecdc2d1637"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df588e9c830b72d8db1dd7d0175af6706b0904f682ea9b1ca8b46028e54d6e9"}, + {file = "jiter-0.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15f8395e835cf561c85c1adee72d899abf2733d9df72e9798e6d667c9b5c1f30"}, + {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a99d4e0b5fc3b05ea732d67eb2092fe894e95a90e6e413f2ea91387e228a307"}, + {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a311df1fa6be0ccd64c12abcd85458383d96e542531bafbfc0a16ff6feda588f"}, + {file = "jiter-0.6.1-cp38-none-win32.whl", hash = "sha256:81116a6c272a11347b199f0e16b6bd63f4c9d9b52bc108991397dd80d3c78aba"}, + {file = "jiter-0.6.1-cp38-none-win_amd64.whl", hash = "sha256:13f9084e3e871a7c0b6e710db54444088b1dd9fbefa54d449b630d5e73bb95d0"}, + {file = "jiter-0.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f1c53615fcfec3b11527c08d19cff6bc870da567ce4e57676c059a3102d3a082"}, + {file = "jiter-0.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f791b6a4da23238c17a81f44f5b55d08a420c5692c1fda84e301a4b036744eb1"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c97e90fec2da1d5f68ef121444c2c4fa72eabf3240829ad95cf6bbeca42a301"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cbc1a66b4e41511209e97a2866898733c0110b7245791ac604117b7fb3fedb7"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e85f9e12cd8418ab10e1fcf0e335ae5bb3da26c4d13a0fd9e6a17a674783b6"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08be33db6dcc374c9cc19d3633af5e47961a7b10d4c61710bd39e48d52a35824"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:677be9550004f5e010d673d3b2a2b815a8ea07a71484a57d3f85dde7f14cf132"}, + {file = "jiter-0.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8bd065be46c2eecc328e419d6557bbc37844c88bb07b7a8d2d6c91c7c4dedc9"}, + {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bd95375ce3609ec079a97c5d165afdd25693302c071ca60c7ae1cf826eb32022"}, + {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db459ed22d0208940d87f614e1f0ea5a946d29a3cfef71f7e1aab59b6c6b2afb"}, + {file = "jiter-0.6.1-cp39-none-win32.whl", hash = "sha256:d71c962f0971347bd552940ab96aa42ceefcd51b88c4ced8a27398182efa8d80"}, + {file = "jiter-0.6.1-cp39-none-win_amd64.whl", hash = "sha256:d465db62d2d10b489b7e7a33027c4ae3a64374425d757e963f86df5b5f2e7fc5"}, + {file = "jiter-0.6.1.tar.gz", hash = "sha256:e19cd21221fc139fb032e4112986656cb2739e9fe6d84c13956ab30ccc7d4449"}, ] [[package]] @@ -1634,13 +1668,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.12.1" +version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [package.dependencies] @@ -1648,13 +1682,13 @@ referencing = ">=0.31.0" [[package]] name = "julep" -version = "1.14.0" +version = "1.16.0" description = "The official Python library for the julep API" optional = false python-versions = ">=3.7" files = [ - {file = "julep-1.14.0-py3-none-any.whl", hash = "sha256:a2770e63e94bc3ee21e4408d5b9e1595b0cb70cf20abecf3088f66b649616ece"}, - {file = "julep-1.14.0.tar.gz", hash = "sha256:22446414c66983d7496f5857a8b57e76394d3c2ce204bfee3cf5c6c68c4663a5"}, + {file = "julep-1.16.0-py3-none-any.whl", hash = "sha256:db84751b45b618bb3793809da87b745c05ee2a2330e819c394427d8a68d1f26b"}, + {file = "julep-1.16.0.tar.gz", hash = "sha256:776f8b86f8672bc98ade814ca89a505a566897297bc4dd0292ecfd35bfd67ca7"}, ] [package.dependencies] @@ -1883,53 +1917,59 @@ files = [ [[package]] name = "libcst" -version = "1.4.0" -description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.12 programs." +version = "1.5.0" +description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.13 programs." optional = false python-versions = ">=3.9" files = [ - {file = "libcst-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:279b54568ea1f25add50ea4ba3d76d4f5835500c82f24d54daae4c5095b986aa"}, - {file = "libcst-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3401dae41fe24565387a65baee3887e31a44e3e58066b0250bc3f3ccf85b1b5a"}, - {file = "libcst-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1989fa12d3cd79118ebd29ebe2a6976d23d509b1a4226bc3d66fcb7cb50bd5d"}, - {file = "libcst-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:addc6d585141a7677591868886f6bda0577529401a59d210aa8112114340e129"}, - {file = "libcst-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17d71001cb25e94cfe8c3d997095741a8c4aa7a6d234c0f972bc42818c88dfaf"}, - {file = "libcst-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2d47de16d105e7dd5f4e01a428d9f4dc1e71efd74f79766daf54528ce37f23c3"}, - {file = "libcst-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6227562fc5c9c1efd15dfe90b0971ae254461b8b6b23c1b617139b6003de1c1"}, - {file = "libcst-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3399e6c95df89921511b44d8c5bf6a75bcbc2d51f1f6429763609ba005c10f6b"}, - {file = "libcst-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48601e3e590e2d6a7ab8c019cf3937c70511a78d778ab3333764531253acdb33"}, - {file = "libcst-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42797309bb725f0f000510d5463175ccd7155395f09b5e7723971b0007a976d"}, - {file = "libcst-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb4e42ea107a37bff7f9fdbee9532d39f9ea77b89caa5c5112b37057b12e0838"}, - {file = "libcst-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:9d0cc3c5a2a51fa7e1d579a828c0a2e46b2170024fd8b1a0691c8a52f3abb2d9"}, - {file = "libcst-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7ece51d935bc9bf60b528473d2e5cc67cbb88e2f8146297e40ee2c7d80be6f13"}, - {file = "libcst-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:81653dea1cdfa4c6520a7c5ffb95fa4d220cbd242e446c7a06d42d8636bfcbba"}, - {file = "libcst-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6abce0e66bba2babfadc20530fd3688f672d565674336595b4623cd800b91ef"}, - {file = "libcst-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da9d7dc83801aba3b8d911f82dc1a375db0d508318bad79d9fb245374afe068"}, - {file = "libcst-1.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c54aa66c86d8ece9c93156a2cf5ca512b0dce40142fe9e072c86af2bf892411"}, - {file = "libcst-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:62e2682ee1567b6a89c91853865372bf34f178bfd237853d84df2b87b446e654"}, - {file = "libcst-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8ecdba8934632b4dadacb666cd3816627a6ead831b806336972ccc4ba7ca0e9"}, - {file = "libcst-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8e54c777b8d27339b70f304d16fc8bc8674ef1bd34ed05ea874bf4921eb5a313"}, - {file = "libcst-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:061d6855ef30efe38b8a292b7e5d57c8e820e71fc9ec9846678b60a934b53bbb"}, - {file = "libcst-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb0abf627ee14903d05d0ad9b2c6865f1b21eb4081e2c7bea1033f85db2b8bae"}, - {file = "libcst-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d024f44059a853b4b852cfc04fec33e346659d851371e46fc8e7c19de24d3da9"}, - {file = "libcst-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3c6a8faab9da48c5b371557d0999b4ca51f4f2cbd37ee8c2c4df0ac01c781465"}, - {file = "libcst-1.4.0.tar.gz", hash = "sha256:449e0b16604f054fa7f27c3ffe86ea7ef6c409836fe68fe4e752a1894175db00"}, + {file = "libcst-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:23d0e07fd3ed11480f8993a1e99d58a45f914a711b14f858b8db08ae861a8a34"}, + {file = "libcst-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d92c5ae2e2dc9356ad7e3d05077d9b7e5065423e45788fd86729c88729e45c6e"}, + {file = "libcst-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96adc45e96476350df6b8a5ddbb1e1d6a83a7eb3f13087e52eb7cd2f9b65bcc7"}, + {file = "libcst-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5978fd60c66794bb60d037b2e6427ea52d032636e84afce32b0f04e1cf500a"}, + {file = "libcst-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6502aeb11412afc759036160c686be1107eb5a4466db56b207c786b9b4da7c4"}, + {file = "libcst-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cccfc0a78e110c0d0a9d2c6fdeb29feb5274c9157508a8baef7edf352420f6d"}, + {file = "libcst-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:585b3aa705b3767d717d2100935d8ef557275ecdd3fac81c3e28db0959efb0ea"}, + {file = "libcst-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8935dd3393e30c2f97344866a4cb14efe560200e232166a8db1de7865c2ef8b2"}, + {file = "libcst-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc80ea16c7d44e38f193e4d4ef7ff1e0ba72d8e60e8b61ac6f4c87f070a118bd"}, + {file = "libcst-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02be4aab728261bb76d16e77c9a457884cebb60d09c8edee844de43b0e08aff7"}, + {file = "libcst-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8fcd78be4d9ce3c36d0c5d0bdd384e0c7d5f72970a9e4ebd56070141972b4ad"}, + {file = "libcst-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:52b6aadfe54e3ae52c3b815eaaa17ba4da9ff010d5e8adf6a70697872886dd10"}, + {file = "libcst-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83bc5fbe34d33597af1d5ea113dcb9b5dd5afe5a5f4316bac4293464d5e3971a"}, + {file = "libcst-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f10124bf99a0b075eae136ef0ce06204e5f6b8da4596a9c4853a0663e80ddf3"}, + {file = "libcst-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e581af6127c5af4c9f483e5986d94f0c6b2366967ee134f0a8eba0aa4c8c12"}, + {file = "libcst-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dba93cca0a5c6d771ed444c44d21ce8ea9b277af7036cea3743677aba9fbbb8"}, + {file = "libcst-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b5c4d87721a7bab265c202575809b810815ab81d5e2e7a5d4417a087975840"}, + {file = "libcst-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:b48bf71d52c1e891a0948465a94d9817b5fc1ec1a09603566af90585f3b11948"}, + {file = "libcst-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:88520b6dea59eaea0cae80f77c0a632604a82c5b2d23dedb4b5b34035cbf1615"}, + {file = "libcst-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:208ea92d80b2eeed8cbc879d5f39f241582a5d56b916b1b65ed2be2f878a2425"}, + {file = "libcst-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4592872aaf5b7fa5c2727a7d73c0985261f1b3fe7eff51f4fd5b8174f30b4e2"}, + {file = "libcst-1.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2788b2b5838b78fe15df8e9fa6b6903195ea49b2d2ba43e8f423f6c90e4b69f"}, + {file = "libcst-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5b5bcd3a9ba92840f27ad34eaa038acbee195ec337da39536c0a2efbbf28efd"}, + {file = "libcst-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:4d6acb0bdee1e55b44c6215c59755ec4693ac01e74bb1fde04c37358b378835d"}, + {file = "libcst-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6453b5a8755a6eee3ad67ee246f13a8eac9827d2cfc8e4a269e8bf0393db74bc"}, + {file = "libcst-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:40748361f4ea66ab6cdd82f8501c82c29808317ac7a3bd132074efd5fd9bfae2"}, + {file = "libcst-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f71aed85932c2ea92058fd9bbd99a6478bd69eada041c3726b4f4c9af1f564e"}, + {file = "libcst-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60b09abcc2848ab52d479c3a9b71b606d91a941e3779616efd083bb87dbe8ad"}, + {file = "libcst-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fb324ed20f3a725d152df5dba8d80f7e126d9c93cced581bf118a5fc18c1065"}, + {file = "libcst-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:99e7c52150a135d66716b03e00c7b1859a44336dc2a2bf8f9acc164494308531"}, + {file = "libcst-1.5.0.tar.gz", hash = "sha256:8478abf21ae3861a073e898d80b822bd56e578886331b33129ba77fec05b8c24"}, ] [package.dependencies] pyyaml = ">=5.2" [package.extras] -dev = ["Sphinx (>=5.1.1)", "black (==23.12.1)", "build (>=0.10.0)", "coverage (>=4.5.4)", "fixit (==2.1.0)", "flake8 (==7.0.0)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.4)", "jupyter (>=1.0.0)", "maturin (>=0.8.3,<1.6)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.6.0)", "usort (==1.0.8.post1)"] +dev = ["Sphinx (>=5.1.1)", "black (==24.8.0)", "build (>=0.10.0)", "coverage[toml] (>=4.5.4)", "fixit (==2.1.0)", "flake8 (==7.1.1)", "hypothesis (>=4.36.0)", "hypothesmith (>=0.0.4)", "jinja2 (==3.1.4)", "jupyter (>=1.0.0)", "maturin (>=1.7.0,<1.8)", "nbsphinx (>=0.4.2)", "prompt-toolkit (>=2.0.9)", "pyre-check (==0.9.18)", "setuptools-rust (>=1.5.2)", "setuptools-scm (>=6.0.1)", "slotscheck (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "ufmt (==2.7.3)", "usort (==1.0.8.post1)"] [[package]] name = "litellm" -version = "1.48.17" +version = "1.49.1" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.48.17-py3-none-any.whl", hash = "sha256:f3c25b8bcdbe2c65fbe492a674574461c200040e9e633073108c9517630469b6"}, - {file = "litellm-1.48.17.tar.gz", hash = "sha256:5b5039b39c4a9f748af8253895eec76b3458960533d1e038d1aec409d550ee37"}, + {file = "litellm-1.49.1-py3-none-any.whl", hash = "sha256:2ba6689fe4ea3b0d69f56f2843caff6422497489e6252943b13ef1463f016728"}, + {file = "litellm-1.49.1.tar.gz", hash = "sha256:f51450ad823c8bdf057017009ae8bcce1a2810690b2f0d9dcdaff04ddc68209a"}, ] [package.dependencies] @@ -2025,71 +2065,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.1" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"}, + {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, ] [[package]] @@ -2404,21 +2445,22 @@ files = [ [[package]] name = "networkx" -version = "3.1" +version = "3.4" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.4-py3-none-any.whl", hash = "sha256:46dad0ec74a825a968e2b36c37ef5b91faa3868f017b2283d9cbff33112222ce"}, + {file = "networkx-3.4.tar.gz", hash = "sha256:1269b90f8f0d3a4095f016f49650f35ac169729f49b69d0572b2bb142748162b"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "ninja" @@ -2528,13 +2570,13 @@ files = [ [[package]] name = "openai" -version = "1.51.0" +version = "1.51.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"}, - {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"}, + {file = "openai-1.51.2-py3-none-any.whl", hash = "sha256:5c5954711cba931423e471c37ff22ae0fd3892be9b083eee36459865fbbb83fa"}, + {file = "openai-1.51.2.tar.gz", hash = "sha256:c6a51fac62a1ca9df85a522e462918f6bb6bc51a8897032217e453a0730123a6"}, ] [package.dependencies] @@ -2790,6 +2832,21 @@ files = [ [package.extras] twisted = ["twisted"] +[[package]] +name = "prometheus-fastapi-instrumentator" +version = "7.0.0" +description = "Instrument your FastAPI with Prometheus metrics." +optional = false +python-versions = ">=3.8.1,<4.0.0" +files = [ + {file = "prometheus_fastapi_instrumentator-7.0.0-py3-none-any.whl", hash = "sha256:96030c43c776ee938a3dae58485ec24caed7e05bfc60fe067161e0d5b5757052"}, + {file = "prometheus_fastapi_instrumentator-7.0.0.tar.gz", hash = "sha256:5ba67c9212719f244ad7942d75ded80693b26331ee5dfc1e7571e4794a9ccbed"}, +] + +[package.dependencies] +prometheus-client = ">=0.8.0,<1.0.0" +starlette = ">=0.30.0,<1.0.0" + [[package]] name = "prompt-toolkit" version = "3.0.48" @@ -2804,6 +2861,113 @@ files = [ [package.dependencies] wcwidth = "*" +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "protobuf" version = "5.28.2" @@ -3198,27 +3362,21 @@ files = [ [[package]] name = "pytype" -version = "2024.9.13" +version = "2024.10.11" description = "Python type inferencer" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" files = [ - {file = "pytype-2024.9.13-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:52c0005d220b27f9c933e4077de700c4e8171abce0c2af72f4c6263a85ff5bce"}, - {file = "pytype-2024.9.13-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d5dc847c2fe98bac044f956e2fc9f074f09704b64436522b81ede7dd5fa3653"}, - {file = "pytype-2024.9.13-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529f19141c6170d96a38909df430ca52e6904eaef851ad2690cf632f17d2c195"}, - {file = "pytype-2024.9.13-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:38f3eddf05d8530ef16d3d7c2da2556148b9975fc7c3405ac3073022e1a7434b"}, - {file = "pytype-2024.9.13-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b530eae5ab421a2dc9c4ef53f68629c5a622545150ae9702dbb811f56852a63"}, - {file = "pytype-2024.9.13-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb9eaaaf6c33e2716fdce1cf4166d3e5099372d8898b69ab7673225928096456"}, - {file = "pytype-2024.9.13-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:53b767d85f374c7483c8b2849dceb811a15fcb01520e245dd82bd7c0e2befefb"}, - {file = "pytype-2024.9.13-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:176a5bbc0cb0882918a0b48818b95df2c15811e3a8391da089ffc5b33fea7013"}, - {file = "pytype-2024.9.13-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bdaf1eaaf17a13741f67686c2d4c94c30279cd682c7e4cf535e41fc911b0e59"}, - {file = "pytype-2024.9.13-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:425011cc45fba8c83af796155049f9db89d11e8aedbfb21bc1c99408f4a2c4e3"}, - {file = "pytype-2024.9.13-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e500727967b843488c1978114778162ef00fee9be49dfa5b4758dcbbcc55dd9"}, - {file = "pytype-2024.9.13-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9b40beab6ef04fc260d86a8ef47b25d1b525dbc4cfbcb73151fd74210c176df"}, - {file = "pytype-2024.9.13-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:b5fdc24b60938ee846dfbdf08b5ea96e934e7d69c34eb1f8fb7707083d177f0e"}, - {file = "pytype-2024.9.13-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8dcfd509118c2d7e0787e72832b45e30037af1c29dfcb733a7e8014f58337287"}, - {file = "pytype-2024.9.13-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9df731062dc18518a46135c4825ad966e1a275ffc0723dd62f9771b420889da0"}, - {file = "pytype-2024.9.13.tar.gz", hash = "sha256:941046ca0f1c43b79162bb51836fef0ba6608012d99f6833148c249f22216f26"}, + {file = "pytype-2024.10.11-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:1c5a43b132b19928a38ba1dbcf8f4e3f67a41ea26087ccf26ae371c4076c3809"}, + {file = "pytype-2024.10.11-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dd9ecb48aa46ecef14b39f1bbe8ff7e586e499639a056c05bd4436ca0b35d82"}, + {file = "pytype-2024.10.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37d8dfdf23679abfdfe047efef7239a438a038e580d7e0767c0403a6be07cea0"}, + {file = "pytype-2024.10.11-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:2e31a964aa82e1ac317adbe17b77010e4f362882df1ce7ad15ef0cf0bb97039f"}, + {file = "pytype-2024.10.11-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15e2f39590cc08ef8e6704cfa5c1db6fbbee2799891f9d8adbf821f883a54745"}, + {file = "pytype-2024.10.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ead3408fc9622ba8a357c9a6b9b49059a9b8add0a3b8390a9ab490f62a984005"}, + {file = "pytype-2024.10.11-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:cdc881cce9541a475ec48989a5ab889e6274a85afbf6da0e30266d0823f66d42"}, + {file = "pytype-2024.10.11-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13327d0d17b981fe2660dd3a69f97bf09a526f93debc40bb44b240628e0b55c1"}, + {file = "pytype-2024.10.11-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb98711679e631b01b09b09185504fbf38d60f119280918e244a602cf843b0fe"}, + {file = "pytype-2024.10.11.tar.gz", hash = "sha256:ae5ff82f0b07d5ad68d4ec32a3e8de44fad6ed565a821a76aca50a14df382274"}, ] [package.dependencies] @@ -3228,7 +3386,7 @@ importlab = ">=0.8" jinja2 = ">=3.1.2" libcst = ">=1.0.1" msgspec = ">=0.18.6" -networkx = "<3.2" +networkx = ">=2.8" ninja = ">=1.10.0.post2" pycnite = ">=2024.07.31" pydot = ">=1.4.2" @@ -3822,13 +3980,13 @@ win32 = ["pywin32"] [[package]] name = "sentry-sdk" -version = "2.15.0" +version = "2.16.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.15.0-py2.py3-none-any.whl", hash = "sha256:8fb0d1a4e1a640172f31502e4503543765a1fe8a9209779134a4ac52d4677303"}, - {file = "sentry_sdk-2.15.0.tar.gz", hash = "sha256:a599e7d3400787d6f43327b973e55a087b931ba2c592a7a7afa691f8eb5e75e2"}, + {file = "sentry_sdk-2.16.0-py2.py3-none-any.whl", hash = "sha256:49139c31ebcd398f4f6396b18910610a0c1602f6e67083240c33019d1f6aa30c"}, + {file = "sentry_sdk-2.16.0.tar.gz", hash = "sha256:90f733b32e15dfc1999e6b7aca67a38688a567329de4d6e184154a73f96c6892"}, ] [package.dependencies] @@ -3852,6 +4010,7 @@ falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +http2 = ["httpcore[http2] (==1.*)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] huggingface-hub = ["huggingface-hub (>=0.22)"] @@ -4018,17 +4177,17 @@ widechars = ["wcwidth"] [[package]] name = "temporalio" -version = "1.7.1" +version = "1.8.0" description = "Temporal.io Python SDK" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "temporalio-1.7.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3aff503662255c3e2fa1e9c07b8a702bf8ff1f7d99370b4a6785699c45e75527"}, - {file = "temporalio-1.7.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:0685c7ece5ba639a1af7eb39939726c70c99ffe6c212be3f01f213753923fd88"}, - {file = "temporalio-1.7.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:396e608c227a4f20cde7dfd3c7c8e2d8a9039cd76a40171668bb2b9a84d36bea"}, - {file = "temporalio-1.7.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a38652e2556c384261f81f820b5f65f3b099767f18b9332628ec730cd31f0972"}, - {file = "temporalio-1.7.1-cp38-abi3-win_amd64.whl", hash = "sha256:9b3aea332f6686a424467b026cbc8a1e93c550dfb6f7d983d392090de3d92847"}, - {file = "temporalio-1.7.1.tar.gz", hash = "sha256:8250c391b33dd498dfd7d65a880c72b17e9b0e7cc04e7d444400be74c0fe4c85"}, + {file = "temporalio-1.8.0-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c6acb217d4bd7297389db756dd9da73ef2bae17f6afee1faa8bf77be200e8b93"}, + {file = "temporalio-1.8.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6ec61660631b2513ce710b468068135280996af105571126295c9645bf29ee22"}, + {file = "temporalio-1.8.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ee13d155dc917e7792b87d1e37b1a0e837c361deb722ccc294edaa5344f2fa2"}, + {file = "temporalio-1.8.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6b67c115b6eaceddae373dc2c597e5ad5dd567282f4bb0ee63c99124f5f0c12d"}, + {file = "temporalio-1.8.0-cp38-abi3-win_amd64.whl", hash = "sha256:6a45571c09859b6cbf33be26dd5d5fab7e7ee3625750a7b91ebde5770e61015b"}, + {file = "temporalio-1.8.0.tar.gz", hash = "sha256:b9e239b8bfd60126a4b591c6e2e691392b69afc8cac9db452d692654bf85f9cc"}, ] [package.dependencies] @@ -4162,111 +4321,111 @@ test = ["pytest", "ruff"] [[package]] name = "tokenizers" -version = "0.20.0" +version = "0.20.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6cff5c5e37c41bc5faa519d6f3df0679e4b37da54ea1f42121719c5e2b4905c0"}, - {file = "tokenizers-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62a56bf75c27443432456f4ca5ca055befa95e25be8a28141cc495cac8ae4d6d"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc7de6a63f09c4a86909c2597b995aa66e19df852a23aea894929c74369929"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:053c37ecee482cc958fdee53af3c6534286a86f5d35aac476f7c246830e53ae5"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d7074aaabc151a6363fa03db5493fc95b423b2a1874456783989e96d541c7b6"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a11435780f2acd89e8fefe5e81cecf01776f6edb9b3ac95bcb76baee76b30b90"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a81cd2712973b007d84268d45fc3f6f90a79c31dfe7f1925e6732f8d2959987"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7dfd796ab9d909f76fb93080e1c7c8309f196ecb316eb130718cd5e34231c69"}, - {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8029ad2aa8cb00605c9374566034c1cc1b15130713e0eb5afcef6cface8255c9"}, - {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca4d54260ebe97d59dfa9a30baa20d0c4dd9137d99a8801700055c561145c24e"}, - {file = "tokenizers-0.20.0-cp310-none-win32.whl", hash = "sha256:95ee16b57cec11b86a7940174ec5197d506439b0f415ab3859f254b1dffe9df0"}, - {file = "tokenizers-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:0a61a11e93eeadbf02aea082ffc75241c4198e0608bbbac4f65a9026851dcf37"}, - {file = "tokenizers-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6636b798b3c4d6c9b1af1a918bd07c867808e5a21c64324e95318a237e6366c3"}, - {file = "tokenizers-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ec603e42eaf499ffd58b9258162add948717cf21372458132f14e13a6bc7172"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce124264903a8ea6f8f48e1cc7669e5ef638c18bd4ab0a88769d5f92debdf7f"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07bbeba0231cf8de07aa6b9e33e9779ff103d47042eeeb859a8c432e3292fb98"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:06c0ca8397b35d38b83a44a9c6929790c1692957d88541df061cb34d82ebbf08"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca6557ac3b83d912dfbb1f70ab56bd4b0594043916688e906ede09f42e192401"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5ad94c9e80ac6098328bee2e3264dbced4c6faa34429994d473f795ec58ef4"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5c7f906ee6bec30a9dc20268a8b80f3b9584de1c9f051671cb057dc6ce28f6"}, - {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:31e087e9ee1b8f075b002bfee257e858dc695f955b43903e1bb4aa9f170e37fe"}, - {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3124fb6f3346cb3d8d775375d3b429bf4dcfc24f739822702009d20a4297990"}, - {file = "tokenizers-0.20.0-cp311-none-win32.whl", hash = "sha256:a4bb8b40ba9eefa621fdcabf04a74aa6038ae3be0c614c6458bd91a4697a452f"}, - {file = "tokenizers-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:2b709d371f1fe60a28ef0c5c67815952d455ca7f34dbe7197eaaed3cc54b658e"}, - {file = "tokenizers-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:15c81a17d0d66f4987c6ca16f4bea7ec253b8c7ed1bb00fdc5d038b1bb56e714"}, - {file = "tokenizers-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a531cdf1fb6dc41c984c785a3b299cb0586de0b35683842a3afbb1e5207f910"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06caabeb4587f8404e0cd9d40f458e9cba3e815c8155a38e579a74ff3e2a4301"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8768f964f23f5b9f50546c0369c75ab3262de926983888bbe8b98be05392a79c"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:626403860152c816f97b649fd279bd622c3d417678c93b4b1a8909b6380b69a8"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c1b88fa9e5ff062326f4bf82681da5a96fca7104d921a6bd7b1e6fcf224af26"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7e559436a07dc547f22ce1101f26d8b2fad387e28ec8e7e1e3b11695d681d8"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48afb75e50449848964e4a67b0da01261dd3aa8df8daecf10db8fd7f5b076eb"}, - {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf5d0e1ff44710a95eefc196dd87666ffc609fd447c5e5b68272a7c3d342a1d"}, - {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e5e56df0e8ed23ba60ae3848c3f069a0710c4b197218fe4f89e27eba38510768"}, - {file = "tokenizers-0.20.0-cp312-none-win32.whl", hash = "sha256:ec53e5ecc142a82432f9c6c677dbbe5a2bfee92b8abf409a9ecb0d425ee0ce75"}, - {file = "tokenizers-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:f18661ece72e39c0dfaa174d6223248a15b457dbd4b0fc07809b8e6d3ca1a234"}, - {file = "tokenizers-0.20.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:f7065b1084d8d1a03dc89d9aad69bcbc8415d4bc123c367063eb32958cd85054"}, - {file = "tokenizers-0.20.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e5d4069e4714e3f7ba0a4d3d44f9d84a432cd4e4aa85c3d7dd1f51440f12e4a1"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:799b808529e54b7e1a36350bda2aeb470e8390e484d3e98c10395cee61d4e3c6"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f9baa027cc8a281ad5f7725a93c204d7a46986f88edbe8ef7357f40a23fb9c7"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:010ec7f3f7a96adc4c2a34a3ada41fa14b4b936b5628b4ff7b33791258646c6b"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98d88f06155335b14fd78e32ee28ca5b2eb30fced4614e06eb14ae5f7fba24ed"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e13eb000ef540c2280758d1b9cfa5fe424b0424ae4458f440e6340a4f18b2638"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab3cf066ff426f7e6d70435dc28a9ff01b2747be83810e397cba106f39430b0"}, - {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:39fa3761b30a89368f322e5daf4130dce8495b79ad831f370449cdacfb0c0d37"}, - {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c8da0fba4d179ddf2607821575998df3c294aa59aa8df5a6646dc64bc7352bce"}, - {file = "tokenizers-0.20.0-cp37-none-win32.whl", hash = "sha256:fada996d6da8cf213f6e3c91c12297ad4f6cdf7a85c2fadcd05ec32fa6846fcd"}, - {file = "tokenizers-0.20.0-cp37-none-win_amd64.whl", hash = "sha256:7d29aad702279e0760c265fcae832e89349078e3418dd329732d4503259fd6bd"}, - {file = "tokenizers-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:099c68207f3ef0227ecb6f80ab98ea74de559f7b124adc7b17778af0250ee90a"}, - {file = "tokenizers-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:68012d8a8cddb2eab3880870d7e2086cb359c7f7a2b03f5795044f5abff4e850"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9253bdd209c6aee168deca7d0e780581bf303e0058f268f9bb06859379de19b6"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f868600ddbcb0545905ed075eb7218a0756bf6c09dae7528ea2f8436ebd2c93"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9643d9c8c5f99b6aba43fd10034f77cc6c22c31f496d2f0ee183047d948fa0"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c375c6a889aeab44734028bc65cc070acf93ccb0f9368be42b67a98e1063d3f6"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e359f852328e254f070bbd09a19a568421d23388f04aad9f2fb7da7704c7228d"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d98b01a309d4387f3b1c1dd68a8b8136af50376cf146c1b7e8d8ead217a5be4b"}, - {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:459f7537119554c2899067dec1ac74a00d02beef6558f4ee2e99513bf6d568af"}, - {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:392b87ec89452628c045c9f2a88bc2a827f4c79e7d84bc3b72752b74c2581f70"}, - {file = "tokenizers-0.20.0-cp38-none-win32.whl", hash = "sha256:55a393f893d2ed4dd95a1553c2e42d4d4086878266f437b03590d3f81984c4fe"}, - {file = "tokenizers-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:30ffe33c5c2f2aab8e9a3340d0110dd9f7ace7eec7362e20a697802306bd8068"}, - {file = "tokenizers-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aa2d4a6fed2a7e3f860c7fc9d48764bb30f2649d83915d66150d6340e06742b8"}, - {file = "tokenizers-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5ef0f814084a897e9071fc4a868595f018c5c92889197bdc4bf19018769b148"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1e1b791e8c3bf4c4f265f180dadaff1c957bf27129e16fdd5e5d43c2d3762c"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b69e55e481459c07885263743a0d3c18d52db19bae8226a19bcca4aaa213fff"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806b4d82e27a2512bc23057b2986bc8b85824914286975b84d8105ff40d03d9"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9859e9ef13adf5a473ccab39d31bff9c550606ae3c784bf772b40f615742a24f"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef703efedf4c20488a8eb17637b55973745b27997ff87bad88ed499b397d1144"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eec0061bab94b1841ab87d10831fdf1b48ebaed60e6d66d66dbe1d873f92bf5"}, - {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:980f3d0d7e73f845b69087f29a63c11c7eb924c4ad6b358da60f3db4cf24bdb4"}, - {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c157550a2f3851b29d7fdc9dc059fcf81ff0c0fc49a1e5173a89d533ed043fa"}, - {file = "tokenizers-0.20.0-cp39-none-win32.whl", hash = "sha256:8a3d2f4d08608ec4f9895ec25b4b36a97f05812543190a5f2c3cd19e8f041e5a"}, - {file = "tokenizers-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:d90188d12afd0c75e537f9a1d92f9c7375650188ee4f48fdc76f9e38afbd2251"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d68e15f1815357b059ec266062340c343ea7f98f7f330602df81ffa3474b6122"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:23f9ecec637b9bc80da5f703808d29ed5329e56b5aa8d791d1088014f48afadc"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f830b318ee599e3d0665b3e325f85bc75ee2d2ca6285f52e439dc22b64691580"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3dc750def789cb1de1b5a37657919545e1d9ffa667658b3fa9cb7862407a1b8"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e26e6c755ae884c2ea6135cd215bdd0fccafe4ee62405014b8c3cd19954e3ab9"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a1158c7174f427182e08baa2a8ded2940f2b4a3e94969a85cc9cfd16004cbcea"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:6324826287a3fc198898d3dcf758fe4a8479e42d6039f4c59e2cedd3cf92f64e"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d8653149405bb0c16feaf9cfee327fdb6aaef9dc2998349fec686f35e81c4e2"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a2dc1e402a155e97309287ca085c80eb1b7fab8ae91527d3b729181639fa51"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bef67b20aa6e5f7868c42c7c5eae4d24f856274a464ae62e47a0f2cccec3da"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da06e397182ff53789c506c7833220c192952c57e1581a53f503d8d953e2d67e"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:302f7e11a14814028b7fc88c45a41f1bbe9b5b35fd76d6869558d1d1809baa43"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:055ec46e807b875589dfbe3d9259f9a6ee43394fb553b03b3d1e9541662dbf25"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e3144b8acebfa6ae062e8f45f7ed52e4b50fb6c62f93afc8871b525ab9fdcab3"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b52aa3fd14b2a07588c00a19f66511cff5cca8f7266ca3edcdd17f3512ad159f"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b8cf52779ffc5d4d63a0170fbeb512372bad0dd014ce92bbb9149756c831124"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:983a45dd11a876124378dae71d6d9761822199b68a4c73f32873d8cdaf326a5b"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6b819c9a19831ebec581e71a7686a54ab45d90faf3842269a10c11d746de0c"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e738cfd80795fcafcef89c5731c84b05638a4ab3f412f97d5ed7765466576eb1"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c8842c7be2fadb9c9edcee233b1b7fe7ade406c99b0973f07439985c1c1d0683"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e47a82355511c373a4a430c4909dc1e518e00031207b1fec536c49127388886b"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9afbf359004551179a5db19424180c81276682773cff2c5d002f6eaaffe17230"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07eaa8799a92e6af6f472c21a75bf71575de2af3c0284120b7a09297c0de2f3"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0994b2e5fc53a301071806bc4303e4bc3bdc3f490e92a21338146a36746b0872"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6466e0355b603d10e3cc3d282d350b646341b601e50969464a54939f9848d0"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1e86594c2a433cb1ea09cfbe596454448c566e57ee8905bd557e489d93e89986"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3e14cdef1efa96ecead6ea64a891828432c3ebba128bdc0596e3059fea104ef3"}, - {file = "tokenizers-0.20.0.tar.gz", hash = "sha256:39d7acc43f564c274085cafcd1dae9d36f332456de1a31970296a6b8da4eac8d"}, + {file = "tokenizers-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:439261da7c0a5c88bda97acb284d49fbdaf67e9d3b623c0bfd107512d22787a9"}, + {file = "tokenizers-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03dae629d99068b1ea5416d50de0fea13008f04129cc79af77a2a6392792d93c"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b61f561f329ffe4b28367798b89d60c4abf3f815d37413b6352bc6412a359867"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec870fce1ee5248a10be69f7a8408a234d6f2109f8ea827b4f7ecdbf08c9fd15"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d388d1ea8b7447da784e32e3b86a75cce55887e3b22b31c19d0b186b1c677800"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299c85c1d21135bc01542237979bf25c32efa0d66595dd0069ae259b97fb2dbe"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96f6c14c9752bb82145636b614d5a78e9cde95edfbe0a85dad0dd5ddd6ec95c"}, + {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9e95ad49c932b80abfbfeaf63b155761e695ad9f8a58c52a47d962d76e310f"}, + {file = "tokenizers-0.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f22dee205329a636148c325921c73cf3e412e87d31f4d9c3153b302a0200057b"}, + {file = "tokenizers-0.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2ffd9a8895575ac636d44500c66dffaef133823b6b25067604fa73bbc5ec09d"}, + {file = "tokenizers-0.20.1-cp310-none-win32.whl", hash = "sha256:2847843c53f445e0f19ea842a4e48b89dd0db4e62ba6e1e47a2749d6ec11f50d"}, + {file = "tokenizers-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:f9aa93eacd865f2798b9e62f7ce4533cfff4f5fbd50c02926a78e81c74e432cd"}, + {file = "tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15"}, + {file = "tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f84dad1ff1863c648d80628b1b55353d16303431283e4efbb6ab1af56a75832"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:929c8f3afa16a5130a81ab5079c589226273ec618949cce79b46d96e59a84f61"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d10766473954397e2d370f215ebed1cc46dcf6fd3906a2a116aa1d6219bfedc3"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9300fac73ddc7e4b0330acbdda4efaabf74929a4a61e119a32a181f534a11b47"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ecaf7b0e39caeb1aa6dd6e0975c405716c82c1312b55ac4f716ef563a906969"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5170be9ec942f3d1d317817ced8d749b3e1202670865e4fd465e35d8c259de83"}, + {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4"}, + {file = "tokenizers-0.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ee86d4095d3542d73579e953c2e5e07d9321af2ffea6ecc097d16d538a2dea16"}, + {file = "tokenizers-0.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:86dcd08da163912e17b27bbaba5efdc71b4fbffb841530fdb74c5707f3c49216"}, + {file = "tokenizers-0.20.1-cp311-none-win32.whl", hash = "sha256:9af2dc4ee97d037bc6b05fa4429ddc87532c706316c5e11ce2f0596dfcfa77af"}, + {file = "tokenizers-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:899152a78b095559c287b4c6d0099469573bb2055347bb8154db106651296f39"}, + {file = "tokenizers-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:407ab666b38e02228fa785e81f7cf79ef929f104bcccf68a64525a54a93ceac9"}, + {file = "tokenizers-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f13a2d16032ebc8bd812eb8099b035ac65887d8f0c207261472803b9633cf3e"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e98eee4dca22849fbb56a80acaa899eec5b72055d79637dd6aa15d5e4b8628c9"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47c1bcdd61e61136087459cb9e0b069ff23b5568b008265e5cbc927eae3387ce"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128c1110e950534426e2274837fc06b118ab5f2fa61c3436e60e0aada0ccfd67"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2e2d47a819d2954f2c1cd0ad51bb58ffac6f53a872d5d82d65d79bf76b9896d"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdd67a0e3503a9a7cf8bc5a4a49cdde5fa5bada09a51e4c7e1c73900297539bd"}, + {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b93d2e26d04da337ac407acec8b5d081d8d135e3e5066a88edd5bdb5aff89"}, + {file = "tokenizers-0.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0c6a796ddcd9a19ad13cf146997cd5895a421fe6aec8fd970d69f9117bddb45c"}, + {file = "tokenizers-0.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3ea919687aa7001a8ff1ba36ac64f165c4e89035f57998fa6cedcfd877be619d"}, + {file = "tokenizers-0.20.1-cp312-none-win32.whl", hash = "sha256:6d3ac5c1f48358ffe20086bf065e843c0d0a9fce0d7f0f45d5f2f9fba3609ca5"}, + {file = "tokenizers-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:b0874481aea54a178f2bccc45aa2d0c99cd3f79143a0948af6a9a21dcc49173b"}, + {file = "tokenizers-0.20.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:96af92e833bd44760fb17f23f402e07a66339c1dcbe17d79a9b55bb0cc4f038e"}, + {file = "tokenizers-0.20.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:65f34e5b731a262dfa562820818533c38ce32a45864437f3d9c82f26c139ca7f"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17f98fccb5c12ab1ce1f471731a9cd86df5d4bd2cf2880c5a66b229802d96145"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8c0fc3542cf9370bf92c932eb71bdeb33d2d4aeeb4126d9fd567b60bd04cb30"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b39356df4575d37f9b187bb623aab5abb7b62c8cb702867a1768002f814800c"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfdad27b0e50544f6b838895a373db6114b85112ba5c0cefadffa78d6daae563"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:094663dd0e85ee2e573126918747bdb40044a848fde388efb5b09d57bc74c680"}, + {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e4cf033a2aa207d7ac790e91adca598b679999710a632c4a494aab0fc3a1b2"}, + {file = "tokenizers-0.20.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9310951c92c9fb91660de0c19a923c432f110dbfad1a2d429fbc44fa956bf64f"}, + {file = "tokenizers-0.20.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05e41e302c315bd2ed86c02e917bf03a6cf7d2f652c9cee1a0eb0d0f1ca0d32c"}, + {file = "tokenizers-0.20.1-cp37-none-win32.whl", hash = "sha256:212231ab7dfcdc879baf4892ca87c726259fa7c887e1688e3f3cead384d8c305"}, + {file = "tokenizers-0.20.1-cp37-none-win_amd64.whl", hash = "sha256:896195eb9dfdc85c8c052e29947169c1fcbe75a254c4b5792cdbd451587bce85"}, + {file = "tokenizers-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:741fb22788482d09d68e73ece1495cfc6d9b29a06c37b3df90564a9cfa688e6d"}, + {file = "tokenizers-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10be14ebd8082086a342d969e17fc2d6edc856c59dbdbddd25f158fa40eaf043"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:514cf279b22fa1ae0bc08e143458c74ad3b56cd078b319464959685a35c53d5e"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a647c5b7cb896d6430cf3e01b4e9a2d77f719c84cefcef825d404830c2071da2"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cdf379219e1e1dd432091058dab325a2e6235ebb23e0aec8d0508567c90cd01"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ba72260449e16c4c2f6f3252823b059fbf2d31b32617e582003f2b18b415c39"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:910b96ed87316e4277b23c7bcaf667ce849c7cc379a453fa179e7e09290eeb25"}, + {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53975a6694428a0586534cc1354b2408d4e010a3103117f617cbb550299797c"}, + {file = "tokenizers-0.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:07c4b7be58da142b0730cc4e5fd66bb7bf6f57f4986ddda73833cd39efef8a01"}, + {file = "tokenizers-0.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b605c540753e62199bf15cf69c333e934077ef2350262af2ccada46026f83d1c"}, + {file = "tokenizers-0.20.1-cp38-none-win32.whl", hash = "sha256:88b3bc76ab4db1ab95ead623d49c95205411e26302cf9f74203e762ac7e85685"}, + {file = "tokenizers-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:d412a74cf5b3f68a90c615611a5aa4478bb303d1c65961d22db45001df68afcb"}, + {file = "tokenizers-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a25dcb2f41a0a6aac31999e6c96a75e9152fa0127af8ece46c2f784f23b8197a"}, + {file = "tokenizers-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a12c3cebb8c92e9c35a23ab10d3852aee522f385c28d0b4fe48c0b7527d59762"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02e18da58cf115b7c40de973609c35bde95856012ba42a41ee919c77935af251"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f326a1ac51ae909b9760e34671c26cd0dfe15662f447302a9d5bb2d872bab8ab"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b4872647ea6f25224e2833b044b0b19084e39400e8ead3cfe751238b0802140"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce6238a3311bb8e4c15b12600927d35c267b92a52c881ef5717a900ca14793f7"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57b7a8880b208866508b06ce365dc631e7a2472a3faa24daa430d046fb56c885"}, + {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a908c69c2897a68f412aa05ba38bfa87a02980df70f5a72fa8490479308b1f2d"}, + {file = "tokenizers-0.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:da1001aa46f4490099c82e2facc4fbc06a6a32bf7de3918ba798010954b775e0"}, + {file = "tokenizers-0.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c097390e2f0ed0a5c5d569e6669dd4e9fff7b31c6a5ce6e9c66a61687197de"}, + {file = "tokenizers-0.20.1-cp39-none-win32.whl", hash = "sha256:3d4d218573a3d8b121a1f8c801029d70444ffb6d8f129d4cca1c7b672ee4a24c"}, + {file = "tokenizers-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:37d1e6f616c84fceefa7c6484a01df05caf1e207669121c66213cb5b2911d653"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48689da7a395df41114f516208d6550e3e905e1239cc5ad386686d9358e9cef0"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:712f90ea33f9bd2586b4a90d697c26d56d0a22fd3c91104c5858c4b5b6489a79"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:359eceb6a620c965988fc559cebc0a98db26713758ec4df43fb76d41486a8ed5"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d3caf244ce89d24c87545aafc3448be15870096e796c703a0d68547187192e1"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b03cf8b9a32254b1bf8a305fb95c6daf1baae0c1f93b27f2b08c9759f41dee"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:218e5a3561561ea0f0ef1559c6d95b825308dbec23fb55b70b92589e7ff2e1e8"}, + {file = "tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f40df5e0294a95131cc5f0e0eb91fe86d88837abfbee46b9b3610b09860195a7"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:08aaa0d72bb65058e8c4b0455f61b840b156c557e2aca57627056624c3a93976"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:998700177b45f70afeb206ad22c08d9e5f3a80639dae1032bf41e8cbc4dada4b"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62f7fbd3c2c38b179556d879edae442b45f68312019c3a6013e56c3947a4e648"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31e87fca4f6bbf5cc67481b562147fe932f73d5602734de7dd18a8f2eee9c6dd"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:956f21d359ae29dd51ca5726d2c9a44ffafa041c623f5aa33749da87cfa809b9"}, + {file = "tokenizers-0.20.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1fbbaf17a393c78d8aedb6a334097c91cb4119a9ced4764ab8cfdc8d254dc9f9"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ebe63e31f9c1a970c53866d814e35ec2ec26fda03097c486f82f3891cee60830"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:81970b80b8ac126910295f8aab2d7ef962009ea39e0d86d304769493f69aaa1e"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130e35e76f9337ed6c31be386e75d4925ea807055acf18ca1a9b0eec03d8fe23"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd28a8614f5c82a54ab2463554e84ad79526c5184cf4573bbac2efbbbcead457"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9041ee665d0fa7f5c4ccf0f81f5e6b7087f797f85b143c094126fc2611fec9d0"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:62eb9daea2a2c06bcd8113a5824af8ef8ee7405d3a71123ba4d52c79bb3d9f1a"}, + {file = "tokenizers-0.20.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f861889707b54a9ab1204030b65fd6c22bdd4a95205deec7994dc22a8baa2ea4"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:89d5c337d74ea6e5e7dc8af124cf177be843bbb9ca6e58c01f75ea103c12c8a9"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b7f515c83397e73292accdbbbedc62264e070bae9682f06061e2ddce67cacaf"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0305fc1ec6b1e5052d30d9c1d5c807081a7bd0cae46a33d03117082e91908c"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc611e6ac0fa00a41de19c3bf6391a05ea201d2d22b757d63f5491ec0e67faa"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5ffe0d7f7bfcfa3b2585776ecf11da2e01c317027c8573c78ebcb8985279e23"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e7edb8ec12c100d5458d15b1e47c0eb30ad606a05641f19af7563bc3d1608c14"}, + {file = "tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:de291633fb9303555793cc544d4a86e858da529b7d0b752bcaf721ae1d74b2c9"}, + {file = "tokenizers-0.20.1.tar.gz", hash = "sha256:84edcc7cdeeee45ceedb65d518fffb77aec69311c9c8e30f77ad84da3025f002"}, ] [package.dependencies] @@ -4562,108 +4721,109 @@ files = [ [[package]] name = "yarl" -version = "1.13.1" +version = "1.14.0" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, - {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, - {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, - {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, - {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, - {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, - {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, - {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, - {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, - {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, - {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, - {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, - {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, - {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, - {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, + {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bfc25aa6a7c99cf86564210f79a0b7d4484159c67e01232b116e445b3036547"}, + {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0cf21f46a15d445417de8fc89f2568852cf57fe8ca1ab3d19ddb24d45c0383ae"}, + {file = "yarl-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dda53508df0de87b6e6b0a52d6718ff6c62a5aca8f5552748404963df639269"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:587c3cc59bc148a9b1c07a019346eda2549bc9f468acd2f9824d185749acf0a6"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3007a5b75cb50140708420fe688c393e71139324df599434633019314ceb8b59"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06ff23462398333c78b6f4f8d3d70410d657a471c2c5bbe6086133be43fc8f1a"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689a99a42ee4583fcb0d3a67a0204664aa1539684aed72bdafcbd505197a91c4"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0547ab1e9345dc468cac8368d88ea4c5bd473ebc1d8d755347d7401982b5dd8"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:742aef0a99844faaac200564ea6f5e08facb285d37ea18bd1a5acf2771f3255a"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:176110bff341b6730f64a1eb3a7070e12b373cf1c910a9337e7c3240497db76f"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46a9772a1efa93f9cd170ad33101c1817c77e0e9914d4fe33e2da299d7cf0f9b"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ee2c68e4f2dd1b1c15b849ba1c96fac105fca6ffdb7c1e8be51da6fabbdeafb9"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:047b258e00b99091b6f90355521f026238c63bd76dcf996d93527bb13320eefd"}, + {file = "yarl-1.14.0-cp310-cp310-win32.whl", hash = "sha256:0aa92e3e30a04f9462a25077db689c4ac5ea9ab6cc68a2e563881b987d42f16d"}, + {file = "yarl-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:d9baec588f015d0ee564057aa7574313c53a530662ffad930b7886becc85abdf"}, + {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:07f9eaf57719d6721ab15805d85f4b01a5b509a0868d7320134371bcb652152d"}, + {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c14b504a74e58e2deb0378b3eca10f3d076635c100f45b113c18c770b4a47a50"}, + {file = "yarl-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a682a127930f3fc4e42583becca6049e1d7214bcad23520c590edd741d2114"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bedd2be05f48af19f0f2e9e1353921ce0c83f4a1c9e8556ecdcf1f1eae4892"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3ab950f8814f3b7b5e3eebc117986f817ec933676f68f0a6c5b2137dd7c9c69"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b693c63e7e64b524f54aa4888403c680342d1ad0d97be1707c531584d6aeeb4f"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cb3e40eaa98489f1e2e8b29f5ad02ee1ee40d6ce6b88d50cf0f205de1d9d2c"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f24f08b6c9b9818fd80612c97857d28f9779f0d1211653ece9844fc7b414df2"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29a84a46ec3ebae7a1c024c055612b11e9363a8a23238b3e905552d77a2bc51b"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5cd5dad8366e0168e0fd23d10705a603790484a6dbb9eb272b33673b8f2cce72"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a152751af7ef7b5d5fa6d215756e508dd05eb07d0cf2ba51f3e740076aa74373"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3d569f877ed9a708e4c71a2d13d2940cb0791da309f70bd970ac1a5c088a0a92"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a615cad11ec3428020fb3c5a88d85ce1b5c69fd66e9fcb91a7daa5e855325dd"}, + {file = "yarl-1.14.0-cp311-cp311-win32.whl", hash = "sha256:bab03192091681d54e8225c53f270b0517637915d9297028409a2a5114ff4634"}, + {file = "yarl-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:985623575e5c4ea763056ffe0e2d63836f771a8c294b3de06d09480538316b13"}, + {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fc2c80bc87fba076e6cbb926216c27fba274dae7100a7b9a0983b53132dd99f2"}, + {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:55c144d363ad4626ca744556c049c94e2b95096041ac87098bb363dcc8635e8d"}, + {file = "yarl-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b03384eed107dbeb5f625a99dc3a7de8be04fc8480c9ad42fccbc73434170b20"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f72a0d746d38cb299b79ce3d4d60ba0892c84bbc905d0d49c13df5bace1b65f8"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8648180b34faaea4aa5b5ca7e871d9eb1277033fa439693855cf0ea9195f85f1"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9557c9322aaa33174d285b0c1961fb32499d65ad1866155b7845edc876c3c835"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f50eb3837012a937a2b649ec872b66ba9541ad9d6f103ddcafb8231cfcafd22"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8892fa575ac9b1b25fae7b221bc4792a273877b9b56a99ee2d8d03eeb3dbb1d2"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6a2c5c5bb2556dfbfffffc2bcfb9c235fd2b566d5006dfb2a37afc7e3278a07"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ab3abc0b78a5dfaa4795a6afbe7b282b6aa88d81cf8c1bb5e394993d7cae3457"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:47eede5d11d669ab3759b63afb70d28d5328c14744b8edba3323e27dc52d298d"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe4d2536c827f508348d7b40c08767e8c7071614250927233bf0c92170451c0a"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fd7b941dd1b00b5f0acb97455fea2c4b7aac2dd31ea43fb9d155e9bc7b78664"}, + {file = "yarl-1.14.0-cp312-cp312-win32.whl", hash = "sha256:99ff3744f5fe48288be6bc402533b38e89749623a43208e1d57091fc96b783b9"}, + {file = "yarl-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ca3894e9e9f72da93544f64988d9c052254a338a9f855165f37f51edb6591de"}, + {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d02d700705d67e09e1f57681f758f0b9d4412eeb70b2eb8d96ca6200b486db3"}, + {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:30600ba5db60f7c0820ef38a2568bb7379e1418ecc947a0f76fd8b2ff4257a97"}, + {file = "yarl-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e85d86527baebb41a214cc3b45c17177177d900a2ad5783dbe6f291642d4906f"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37001e5d4621cef710c8dc1429ca04e189e572f128ab12312eab4e04cf007132"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4f4547944d4f5cfcdc03f3f097d6f05bbbc915eaaf80a2ee120d0e756de377d"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ff4c819757f9bdb35de049a509814d6ce851fe26f06eb95a392a5640052482"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ac1a09392ed6e3fd14be880d39b951d7b981fd135416db7d18a6208c536561"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96952f642ac69075e44c7d0284528938fdff39422a1d90d3e45ce40b72e5e2d9"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a56fbe3d7f3bce1d060ea18d2413a2ca9ca814eea7cedc4d247b5f338d54844e"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e2637d75e92763d1322cb5041573279ec43a80c0f7fbbd2d64f5aee98447b17"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9abe80ae2c9d37c17599557b712e6515f4100a80efb2cda15f5f070306477cd2"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:217a782020b875538eebf3948fac3a7f9bbbd0fd9bf8538f7c2ad7489e80f4e8"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9cfef3f14f75bf6aba73a76caf61f9d00865912a04a4393c468a7ce0981b519"}, + {file = "yarl-1.14.0-cp313-cp313-win32.whl", hash = "sha256:d8361c7d04e6a264481f0b802e395f647cd3f8bbe27acfa7c12049efea675bd1"}, + {file = "yarl-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:bc24f968b82455f336b79bf37dbb243b7d76cd40897489888d663d4e028f5069"}, + {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:91d875f75fabf76b3018c5f196bf3d308ed2b49ddcb46c1576d6b075754a1393"}, + {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4009def9be3a7e5175db20aa2d7307ecd00bbf50f7f0f989300710eee1d0b0b9"}, + {file = "yarl-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:582cedde49603f139be572252a318b30dc41039bc0b8165f070f279e5d12187f"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbd9ff43a04f8ffe8a959a944c2dca10d22f5f99fc6a459f49c3ebfb409309d9"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f805e37ed16cc212fdc538a608422d7517e7faf539bedea4fe69425bc55d76"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95e16e9eaa2d7f5d87421b8fe694dd71606aa61d74b824c8d17fc85cc51983d1"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:816d24f584edefcc5ca63428f0b38fee00b39fe64e3c5e558f895a18983efe96"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd2660c01367eb3ef081b8fa0a5da7fe767f9427aa82023a961a5f28f0d4af6c"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:94b2bb9bcfd5be9d27004ea4398fb640373dd0c1a9e219084f42c08f77a720ab"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c2089a9afef887664115f7fa6d3c0edd6454adaca5488dba836ca91f60401075"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2192f718db4a8509f63dd6d950f143279211fa7e6a2c612edc17d85bf043d36e"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:8385ab36bf812e9d37cf7613999a87715f27ef67a53f0687d28c44b819df7cb0"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b4c1ecba93e7826dc71ddba75fb7740cdb52e7bd0be9f03136b83f54e6a1f511"}, + {file = "yarl-1.14.0-cp38-cp38-win32.whl", hash = "sha256:e749af6c912a7bb441d105c50c1a3da720474e8acb91c89350080dd600228f0e"}, + {file = "yarl-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:147e36331f6f63e08a14640acf12369e041e0751bb70d9362df68c2d9dcf0c87"}, + {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a9f917966d27f7ce30039fe8d900f913c5304134096554fd9bea0774bcda6d1"}, + {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a2f8fb7f944bcdfecd4e8d855f84c703804a594da5123dd206f75036e536d4d"}, + {file = "yarl-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f4e475f29a9122f908d0f1f706e1f2fc3656536ffd21014ff8a6f2e1b14d1d8"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8089d4634d8fa2b1806ce44fefa4979b1ab2c12c0bc7ef3dfa45c8a374811348"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b16f6c75cffc2dc0616ea295abb0e1967601bd1fb1e0af6a1de1c6c887f3439"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498b3c55087b9d762636bca9b45f60d37e51d24341786dc01b81253f9552a607"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f8bfc1db82589ef965ed234b87de30d140db8b6dc50ada9e33951ccd8ec07a"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:625f207b1799e95e7c823f42f473c1e9dbfb6192bd56bba8695656d92be4535f"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:781e2495e408a81e4eaeedeb41ba32b63b1980dddf8b60dbbeff6036bcd35049"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:659603d26d40dd4463200df9bfbc339fbfaed3fe32e5c432fe1dc2b5d4aa94b4"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4e0d45ebf975634468682c8bec021618b3ad52c37619e5c938f8f831fa1ac5c0"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a2e4725a08cb2b4794db09e350c86dee18202bb8286527210e13a1514dc9a59a"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:19268b4fec1d7760134f2de46ef2608c2920134fb1fa61e451f679e41356dc55"}, + {file = "yarl-1.14.0-cp39-cp39-win32.whl", hash = "sha256:337912bcdcf193ade64b9aae5a4017a0a1950caf8ca140362e361543c6773f21"}, + {file = "yarl-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6d0147574ce2e7b812c989e50fa72bbc5338045411a836bd066ce5fc8ac0bce"}, + {file = "yarl-1.14.0-py3-none-any.whl", hash = "sha256:c8ed4034f0765f8861620c1f2f2364d2e58520ea288497084dae880424fc0d9f"}, + {file = "yarl-1.14.0.tar.gz", hash = "sha256:88c7d9d58aab0724b979ab5617330acb1c7030b79379c8138c1c8c94e121d1b3"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [[package]] name = "zipp" @@ -4687,4 +4847,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "04b888dec8224adfc326c796eda70f96df1ab93905cbfe3ebda00330b2740e48" +content-hash = "e055fdbc956dc6ff6ceeaf5ebcbd8a87075e058deef33b392068d139f13c983e" diff --git a/agents-api/pyproject.toml b/agents-api/pyproject.toml index 1701a45cd..eee143ec4 100644 --- a/agents-api/pyproject.toml +++ b/agents-api/pyproject.toml @@ -38,6 +38,7 @@ scalar-fastapi = "^1.0.3" sse-starlette = "^2.1.3" anyio = "^4.4.0" python-box = {extras = ["toml"], version = "^7.2.0"} +prometheus-fastapi-instrumentator = "^7.0.0" [tool.poetry.group.dev.dependencies] ipython = "^8.26.0" ruff = "^0.5.5" diff --git a/docker-compose.yml b/docker-compose.yml index c5ea3bbf0..678e68a9d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,8 @@ include: - ./scheduler/docker-compose.yml - ./llm-proxy/docker-compose.yml - ./integrations-service/docker-compose.yml + - ./prometheus/docker-compose.yml + - ./grafana/docker-compose.yml # TODO: Enable after testing # - ./monitoring/docker-compose.yml diff --git a/grafana/docker-compose.yml b/grafana/docker-compose.yml new file mode 100644 index 000000000..86723774c --- /dev/null +++ b/grafana/docker-compose.yml @@ -0,0 +1,20 @@ +name: grafana + +services: + grafana: + image: grafana/grafana + environment: + - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} + - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER} + container_name: grafana + ports: + - 3000:3000 + volumes: + - grafana_data:/var/lib/grafana + - ./provisioning:/etc/grafana/provisioning + profiles: + - multi-tenant + +volumes: + grafana_data: + external: true diff --git a/grafana/provisioning/datasources/datasource.yml b/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 000000000..8341f7670 --- /dev/null +++ b/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,9 @@ +datasources: +- access: 'proxy' + editable: true + is_default: true + name: 'agents-api' + org_id: 1 + type: 'prometheus' + url: 'http://prometheus:9090' + version: 1 diff --git a/prometheus/config/prometheus.yml b/prometheus/config/prometheus.yml new file mode 100644 index 000000000..e556a2c53 --- /dev/null +++ b/prometheus/config/prometheus.yml @@ -0,0 +1,24 @@ +global: + scrape_interval: 15s + scrape_timeout: 10s + evaluation_interval: 15s +alerting: + alertmanagers: + - follow_redirects: true + enable_http2: true + scheme: http + timeout: 10s + api_version: v2 + static_configs: + - targets: [] +scrape_configs: +- job_name: agents-api + honor_timestamps: true + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - agents-api-multi-tenant:8080 diff --git a/prometheus/docker-compose.yml b/prometheus/docker-compose.yml new file mode 100644 index 000000000..f3c53d966 --- /dev/null +++ b/prometheus/docker-compose.yml @@ -0,0 +1,23 @@ +name: prometheus + +services: + prometheus: + image: prom/prometheus + container_name: prometheus + profiles: + - multi-tenant + + volumes: + - ./config/prometheus.yml:/etc/prometheus/prometheus.yml + - prometheus_data:/prometheus + + depends_on: + agents-api-multi-tenant: + condition: service_started + + command: + - '--config.file=/etc/prometheus/prometheus.yml' + +volumes: + prometheus_data: + external: true From 6bd24ebb2faba38ffb2126d45bf900f174be8b0e Mon Sep 17 00:00:00 2001 From: whiterabbit1983 Date: Sat, 12 Oct 2024 16:31:26 +0300 Subject: [PATCH 095/113] fix: Exclude unset fields from agent's default settings (#628) > [!IMPORTANT] > `create_or_update_agent` now excludes unset fields from `default_settings`, and a test is skipped in `test_docs_queries.py`. > > - **Behavior**: > - In `create_or_update_agent`, `default_settings` now uses `model_dump(exclude_unset=True)` to exclude unset fields. > - **Tests**: > - Skips test `model: get docs` in `test_docs_queries.py` with a note to execute embedding workflow to fix it. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for b49f435cd31ba3c1a3f1dda21da4dab6f11b10ee. It will automatically update as commits are pushed. --------- Co-authored-by: Diwank Singh Tomer Co-authored-by: whiterabbit1983 --- .../agents_api/models/agent/create_or_update_agent.py | 6 +++++- agents-api/tests/test_docs_queries.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/agents-api/agents_api/models/agent/create_or_update_agent.py b/agents-api/agents_api/models/agent/create_or_update_agent.py index 8a3975183..08adcfefd 100644 --- a/agents-api/agents_api/models/agent/create_or_update_agent.py +++ b/agents-api/agents_api/models/agent/create_or_update_agent.py @@ -83,7 +83,11 @@ def create_or_update_agent( data.default_settings = data.default_settings or {} agent_data = data.model_dump() - default_settings = agent_data.pop("default_settings") + default_settings = ( + data.default_settings.model_dump(exclude_none=True) + if data.default_settings + else {} + ) settings_cols, settings_vals = cozo_process_mutate_data( { diff --git a/agents-api/tests/test_docs_queries.py b/agents-api/tests/test_docs_queries.py index b0f886c4f..c5826df43 100644 --- a/agents-api/tests/test_docs_queries.py +++ b/agents-api/tests/test_docs_queries.py @@ -1,6 +1,6 @@ # Tests for entry queries -from ward import test +from ward import skip, test from agents_api.autogen.openapi_model import CreateDocRequest from agents_api.models.docs.create_doc import create_doc @@ -41,7 +41,7 @@ def _( ) -# TODO: Execute embedding workflow to fix this test and other docs tests +@skip("Execute embedding workflow to fix this test and other docs tests") @test("model: get docs") def _(client=cozo_client, doc=test_doc, developer_id=test_developer_id): get_doc( From df347605949b9ce846d4d87388f76adee3191921 Mon Sep 17 00:00:00 2001 From: Dmitry Paramonov Date: Sat, 12 Oct 2024 19:51:10 +0300 Subject: [PATCH 096/113] chore: Remove DS_Store --- agents-api/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 agents-api/.DS_Store diff --git a/agents-api/.DS_Store b/agents-api/.DS_Store deleted file mode 100644 index 04526ed473706adce6fc097c8f456c9f5425d70f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}(1u5S~o}wi_Yk0216*>NOHc_*2Bi3iJgqqKCFhZ4!Zn@kX&j4pt9uB_|@{_Je#agO}LO&yi z4Ehkl2;!A!HvEkY(As^#6}y5Vq_D7l(KH)HiHgww6pfNN%Ui8yQK{C})*aVz>+ZMU zT1|sI%qLkd9Dku-=Sn5fd>%#@@o?I2Y@Vnz594$=)(P=oh#_A;$LT;#duoynGMyV3 zhwHgszp-5uoz_uP?zP*qrYyRhR#Wcp9nNN+yY+GR_^f}E+@|W@5Gru*Y1yzihXe z#%ZF`D@vnW7G{7MU?|)cc_{=>GrodjGG3cwh#Yfq#<$Q9BJzdsv&jTUV;2yH=upM Date: Sun, 13 Oct 2024 23:58:43 +0530 Subject: [PATCH 097/113] Update README.md --- README.md | 203 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 140 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 3d82661b5..4f229bc96 100644 --- a/README.md +++ b/README.md @@ -777,70 +777,84 @@ Tasks in Julep can include various types of steps, allowing you to create comple Each step type serves a specific purpose in building sophisticated AI workflows. This categorization helps in understanding the various control flows and operations available in Julep tasks. -## Advanced Features -Julep offers a range of advanced features to enhance your AI workflows: - -### Adding Tools to Agents - -Extend your agent's capabilities by integrating external tools and APIs: - -```python -client.agents.tools.create( - agent_id=agent.id, - name="web_search", - description="Search the web for information.", - integration={ - "provider": "brave", - "method": "search", - "setup": {"api_key": "your_brave_api_key"}, - }, -) -``` - -### Managing Sessions and Users - -Julep provides robust session management for persistent interactions: - -```python -session = client.sessions.create( - agent_id=agent.id, - user_id=user.id, - context_overflow="adaptive" -) - -# Continue conversation in the same session -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": "Follow up on the previous conversation." - } - ] -) -``` - -### Document Integration and Search - -Easily manage and search through documents for your agents: - -```python -# Upload a document -document = client.agents.docs.create( - title="AI advancements", - content="AI is changing the world...", - metadata={"category": "research_paper"} -) - -# Search documents -results = client.agents.docs.search( - text="AI advancements", - metadata_filter={"category": "research_paper"} -) -``` - -For more advanced features and detailed usage, please refer to our [Advanced Features Documentation](https://docs.julep.ai/advanced-features). +## Tool Types + +Agents can be given access to a number of "tools" -- any programmatic interface that a foundation model can "call" with a set of inputs to achieve a goal. For example, it might use a `web_search(query)` tool to search the Internet for some information. + +Unlike agent frameworks, julep is a _backend_ that manages agent execution. Clients can interact with agents using our SDKs. julep takes care of executing tasks and running integrations. + +Tools in julep can be one of: +1. **User-defined `function`s** + These are function signatures that you can give the model to choose from, similar to how [openai]'s function-calling works. An example: + ```yaml + name: send_text_message + description: Send a text message to a recipient. + parameters: + type: object + properties: + to: + type: string + description: Phone number of recipient. + text: + type: string + description: Content of the message. + ``` + + Whenever julep encounters a _user-defined function_, it pauses, giving control back to the client and waits for the client to run the function call and give the results back to julep. + +2. **`system` tools** + Built-in tools that can be used to call the julep APIs themselves, like triggering a task execution, appending to a metadata field, etc. + + `system` tools are built into the backend. They get executed automatically when needed. They do _not_ require any action from the client-side. + For example, + + ```yaml + name: Example system tool task + description: List agents using system call + input_schema: + type: object + tools: + - name: list_agents + description: List all agents + type: system + system: + resource: agent + operation: list + main: + - tool: list_agents + arguments: + limit: '10' + ``` + +3. **Built-in `integration`s** + Julep comes with a number of built-in integrations (as described in the section below). `integration` tools are directly executed on the julep backend. Any additional parameters needed by them at runtime can be set in the agent/session/user's `metadata` fields. + julep backend ships with integrated third party tools from the following providers: + - [composio](https://composio.dev) \*\* + - [anon](https://anon.com) \*\* + - [langchain toolkits](https://python.langchain.com/v0.2/docs/integrations/toolkits/). Support for _Github, Gitlab, Gmail, Jira, MultiOn, Slack_ toolkits is planned. + + \*\* Since _composio_ and _anon_ are third-party providers, their tools require setting up account linking. + +4. **`api_call`s** + julep can also directly make api calls during workflow executions as tool calls. Same as `integration`s, additional runtime parameters are loaded from `metadata` fields. + + For example, + + ```yaml + name: Example api_call task + tools: + - type: api_call + name: hello + api_call: + method: GET + url: https://httpbin.org/get + main: + - tool: hello + arguments: + params: + test: _.input + ``` ## Integrations @@ -934,6 +948,69 @@ output: These integrations can be used within your tasks to extend the capabilities of your AI agents. For more detailed information on how to use these integrations in your workflows, please refer to our [Integrations Documentation](https://docs.julep.ai/integrations). +## Other Features + +Julep offers a range of advanced features to enhance your AI workflows: + +### Adding Tools to Agents + +Extend your agent's capabilities by integrating external tools and APIs: + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) +``` + +### Managing Sessions and Users + +Julep provides robust session management for persistent interactions: + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id=user.id, + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] +) +``` + +### Document Integration and Search + +Easily manage and search through documents for your agents: + +```python +# Upload a document +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} +) +``` + ## SDK Reference - [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) From 69d3087f0bee6d7f76e68f5e561b4bbe7b7ee8ab Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 13 Oct 2024 18:28:58 +0000 Subject: [PATCH 098/113] chore(docs): update TOC --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4f229bc96..ea4813197 100644 --- a/README.md +++ b/README.md @@ -92,10 +92,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Concepts](#concepts) - [Understanding Tasks](#understanding-tasks) - [Types of Workflow Steps](#types-of-workflow-steps) -- [Advanced Features](#advanced-features) - - [Adding Tools to Agents](#adding-tools-to-agents) - - [Managing Sessions and Users](#managing-sessions-and-users) - - [Document Integration and Search](#document-integration-and-search) +- [Tool Types](#tool-types) - [Integrations](#integrations) - [Brave Search](#brave-search) - [BrowserBase](#browserbase) @@ -103,6 +100,10 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Spider](#spider) - [Weather](#weather) - [Wikipedia](#wikipedia) +- [Other Features](#other-features) + - [Adding Tools to Agents](#adding-tools-to-agents) + - [Managing Sessions and Users](#managing-sessions-and-users) + - [Document Integration and Search](#document-integration-and-search) - [SDK Reference](#sdk-reference) - [API Reference](#api-reference) From 02d5ba026caabad509b07c98f677dc1fa078a55e Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 14 Oct 2024 00:16:40 +0530 Subject: [PATCH 099/113] Update README.md --- README.md | 115 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index ea4813197..bdf6b0479 100644 --- a/README.md +++ b/README.md @@ -786,35 +786,48 @@ Agents can be given access to a number of "tools" -- any programmatic interface Unlike agent frameworks, julep is a _backend_ that manages agent execution. Clients can interact with agents using our SDKs. julep takes care of executing tasks and running integrations. Tools in julep can be one of: -1. **User-defined `function`s** - These are function signatures that you can give the model to choose from, similar to how [openai]'s function-calling works. An example: - ```yaml - name: send_text_message - description: Send a text message to a recipient. - parameters: - type: object - properties: - to: - type: string - description: Phone number of recipient. - text: - type: string - description: Content of the message. - ``` + +### User-defined `function`s + +These are function signatures that you can give the model to choose from, similar to how [openai]'s function-calling works. An example: + +```yaml + name: Example system tool task + description: List agents using system call + + tools: + - name: send_notification + description: Send a notification to the user + type: function + function: + parameters: + type: object + properties: + text: + type: string + description: Content of the notification + + main: + - tool: send_notification + arguments: + content: hi +``` Whenever julep encounters a _user-defined function_, it pauses, giving control back to the client and waits for the client to run the function call and give the results back to julep. -2. **`system` tools** - Built-in tools that can be used to call the julep APIs themselves, like triggering a task execution, appending to a metadata field, etc. - - `system` tools are built into the backend. They get executed automatically when needed. They do _not_ require any action from the client-side. - For example, - - ```yaml +> [!TIP] +> **Example cookbook**: [cookbooks/13-Error_Handling_and_Recovery.py](https://github.com/julep-ai/julep/blob/dev/cookbooks/13-Error_Handling_and_Recovery.py) + +### `system` tools +Built-in tools that can be used to call the julep APIs themselves, like triggering a task execution, appending to a metadata field, etc. +`system` tools are built into the backend. They get executed automatically when needed. They do _not_ require any action from the client-side. + +For example, + + ```yaml name: Example system tool task description: List agents using system call - input_schema: - type: object + tools: - name: list_agents description: List all agents @@ -825,22 +838,31 @@ Tools in julep can be one of: main: - tool: list_agents arguments: - limit: '10' - ``` - -3. **Built-in `integration`s** - Julep comes with a number of built-in integrations (as described in the section below). `integration` tools are directly executed on the julep backend. Any additional parameters needed by them at runtime can be set in the agent/session/user's `metadata` fields. - julep backend ships with integrated third party tools from the following providers: - - [composio](https://composio.dev) \*\* - - [anon](https://anon.com) \*\* - - [langchain toolkits](https://python.langchain.com/v0.2/docs/integrations/toolkits/). Support for _Github, Gitlab, Gmail, Jira, MultiOn, Slack_ toolkits is planned. - - \*\* Since _composio_ and _anon_ are third-party providers, their tools require setting up account linking. - -4. **`api_call`s** - julep can also directly make api calls during workflow executions as tool calls. Same as `integration`s, additional runtime parameters are loaded from `metadata` fields. + limit: 10 + ``` + +> [!TIP] +> **Example cookbook**: [cookbooks/10-Document_Management_and_Search.py](https://github.com/julep-ai/julep/blob/dev/cookbooks/10-Document_Management_and_Search.py) + +### Built-in `integration`s +Julep comes with a number of built-in integrations (as described in the section below). `integration` tools are directly executed on the julep backend. Any additional parameters needed by them at runtime can be set in the agent/session/user's `metadata` fields. + +> [!TIP] +> **Example cookbook**: [cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + +julep backend ships with integrated third party tools from the following providers: +- [composio](https://composio.dev) \*\* +- [anon](https://anon.com) \*\* +- [langchain toolkits](https://python.langchain.com/v0.2/docs/integrations/toolkits/). Support for _Github, Gitlab, Gmail, Jira, MultiOn, Slack_ toolkits is planned. + +\*\* Since _composio_ and _anon_ are third-party providers, their tools require setting up account linking. + + +### Direct `api_call`s + +julep can also directly make api calls during workflow executions as tool calls. Same as `integration`s, additional runtime parameters are loaded from `metadata` fields. - For example, +For example, ```yaml name: Example api_call task @@ -874,6 +896,9 @@ output: result: string # The result of the Brave Search ``` +> [!TIP] +> **Example cookbook**: [cookbooks/03-SmartResearcher_With_WebSearch.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) + ### BrowserBase ```yaml @@ -908,6 +933,9 @@ output: success: boolean # Whether the email was sent successfully ``` +> [!TIP] +> **Example cookbook**: [cookbooks/00-Devfest-Email-Assistant.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/00-Devfest-Email-Assistant.ipynb) + ### Spider ```yaml @@ -923,6 +951,9 @@ output: documents: list # The documents returned from the spider ``` +> [!TIP] +> **Example cookbook**: [cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + ### Weather ```yaml @@ -936,6 +967,9 @@ output: result: string # The weather data for the specified location ``` +> [!TIP] +> **Example cookbook**: [cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + ### Wikipedia ```yaml @@ -947,6 +981,9 @@ output: documents: list # The documents returned from the Wikipedia search ``` +> [!TIP] +> **Example cookbook**: [cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + These integrations can be used within your tasks to extend the capabilities of your AI agents. For more detailed information on how to use these integrations in your workflows, please refer to our [Integrations Documentation](https://docs.julep.ai/integrations). ## Other Features From 6fd32d006f7e445fcc8f677b552159feaded2f12 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 13 Oct 2024 18:46:53 +0000 Subject: [PATCH 100/113] chore(docs): update TOC --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bdf6b0479..ff88a2137 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,10 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Understanding Tasks](#understanding-tasks) - [Types of Workflow Steps](#types-of-workflow-steps) - [Tool Types](#tool-types) + - [User-defined `function`s](#user-defined-functions) + - [`system` tools](#system-tools) + - [Built-in `integration`s](#built-in-integrations) + - [Direct `api_call`s](#direct-api_calls) - [Integrations](#integrations) - [Brave Search](#brave-search) - [BrowserBase](#browserbase) From b7dbb931e0e102e008f37d853c70106befecd9e3 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Mon, 14 Oct 2024 01:43:06 +0530 Subject: [PATCH 101/113] Update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index ff88a2137..82e42f47f 100644 --- a/README.md +++ b/README.md @@ -1053,6 +1053,19 @@ results = client.agents.docs.search( ) ``` +## Local Quickstart + +**Requirements**: +- latest docker compose installed + +**Steps**: +1. `git clone https://github.com/julep-ai/julep.git` +2. `cd julep` +3. `docker volume create cozo_backup` +4. `docker volume create cozo_data` +5. `cp .env.example .env # <-- Edit this file` +6. `docker compose --env-file .env --profile temporal-ui --profile single-tenant --profile self-hosted-db up --build` + ## SDK Reference - [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) From 5cef1843fa56ba9c8b9ba62b46240feb93e66a7c Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 13 Oct 2024 20:13:22 +0000 Subject: [PATCH 102/113] chore(docs): update TOC --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 82e42f47f..0801dce07 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 - [Adding Tools to Agents](#adding-tools-to-agents) - [Managing Sessions and Users](#managing-sessions-and-users) - [Document Integration and Search](#document-integration-and-search) +- [Local Quickstart](#local-quickstart) - [SDK Reference](#sdk-reference) - [API Reference](#api-reference) From e02ee06bc170e45398f3ed9fc1d997983ee4999f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 13 Oct 2024 16:33:49 -0400 Subject: [PATCH 103/113] feat: Create a new blob-store service for handling large temporal payloads (#642) - **feat(blob-store): Add blob store for storing large blobs for agent workflows** - **feat(blob-store): Add authentication** ---- > [!IMPORTANT] > Introduces a new blob-store service using SeaweedFS for handling large temporal payloads, with Docker and authentication setup. > > - **Blob Store Service**: > - Introduces a new blob-store service using SeaweedFS in `blob-store/Dockerfile`, `docker-compose.yml`, and `docker-compose-ha.yml`. > - Adds `entrypoint.sh` for environment variable checks and configuration file generation. > - Includes `s3.json.template` for S3 configuration. > - **Environment Configuration**: > - Updates `.env.example` with `S3_ENDPOINT`, `S3_ACCESS_KEY`, and `S3_SECRET_KEY` for blob store configuration. > - Adds `USE_BLOB_STORE_FOR_TEMPORAL` and `BLOB_STORE_CUTOFF_KB` for temporal payload handling. > - **Authentication**: > - Implements authentication in `s3.json.template` with access and secret keys for the `julep` account. > - **Miscellaneous**: > - Adds `.gitignore` entry for `/s3.json` in `blob-store/.gitignore`. > - Updates main `docker-compose.yml` to include `blob-store/docker-compose.yml`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 736b9df56e525dcb4a1d79ec5ec60e978181b803. It will automatically update as commits are pushed. --------- Signed-off-by: Diwank Singh Tomer --- .env.example | 18 +++++++ blob-store/.gitignore | 1 + blob-store/Dockerfile | 23 +++++++++ blob-store/docker-compose-ha.yml | 82 ++++++++++++++++++++++++++++++++ blob-store/docker-compose.yml | 39 +++++++++++++++ blob-store/entrypoint.sh | 27 +++++++++++ blob-store/s3.json.template | 33 +++++++++++++ docker-compose.yml | 1 + 8 files changed, 224 insertions(+) create mode 100644 blob-store/.gitignore create mode 100644 blob-store/Dockerfile create mode 100644 blob-store/docker-compose-ha.yml create mode 100644 blob-store/docker-compose.yml create mode 100755 blob-store/entrypoint.sh create mode 100644 blob-store/s3.json.template diff --git a/.env.example b/.env.example index 662e53e11..bf86df708 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,14 @@ # Security # -------- + +# Please set these access keys to something random and unique. +# Note: For just testing, you can set them to the same value. + +# On Linux, you can generate a random key with: +# openssl rand -base64 32 +# OR +# tr -dc 'A-Za-z0-9+_/' AGENTS_API_KEY= COZO_AUTH_TOKEN= @@ -37,6 +46,8 @@ LITELLM_REDIS_PASSWORD= # EMBEDDING_MODEL_ID=Alibaba-NLP/gte-large-en-v1.5 # NUM_GPUS=1 # INTEGRATION_SERVICE_URL=http://integrations:8000 +# USE_BLOB_STORE_FOR_TEMPORAL=false +# BLOB_STORE_CUTOFF_KB=1024 # Temporal # -------- @@ -69,3 +80,10 @@ LITELLM_REDIS_PASSWORD= # GITHUB_API_KEY= # VOYAGE_API_KEY= # GOOGLE_APPLICATION_CREDENTIALS=.keys/julep-vertexai-svc.json + +# Blob Store +# ----------- + +# S3_ENDPOINT=http://seaweedfs:8333 +# S3_ACCESS_KEY= +# S3_SECRET_KEY= \ No newline at end of file diff --git a/blob-store/.gitignore b/blob-store/.gitignore new file mode 100644 index 000000000..00bcc192e --- /dev/null +++ b/blob-store/.gitignore @@ -0,0 +1 @@ +/s3.json diff --git a/blob-store/Dockerfile b/blob-store/Dockerfile new file mode 100644 index 000000000..c36e8022c --- /dev/null +++ b/blob-store/Dockerfile @@ -0,0 +1,23 @@ +# syntax=docker/dockerfile:1 +# check=error=true + +FROM chrislusf/seaweedfs + +# Install envsubst +ENV BUILD_DEPS="gettext" \ + RUNTIME_DEPS="libintl" + +RUN set -x && \ + apk add --update $RUNTIME_DEPS && \ + apk add --virtual build_deps $BUILD_DEPS && \ + cp /usr/bin/envsubst /usr/local/bin/envsubst && \ + apk del build_deps + +# Expected environment variables: +# - S3_ACCESS_KEY +# - S3_SECRET_KEY + +COPY s3.json.template /s3.json.template +COPY entrypoint.sh /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/blob-store/docker-compose-ha.yml b/blob-store/docker-compose-ha.yml new file mode 100644 index 000000000..6634357ea --- /dev/null +++ b/blob-store/docker-compose-ha.yml @@ -0,0 +1,82 @@ +name: julep-blob-store + +x-seaweedfs-base: + &seaweedfs-base + image: chrislusf/seaweedfs + profiles: + - blob-store + +services: + seaweedfs-master: + <<: *seaweedfs-base + ports: + - 9333:9333 + - 19333:19333 + command: "master -ip=seaweedfs-master -ip.bind=0.0.0.0 -port=9333 -metricsPort=9321 -raftBootstrap" + healthcheck: + test: [ "CMD", "wget", "-qSO", "-", "http://0.0.0.0:9333/cluster/healthz" ] + interval: 60s + retries: 6 + timeout: 60s + start_period: 30s + start_interval: 10s + + seaweedfs-volume: + <<: *seaweedfs-base + ports: + - 28080:28080 # Since 8080 is already used by agents-api, we use 28080 + - 18081:18080 + command: 'volume -mserver="seaweedfs-master:9333" -dir=/data -ip.bind=0.0.0.0 -port=28080 -ip=seaweedfs-volume -metricsPort=9321 -preStopSeconds=3' + healthcheck: + test: [ "CMD", "wget", "-qSO", "-", "http://0.0.0.0:28080/healthz" ] + interval: 60s + retries: 6 + timeout: 30s + start_period: 30s + start_interval: 10s + + depends_on: + seaweedfs-master: + condition: service_healthy + + volumes: + - seaweedfs_data:/data + + seaweedfs-filer: + <<: *seaweedfs-base + ports: + - 8888:8888 + - 18888:18888 + command: 'filer -master="seaweedfs-master:9333" -ip.bind=0.0.0.0 -port=8888 -ip=seaweedfs-filer -metricsPort=9321' + tty: true + stdin_open: true + healthcheck: + test: [ "CMD", "wget", "-qSO", "-", "http://0.0.0.0:8888/healthz" ] + interval: 60s + retries: 6 + timeout: 30s + start_period: 30s + start_interval: 10s + + depends_on: + seaweedfs-master: + condition: service_healthy + seaweedfs-volume: + condition: service_healthy + + seaweedfs-s3: + <<: *seaweedfs-base + ports: + - 8333:8333 + command: 's3 -filer="seaweedfs-filer:8888" -ip.bind=0.0.0.0 -port=8333 -metricsPort=9321' + depends_on: + seaweedfs-master: + condition: service_healthy + seaweedfs-volume: + condition: service_healthy + seaweedfs-filer: + condition: service_healthy + +volumes: + seaweedfs_data: + external: true diff --git a/blob-store/docker-compose.yml b/blob-store/docker-compose.yml new file mode 100644 index 000000000..60a296db7 --- /dev/null +++ b/blob-store/docker-compose.yml @@ -0,0 +1,39 @@ +name: julep-blob-store + +services: + seaweedfs: + image: julepai/blob-store:${TAG} + build: + context: . + dockerfile: Dockerfile + profiles: + - blob-store + + environment: + - S3_ACCESS_KEY=${S3_ACCESS_KEY} + - S3_SECRET_KEY=${S3_SECRET_KEY} + - DEBUG=${DEBUG:-true} + + ports: + - 9333:9333 # master port + - 8333:8333 # s3 port + - 8888:8888 # filer port + - 28080:28080 # volume port + # - 19333:19333 # master grpc port + # - 18081:18080 # volume grpc port + # - 18888:18888 # filer grpc port + command: "-filer -s3 -dir=/data -ip=seaweedfs -ip.bind=0.0.0.0 -metricsPort=9321 -master.raftBootstrap=false -master.port=9333 -master.resumeState=true -volume.port=28080 -volume.index=leveldb -filer.port=8888 -s3.port=8333" + healthcheck: + test: [ "CMD", "wget", "-qSO", "-", "http://0.0.0.0:9333/cluster/healthz" ] + interval: 60s + retries: 6 + timeout: 60s + start_period: 30s + start_interval: 10s + + volumes: + - seaweedfs_data:/data + +volumes: + seaweedfs_data: + external: true diff --git a/blob-store/entrypoint.sh b/blob-store/entrypoint.sh new file mode 100755 index 000000000..156522249 --- /dev/null +++ b/blob-store/entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +set -e + +# Check the environment variables +for var_name in S3_ACCESS_KEY S3_SECRET_KEY +do + if [ -z "`eval echo \\\$$var_name`" ]; then + echo "Error: Environment variable '$var_name' is not set." + exit 1 + fi +done + +# Generate the s3.json configuration file +envsubst < /s3.json.template > /s3.json + +if [ "$DEBUG" = "true" ]; then + echo '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' + echo '@@@ Careful: Debug mode is enabled. @@@' + echo '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@' + + echo 'Printing s3.json:' + cat /s3.json +fi + +# Forward all arguments to the seaweedfs binary +exec weed server -s3.config=/s3.json "$@" diff --git a/blob-store/s3.json.template b/blob-store/s3.json.template new file mode 100644 index 000000000..e6c698a1f --- /dev/null +++ b/blob-store/s3.json.template @@ -0,0 +1,33 @@ +{ + "identities": [ + { + "name": "anonymous", + "actions": [ + "Read" + ] + }, + { + "name": "julep", + "credentials": [ + { + "accessKey": "${S3_ACCESS_KEY}", + "secretKey": "${S3_SECRET_KEY}" + } + ], + "actions": [ + "Admin", + "Read", + "List", + "Tagging", + "Write" + ] + } + ], + "accounts": [ + { + "id" : "julep", + "displayName": "Julep", + "emailAddress": "developers@julep.ai" + } + ] +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 678e68a9d..350adf626 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,6 +14,7 @@ include: - ./integrations-service/docker-compose.yml - ./prometheus/docker-compose.yml - ./grafana/docker-compose.yml + - ./blob-store/docker-compose.yml # TODO: Enable after testing # - ./monitoring/docker-compose.yml From 958217f06a83a3717aa5356309de7b5ed24c0784 Mon Sep 17 00:00:00 2001 From: ItsAmziii <75982382+itsamziii@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:09:14 +0530 Subject: [PATCH 104/113] feat: Automate README translations (#624) Draft PR for #600 > Some known issues that are to be fixed yet (this is just a draft PR) - The workflow takes too long for translations, approx. ~10 mins, may batch translating content be helpful? - Code blocks are exempted from translations due to unexpected translations of syntax - Hyperlinks for TOC currently aren't being translated Currently the translator uses Google AJAX Api for translations so the translations may not be "good". Best approach would perhaps be utilizing machine translation instead. ---- > [!IMPORTANT] > Automates translation of `README.md` into multiple languages using a GitHub workflow and Python script, preserving code blocks and HTML tags. > > - **Workflow**: > - Adds `.github/workflows/translate-readme.yml` to automate translation of `README.md` on push. > - Uses `deep-translator` and `parmapper` for translation and parallel processing. > - Translates into Chinese, Japanese, and French. > - **Script**: > - `scripts/readme_translator.py` translates `README.md`, preserving code blocks and HTML tags. > - Uses `GoogleTranslator` from `deep-translator` for language translation. > - Saves translated files as `README-CN.md`, `README-JA.md`, `README-FR.md`. > - **Known Issues**: > - Translation process is slow (~10 mins), potential for batching. > - Code blocks and TOC links are not translated. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 020e1024adb96317d29b30e4f27f1eaf4ce3ec0f. It will automatically update as commits are pushed. --------- Co-authored-by: github-actions[bot] Co-authored-by: itsamziii Co-authored-by: Diwank Singh Tomer --- .github/workflows/translate-readme.yml | 38 + README-CN.md | 1172 ++++++++++++++---------- README-FR.md | 948 +++++++++++++++++++ README-JA.md | 945 +++++++++++++++++++ README.md | 2 +- scripts/readme_translator.py | 75 ++ 6 files changed, 2716 insertions(+), 464 deletions(-) create mode 100644 .github/workflows/translate-readme.yml create mode 100644 README-FR.md create mode 100644 README-JA.md create mode 100644 scripts/readme_translator.py diff --git a/.github/workflows/translate-readme.yml b/.github/workflows/translate-readme.yml new file mode 100644 index 000000000..57a7c8ade --- /dev/null +++ b/.github/workflows/translate-readme.yml @@ -0,0 +1,38 @@ +name: Translate ReadME + +on: + push: + paths: + - "README.md" + +jobs: + readme-translator: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Setup Python v3.10.12 + uses: actions/setup-python@v5 + with: + python-version: "3.10.12" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install deep-translator git+https://github.com/Jwink3101/parmapper + + - name: Run translator script + run: python scripts/readme_translator.py + + - name: Commit changes + run: | + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git add README-*.md + git commit -m "chore(readme): translate README.md" + + - name: Push changes + uses: ad-m/github-push-action@v0.6.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.ref }} diff --git a/README-CN.md b/README-CN.md index b8f19f31a..ebf51db6e 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,59 +1,64 @@ -[English](README.md) | 中文 | [日本語](README-JP.md) +English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md)
- julep + julep


探索文档 · - Discord + 不和谐 · 𝕏 · - 领英 + LinkedIn

- NPM 版本 + NPM Version   - PyPI - 版本 + PyPI - Version   - Docker 镜像版本 + Docker Image Version   - GitHub 许可证 + GitHub License

***** -> [!TIP] -> 👨‍💻 来参加 devfest.ai 活动?加入我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 并查看下方详情。 +> [!注意] +> 👨‍💻 来参加 devfest.ai 活动了吗?加入我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 并查看以下详细信息。
-🌟 贡献者和 DevFest.AI 参与者: +🌟 贡献者和 DevFest.AI 参与者(点击展开) -## 🌟 诚邀贡献者! +## 🌟 招募贡献者! -我们很高兴欢迎新的贡献者加入 Julep 项目!我们创建了几个"适合新手的问题"来帮助您入门。以下是您可以贡献的方式: +我们很高兴欢迎新贡献者加入 Julep 项目!我们创建了几个“好的第一个问题”来帮助您入门。以下是您可以做出贡献的方式: -1. 查看我们的 [CONTRIBUTING.md](CONTRIBUTING.md) 文件,了解如何贡献的指南。 -2. 浏览我们的[适合新手的问题](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22),找到一个您感兴趣的任务。 -3. 如果您有任何问题或需要帮助,请随时在我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 频道上联系我们。 +1. 查看我们的 [CONTRIBUTING.md](https://github.com/julep-ai/julep/blob/dev/CONTRIBUTING.md) 文件以获取有关如何贡献的指南。 +2. 浏览我们的 [good first issues](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) 以找到您感兴趣的任务。 +3. 如果您有任何疑问或需要帮助,请随时通过我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 频道联系我们。 -您的贡献,无论大小,对我们都很宝贵。让我们一起创造令人惊叹的东西吧!🚀 +您的贡献,无论大小,对我们来说都是宝贵的。让我们一起创造一些了不起的东西!🚀 -### 🎉 DevFest.AI 2024年10月 +### 🎉 DevFest.AI 2024 年 10 月 -激动人心的消息!我们将在整个2024年10月参与 DevFest.AI 活动!🗓️ +令人兴奋的消息!我们将参加 2024 年 10 月的 DevFest.AI!🗓️ -- 在此活动期间为 Julep 做出贡献,有机会赢得超棒的 Julep 周边和礼品!🎁 -- 加入来自世界各地的开发者,为 AI 仓库做出贡献并参与精彩的活动。 -- 非常感谢 DevFest.AI 组织这个fantastic的活动! +- 在本次活动期间为 Julep 做出贡献,就有机会赢得超棒的 Julep 商品和赃物!🎁 +- 与来自世界各地的开发人员一起为 AI 资源库做出贡献并参与精彩的活动。 +- 非常感谢 DevFest.AI 组织这次精彩的活动! -> [!TIP] -> 准备好加入这场盛会了吗?**[发推文开始参与](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)**,让我们开始编码吧!🖥️ +> [!提示] +> 准备好加入这场有趣的活动了吗?**[发推文表示你正在参与](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** 让我们开始编码吧!🖥️ + +> [!注意] +> 从[此处](https://dashboard-dev.julep.ai)获取您的 API 密钥。 +> +> 虽然我们处于测试阶段,但您也可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 联系,以解除 API 密钥的速率限制。 ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) @@ -64,537 +69,716 @@

📖 Table of Contents

-- [简介](#%E7%AE%80%E4%BB%8B) -- [特性](#%E7%89%B9%E6%80%A7) -- [安装](#%E5%AE%89%E8%A3%85) -- [快速入门指南](#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97) - - [步骤 1:导入 Julep](#%E6%AD%A5%E9%AA%A4-1%E5%AF%BC%E5%85%A5-julep) - - [步骤 2:初始化代理](#%E6%AD%A5%E9%AA%A4-2%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BB%A3%E7%90%86) - - [步骤 3:与代理聊天](#%E6%AD%A5%E9%AA%A4-3%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9) - - [步骤 4:创建多步骤任务](#%E6%AD%A5%E9%AA%A4-4%E5%88%9B%E5%BB%BA%E5%A4%9A%E6%AD%A5%E9%AA%A4%E4%BB%BB%E5%8A%A1) - - [步骤 5:执行任务](#%E6%AD%A5%E9%AA%A4-5%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1) +- [为什么选择 Julep 而不是 LangChain?](#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9-julep-%E8%80%8C%E4%B8%8D%E6%98%AF-langchain) + - [不同的用例](#%E4%B8%8D%E5%90%8C%E7%9A%84%E7%94%A8%E4%BE%8B) + - [不同的外形尺寸](#%E4%B8%8D%E5%90%8C%E7%9A%84%E5%A4%96%E5%BD%A2%E5%B0%BA%E5%AF%B8) +- [Python 快速入门🐍](#python-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8) + - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86) + - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1) + - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1) + - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9) +- [Node.js 快速入门 🟩](#nodejs-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8-) + - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86-1) + - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1-1) + - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1-1) + - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9-1) + - [心智模型](#%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B) - [概念](#%E6%A6%82%E5%BF%B5) - - [代理](#%E4%BB%A3%E7%90%86) - - [用户](#%E7%94%A8%E6%88%B7) - - [会话](#%E4%BC%9A%E8%AF%9D) - - [任务](#%E4%BB%BB%E5%8A%A1) - - [工具](#%E5%B7%A5%E5%85%B7) - - [文档](#%E6%96%87%E6%A1%A3) - - [执行](#%E6%89%A7%E8%A1%8C) - [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1) - - [工作流步骤类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%B1%BB%E5%9E%8B) + - [工作流步骤的类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%9A%84%E7%B1%BB%E5%9E%8B) - [高级功能](#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD) - - [为代理添加工具](#%E4%B8%BA%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7) + - [向代理添加工具](#%E5%90%91%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7) - [管理会话和用户](#%E7%AE%A1%E7%90%86%E4%BC%9A%E8%AF%9D%E5%92%8C%E7%94%A8%E6%88%B7) - - [文档集成和搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E5%92%8C%E6%90%9C%E7%B4%A2) + - [文档集成与搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E4%B8%8E%E6%90%9C%E7%B4%A2) +- [集成](#%E9%9B%86%E6%88%90) + - [勇敢搜索](#%E5%8B%87%E6%95%A2%E6%90%9C%E7%B4%A2) + - [浏览器基础](#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9F%BA%E7%A1%80) - [SDK 参考](#sdk-%E5%8F%82%E8%80%83) -- [API 参考](#api-%E5%8F%82%E8%80%83) -- [示例和教程](#%E7%A4%BA%E4%BE%8B%E5%92%8C%E6%95%99%E7%A8%8B) -- [贡献](#%E8%B4%A1%E7%8C%AE) -- [支持和社区](#%E6%94%AF%E6%8C%81%E5%92%8C%E7%A4%BE%E5%8C%BA) -- [许可证](#%E8%AE%B8%E5%8F%AF%E8%AF%81) -- [致谢](#%E8%87%B4%E8%B0%A2)
-## 简介 - -Julep 是一个开源平台,用于创建具有可定制工作流的持久 AI 代理。它提供了开发、管理和部署 AI 驱动应用程序的工具,注重灵活性和易用性。 - -使用 Julep,您可以: -- 快速开发能够在多次交互中保持上下文和状态的 AI 代理 -- 设计和执行针对您的 AI 代理定制的复杂工作流 -- 无缝集成各种工具和 API 到您的 AI 工作流中 -- 轻松管理持久会话和用户交互 +## 介绍 + +Julep 是一个用于创建 AI 代理的平台,这些代理可以记住过去的互动并执行复杂的任务。它提供长期记忆并管理多步骤流程。 + +Julep 支持创建多步骤任务,包括决策、循环、并行处理以及与众多外部工具和 API 的集成。 + +虽然许多人工智能应用程序仅限于简单、线性的提示链和 API 调用,并且分支很少,但 Julep 可以处理更复杂的场景。 + +它支持: +- 复杂、多步骤的流程 +- 动态决策 +- 并行执行 + +> [!提示] +> 想象一下,您想要构建一个 AI 代理,它不仅可以回答简单的问题,还可以处理复杂的任务,记住过去的交互,甚至可能使用其他工具或 API。这就是 Julep 的作用所在。 + +快速示例 + +想象一下一个可以执行以下操作的研究 AI 代理: +1. 选择一个主题, +2. 针对该主题提出 100 个搜索查询, +3. 同时进行网页搜索, +4. 总结结果, +5. 将摘要发送至 Discord + +在 Julep 中,这将是一个单一的任务80行代码然后运行完全托管一切都是独立的。所有步骤都在 Julep 自己的服务器上执行,您无需动手。这是一个工作示例: + +```yaml +name: Research Agent + +# Optional: Define the input schema for the task +input_schema: + type: object + properties: + topic: + type: string + description: The main topic to research + +# Define the tools that the agent can use +tools: +- name: web_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +- name: discord_webhook + type: api_call + api_call: + url: "YOUR_DISCORD_WEBHOOK_URL" + method: POST + headers: + Content-Type: application/json + +# Special variables: +# - inputs: for accessing the input to the task +# - outputs: for accessing the output of previous steps +# - _: for accessing the output of the previous step + +# Define the main workflow +main: +- prompt: + - role: system + content: >- + You are a research assistant. + Generate 100 diverse search queries related to the topic: + {{inputs[0].topic}} + + Write one query per line. + unwrap: true + +# Evaluate the search queries using a simple python expression +- evaluate: + search_queries: "_.split('\n')" + +# Run the web search in parallel for each query +- over: "_.search_queries" + map: + tool: web_search + arguments: + query: "_" + parallelism: 100 + +# Collect the results from the web search +- evaluate: + results: "'\n'.join([item.result for item in _])" + +# Summarize the results +- prompt: + - role: system + content: > + You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. + The summary should be well-structured, informative, and highlight key findings and insights: + {{_.results}} + unwrap: true + +# Send the summary to Discord +- tool: discord_webhook + arguments: + content: > + **Research Summary for {{inputs[0].topic}}** + + {{_}} +``` -无论您是在开发聊天机器人、自动化任务,还是构建复杂的 AI 助手,Julep 都能为您提供所需的灵活性和功能,帮助您快速高效地将想法转化为现实。 +> [!提示] +> 当您想要构建能够在长期交互​​中保持上下文和状态的 AI 代理时,Julep 非常有用。它非常适合设计复杂的多步骤工作流程,并将各种工具和 API 直接集成到代理的流程中。 +> +> 在此示例中,Julep 将自动管理并行执行,重试失败的步骤,重新发送 API 请求,并保持任务可靠运行直至完成。 - +主要特点 -
-这里有一个简单的 Python 示例: +1. 🧠 **持久 AI 代理**:在长期交互​​中记住背景和信息。 +2. 💾 **状态会话**:跟踪过去的互动以获得个性化回应。 +3. 🔄 **多步骤任务**:使用循环和决策构建复杂的多步骤流程。 +4. ⏳ **任务管理**:处理可以无限期运行的长时间运行的任务。 +5.🛠️**内置工具**:在您的任务中使用内置工具和外部 API。 +6. 🔧 **自我修复**:Julep 将自动重试失败的步骤、重新发送消息,并确保您的任务顺利运行。 +7. 📚 **RAG**:使用 Julep 的文档存储构建一个用于检索和使用您自己的数据的系统。 - +Julep 非常适合需要超越简单的提示响应模型的 AI 用例的应用程序。 -

-from julep import Julep, AsyncJulep
+## 为什么选择 Julep 而不是 LangChain?
 
-# 🔑 初始化 Julep 客户端
-#     或者使用 AsyncJulep 进行异步操作
-client = Julep(api_key="your_api_key")
+### 不同的用例
 
-##################
-## 🤖 代理 🤖 ##
-##################
+可以将 LangChain 和 Julep 视为 AI 开发堆栈中具有不同重点的工具。
 
-# 创建一个研究代理
-agent = client.agents.create(
-    name="研究代理",
-    model="claude-3.5-sonnet",
-    about="您是一个设计用于处理研究查询的研究代理。",
-)
-
-# 🔍 为代理添加工具
-client.agents.tools.create(
-    agent_id=agent.id,
-    name="web_search",  # 应该是有效的 Python 变量名
-    description="使用此工具进行研究查询。",
-    integration={
-        "provider": "brave",
-        "method": "search",
-        "setup": {
-            "api_key": "your_brave_api_key",
-        },
-    },
-)
+LangChain 非常适合创建提示序列和管理与 AI 模型的交互。它拥有庞大的生态系统,包含大量预构建的集成,如果您想快速启动和运行某些功能,这会非常方便。LangChain 非常适合涉及线性提示链和 API 调用的简单用例。
 
-#################
-## 💬 聊天 💬 ##
-#################
+另一方面,Julep 更注重构建持久的 AI 代理,这些代理可以在长期交互​​中记住事物。当您需要涉及多个步骤、决策以及在代理流程中直接与各种工具或 API 集成的复杂任务时,它会大放异彩。它从头开始设计,以管理持久会话和复杂任务。
 
-# 与代理开始交互式聊天会话
-session = client.sessions.create(
-    agent_id=agent.id,
-    context_overflow="adaptive",  # 🧠 Julep 将在需要时动态计算上下文窗口
-)
+如果您想构建一个需要执行以下操作的复杂 AI 助手,请使用 Julep:
 
-# 🔄 聊天循环
-while (user_input := input("您:")) != "退出":
-    response = client.sessions.chat(
-        session_id=session.id,
-        message=user_input,
-    )
+- 跟踪几天或几周内的用户互动。
+- 执行计划任务,例如发送每日摘要或监控数据源。
+- 根据之前的互动或存储的数据做出决策。
+- 作为其任务的一部分,与多个外部服务进行交互。
 
-    print("代理:", response.choices[0].message.content)
+然后 Julep 提供支持所有这些的基础设施,而无需您从头开始构建。
 
+### 不同的外形尺寸
 
-#################
-## 📋 任务 📋 ##
-#################
+Julep 是一个**平台**,其中包括用于描述任务的语言、用于运行这些任务的服务器以及用于与平台交互的 SDK。要使用 Julep 构建某些东西,您需要在“YAML”中编写任务描述,然后在云中运行该任务。
 
-# 为代理创建一个周期性研究任务
-task = client.tasks.create(
-    agent_id=agent.id,
-    name="研究任务",
-    description="每24小时研究给定的主题。",
-    #
-    # 🛠️ 任务特定工具
-    tools=[
-        {
-            "name": "send_email",
-            "description": "向用户发送包含结果的电子邮件。",
-            "api_call": {
-                "method": "post",
-                "url": "https://api.sendgrid.com/v3/mail/send",
-                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
-            },
-        }
-    ],
-    #
-    # 🔢 任务主要步骤
-    main=[
-        #
-        # 步骤 1:研究主题
-        {
-            # `_`(下划线)变量指向上一步的输出
-            # 这里,它指向用户输入的主题
-            "prompt": "查找主题 '{{_.topic}}' 并总结结果。",
-            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 使用代理的网络搜索工具
-            "unwrap": True,
-        },
-        #
-        # 步骤 2:发送包含研究结果的电子邮件
-        {
-            "tool": "send_email",
-            "arguments": {
-                "subject": "研究结果",
-                "body": "'以下是今天的研究结果:' + _.content",
-                "to": "inputs[0].email",  # 引用用户输入的电子邮件
-            },
-        },
-        #
-        # 步骤 3:等待 24 小时后重复
-        {"sleep": "24 * 60 * 60"},
-    ],
-)
+Julep 专为繁重、多步骤和长时间运行的任务而设计,并且对任务的复杂程度没有限制。
 
-# 🚀 启动周期性任务
-client.executions.create(task_id=task.id, input={"topic": "Python"})
+LangChain 是一个**库**,其中包含一些工具和一个用于构建线性提示和工具链的框架。要使用 LangChain 构建某些东西,您通常需要编写 Python 代码来配置和运行要使用的模型链。
 
-# 🔁 这将每 24 小时运行一次任务,
-#    研究 "Python" 主题,并
-#    将结果发送到用户的电子邮件
-
-
+对于涉及线性提示和 API 调用链的简单用例,LangChain 可能足够并且能够更快地实现。 -## 特性 +### 总之 -Julep 简化了构建具有可定制工作流的持久 AI 代理的过程。主要特性包括: +当您需要在无状态或短期环境中管理 AI 模型交互和提示序列时,请使用 LangChain。 -- **持久 AI 代理**:创建和管理能够在多次交互中保持上下文的 AI 代理。 -- **可定制工作流**:使用任务(Tasks)设计复杂的多步骤 AI 工作流。 -- **工具集成**:无缝集成各种工具和 API 到您的 AI 工作流中。 -- **文档管理**:高效管理和搜索代理的文档。 -- **会话管理**:处理持久会话以实现连续交互。 -- **灵活执行**:支持工作流中的并行处理、条件逻辑和错误处理。 +当您需要一个具有高级任务功能、持久会话和复杂任务管理的状态代理的强大框架时,请选择 Julep。 -## 安装 +## 安装 -要开始使用 Julep,请使用 [npm](https://www.npmjs.com/package/@julep/sdk) 或 [pip](https://pypi.org/project/julep/) 安装: +要开始使用 Julep,请使用 [npm](https://www.npmjs.com/package/@julep/sdk) 或 [pip](https://pypi.org/project/julep/) 安装它: ```bash npm install @julep/sdk ``` -或 +或者 ```bash pip install julep ``` -> [!TIP] -> 在测试阶段,您可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 获取 API 密钥。 - -## 快速入门指南 +> [!注意] +> 从[此处](https://dashboard-dev.julep.ai)获取您的 API 密钥。 +> +> 虽然我们处于测试阶段,但您也可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 联系,以解除 API 密钥的速率限制。 -### 步骤 1:导入 Julep +> [!提示] +> 💻 你是“向我展示代码!”的那种人吗?我们创建了大量的烹饪书供您入门。**查看 [烹饪书](https://github.com/julep-ai/julep/tree/dev/cookbooks)** 以浏览示例。 +> +> 💡 您还可以在 Julep 的基础上构建许多想法。**查看[想法列表](https://github.com/julep-ai/julep/tree/dev/cookbooks/IDEAS.md)** 以获取一些灵感。 -首先,将 Julep SDK 导入到您的项目中: +## Python 快速入门🐍 -```javascript -const Julep = require('@julep/sdk'); -``` - -或 +### 步骤 1:创建代理 ```python -from julep import AsyncJulep -``` +import yaml +from julep import Julep # or AsyncJulep -### 步骤 2:初始化代理 +client = Julep(api_key="your_julep_api_key") -使用基本设置创建一个新代理: - -```javascript -const julep = new Julep({ apiKey: 'your-api-key' }); +agent = client.agents.create( + name="Storytelling Agent", + model="gpt-4o", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +) -const agent = await julep.agents.create({ - name: '研究助手', - model: 'gpt-4-turbo', - about: "您是一个创意讲故事代理,能够根据想法创作引人入胜的故事并生成漫画面板。", -}); +# 🛠️ Add an image generation tool (DALL·E) to the agent +client.agents.tools.create( + agent_id=agent.id, + name="image_generator", + description="Use this tool to generate images based on descriptions.", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_openai_api_key", + }, + }, +) ``` -或 +### 步骤 2:创建一个生成故事和漫画的任务 + +让我们定义一个多步骤任务来创建一个故事并根据输入的想法生成面板漫画: ```python -client = AsyncJulep(api_key="your_api_key") +# 📋 Task +# Create a task that takes an idea and creates a story and a 4-panel comic strip +task_yaml = """ +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].strip() + panels: re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: "[output.image.url for output in outputs[2]]" +""" -agent = await client.agents.create( - name="讲故事代理", - model="gpt-4-turbo", - about="您是一个创意讲故事代理,能够根据想法创作引人入胜的故事并生成漫画面板。", +task = client.tasks.create( + agent_id=agent.id, + **yaml.safe_load(task_yaml) ) ``` -### 步骤 3:与代理聊天 - -与代理开始交互式聊天会话: +### 步骤 3:执行任务 -```javascript -const session = await julep.sessions.create({ - agentId: agent.id, -}); +```python +# 🚀 Execute the task with an input idea +execution = client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} +) -// 向代理发送消息 -const response = await julep.sessions.chat({ - sessionId: session.id, - message: '你好,能给我讲个故事吗?', -}); +# 🎉 Watch as the story and comic panels are generated +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) -console.log(response); +# 📦 Once the execution is finished, retrieve the results +result = client.executions.get(execution_id=execution.id) ``` -或 +### 步骤 4:与代理聊天 + +开始与代理进行交互式聊天会话: ```python -session = await client.sessions.create(agent_id=agent.id) +session = client.sessions.create(agent_id=agent.id) -# 向代理发送消息 -response = await client.sessions.chat( - session_id=session.id, - message="你好,能给我讲个故事吗?", -) +# 💬 Send messages to the agent +while (message := input("Enter a message: ")) != "quit": + response = client.sessions.chat( + session_id=session.id, + message=message, + ) -print(response) + print(response) ``` -### 步骤 4:创建多步骤任务 +> [!提示] +> 您可以在[这里](example.py)找到完整的 python 示例。 -让我们定义一个多步骤任务,根据输入的想法创建故事并生成分镜漫画: -```python -# 🛠️ 为代理添加图像生成工具(DALL·E) -await client.agents.tools.create( - agent_id=agent.id, - name="image_generator", - description="使用此工具根据描述生成图像。", - integration={ - "provider": "dalle", - "method": "generate_image", - "setup": { - "api_key": "your_dalle_api_key", - }, +## Node.js 快速入门 🟩 + +### 步骤 1:创建代理 + +```javascript +import { Julep } from '@julep/sdk'; +import yaml from 'js-yaml'; + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +async function createAgent() { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", + }); + + // 🛠️ Add an image generation tool (DALL·E) to the agent + await client.agents.tools.create(agent.id, { + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", + integration: { + provider: "dalle", + method: "generate_image", + setup: { + api_key: "your_openai_api_key", + }, }, -) + }); -# 📋 任务 -# 创建一个任务,接受一个想法并创建故事和 4 格漫画 -task = await client.tasks.create( - agent_id=agent.id, - name="故事和漫画创作器", - description="根据一个想法创作故事并生成 4 格漫画来说明故事。", - main=[ - # 步骤 1:生成故事并将其概括为 4 个面板 - { - "prompt": [ - { - "role": "system", - "content": "您是 {{agent.name}}。{{agent.about}}" - }, - { - "role": "user", - "content": ( - "基于想法 '{{_.idea}}',写一个适合 4 格漫画的短故事。" - "提供故事和一个编号列表,包含 4 个简短描述,每个描述对应一个面板,说明故事中的关键时刻。" - ), - }, - ], - "unwrap": True, - }, - # 步骤 2:提取面板描述和故事 - { - "evaluate": { - "story": "_.split('1. ')[0].strip()", - "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", - } - }, - # 步骤 3:使用图像生成器工具为每个面板生成图像 - { - "foreach": { - "in": "_.panels", - "do": { - "tool": "image_generator", - "arguments": { - "description": "_", - }, - }, - }, - }, - # 步骤 4:为故事生成一个吸引人的标题 - { - "prompt": [ - { - "role": "system", - "content": "您是 {{agent.name}}。{{agent.about}}" - }, - { - "role": "user", - "content": "根据以下故事,生成一个吸引人的标题。\n\n故事:{{outputs[1].story}}", - }, - ], - "unwrap": True, - }, - # 步骤 5:返回故事、生成的图像和标题 - { - "return": { - "title": "outputs[3]", - "story": "outputs[1].story", - "comic_panels": "[output.image.url for output in outputs[2]]", - } - }, - ], -) + return agent; +} ``` -> [!TIP] -> Node.js 版本的代码类似。 +### 步骤 2:创建一个生成故事和漫画的任务 -### 步骤 5:执行任务 +```javascript +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent) { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} +``` -```python -# 🚀 执行任务,输入一个想法 -execution = await client.executions.create( - task_id=task.id, - input={"idea": "一只学会飞翔的猫"} -) +### 步骤 3:执行任务 -# 🎉 观看故事和漫画面板的生成过程 -await client.executions.stream(execution_id=execution.id) +```javascript +async function executeTask(task) { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } + }); + + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } + + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} ``` -这个例子展示了如何创建一个带有自定义工具的代理,定义一个复杂的多步骤任务,并执行它以生成创意输出。 +### 步骤 4:与代理聊天 - +```javascript +async function chatWithAgent(agent) { + const session = await client.sessions.create({ agent_id: agent.id }); + + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} + +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); +} + +runExample().catch(console.error); +``` -> [!TIP] -> 您可以在[这里](example.ts)找到另一个 Node.js 示例,或在[这里](example.py)找到 Python 示例。 +> [!提示] +> 您可以在[这里](example.js)找到完整的 Node.js 示例。 -## 概念 +## 成分 -Julep 建立在几个关键的技术组件之上,这些组件协同工作以创建强大的 AI 工作流: +Julep 由以下成分组成: -### 代理 -由大型语言模型(LLM)支持的 AI 实体,执行任务并与用户交互。代理是 Julep 的核心功能单元。 +- **Julep 平台**:Julep 平台是运行您的工作流程的云服务。它包括用于描述工作流程的语言、用于运行这些工作流程的服务器以及用于与平台交互的 SDK。 +- **Julep SDKs**:Julep SDKs 是一组用于构建工作流的库。目前有适用于 Python 和 JavaScript 的 SDKs,还有更多 SDKs 正在开发中。 +- **Julep API**:Julep API 是一个 RESTful API,您可以使用它与 Julep 平台进行交互。 -```mermaid -graph TD - Agent[代理] --> LLM[大型语言模型] - Agent --> Tasks[任务] - Agent --> Users[用户] - Tasks --> Tools[工具] -``` +### 心智模型 -### 用户 -与代理交互的实体。用户可以与会话关联,并拥有自己的元数据,允许个性化交互。 +
+ +
-```mermaid -graph LR - User[用户] --> Sessions[会话] - Sessions --> Agents[代理] - Sessions --> Metadata[元数据] -``` +您可以将 Julep 视为一个结合了客户端和服务器端组件的平台,以帮助您构建高级 AI 代理。以下是它的可视化方法: -### 会话 -代理和用户之间的有状态交互。会话在多次交换中保持上下文,可以配置不同的行为,包括上下文管理和溢出处理。 +1. **您的申请代码:** +- 您可以在应用程序中使用 Julep SDK 来定义代理、任务和工作流。 +- SDK 提供的函数和类使得设置和管理这些组件变得容易。 -```mermaid -graph LR - Sessions[会话] --> Agents[代理] - Sessions --> Users[用户] - Sessions --> ContextManagement[上下文管理] - Sessions --> OverflowHandling[溢出处理] -``` +2. **Julep 后端服务:** +- SDK 通过网络与 Julep 后端通信。 +- 后端处理任务的执行,维护会话状态,存储文档并协调工作流程。 -### 任务 -代理可以执行的多步骤、程序化工作流。任务定义复杂操作,可以包括各种类型的步骤,如提示、工具调用和条件逻辑。 +3. **与工具和 API 集成:** +- 在您的工作流程中,您可以集成外部工具和服务。 +- 后端促进这些集成,因此您的代理可以执行网络搜索、访问数据库或调用第三方 API。 + +简单来说: +- Julep 是一个用于构建有状态 AI 代理的平台。 +- 您在代码中使用 SDK(类似工具包)来定义代理的功能。 +- 后端服务(您可以将其视为引擎)运行这些定义、管理状态并处理复杂性。 + +## 概念 + +Julep 基于几个关键技术组件构建,这些组件共同协作以创建强大的 AI 工作流程: ```mermaid graph TD - Tasks[任务] --> Steps[工作流步骤] - Steps --> Prompt[提示] - Steps --> ToolCalls[工具调用] - Steps --> ConditionalLogic[条件逻辑] + User[User] ==> Session[Session] + Session --> Agent[Agent] + Agent --> Tasks[Tasks] + Agent --> LLM[Large Language Model] + Tasks --> Tools[Tools] + Agent --> Documents[Documents] + Documents --> VectorDB[Vector Database] + Tasks --> Executions[Executions] + + classDef client fill:#9ff,stroke:#333,stroke-width:1px; + class User client; + + classDef core fill:#f9f,stroke:#333,stroke-width:2px; + class Agent,Tasks,Session core; ``` -### 工具 -扩展代理能力的集成。工具可以是用户定义的函数、系统工具或第三方 API 集成。它们允许代理执行超出文本生成的操作。 +- **代理**:由大型语言模型(LLM)支持的人工智能实体,可执行任务并与用户交互。 +- **用户**:通过会话与代理交互的实体。 +- **会话**:代理和用户之间的状态交互,在多个交换之间维护上下文。 +- **任务**:代理可以执行的多步骤、程序化工作流,包括提示、工具调用和条件逻辑等各种类型的步骤。 +- **工具**:扩展代理功能的集成,包括用户定义的函数、系统工具或第三方 API 集成。 +- **文档**:与代理或用户相关的文本或数据对象,矢量化并存储以用于语义搜索和检索。 +- **执行**:通过特定输入启动的任务实例,具有自己的生命周期和状态机。 -```mermaid -graph LR - Tools[工具] --> UserDefinedFunctions[用户定义函数] - Tools --> SystemTools[系统工具] - Tools --> ThirdPartyAPIs[第三方 API] -``` +有关这些概念及其相互作用的更详细说明,请参阅我们的[概念文档](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)。 -### 文档 -可以与代理或用户关联的文本或数据对象。文档被向量化并存储在向量数据库中,在代理交互期间实现语义搜索和检索。 +## 理解任务 -```mermaid -graph LR - Documents[文档] --> VectorDatabase[向量数据库] - Documents --> SemanticSearch[语义搜索] - Documents --> AgentsOrUsers[代理或用户] -``` +任务是 Julep 工作流系统的核心。它们允许您定义代理可以执行的复杂、多步骤 AI 工作流。以下是任务组件的简要概述: -### 执行 -已经用特定输入启动的任务实例。执行有自己的生命周期和状态机,允许监控、管理和恢复长时间运行的进程。 +- **名称和描述**:每个任务都有唯一的名称和描述,以便于识别。 +- **主要步骤**:任务的核心,定义要执行的操作顺序。 +- **工具**:可选集成,可在任务执行期间扩展代理的功能。 -```mermaid -graph LR - Executions[执行] --> Tasks[任务] - Executions --> Lifecycle[生命周期] - Executions --> Monitoring[监控] - Executions --> Management[管理] - Executions --> Resumption[恢复] -``` +### 工作流步骤的类型 -有关这些概念及其交互的更详细解释,请参阅我们的[概念文档](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)。 +Julep 中的任务可以包含各种类型的步骤,让您可以创建复杂而强大的工作流程。以下是按类别组织的可用步骤类型的概述: -## 理解任务 +#### 常见步骤 -任务是 Julep 工作流系统的核心。它们允许您定义复杂的多步骤 AI 工作流,供您的代理执行。以下是任务组件的简要概述: +1. **提示**:向AI模型发送消息并收到回复。 + ```yaml + - prompt: "Analyze the following data: {{data}}" + ``` -- **名称和描述**:每个任务都有唯一的名称和描述,便于识别。 -- **主要步骤**:任务的核心,定义了要执行的操作序列。 -- **工具**:可选的集成,在任务执行期间扩展代理的能力。 +2. **工具调用**:执行集成的工具或API。 + ```yaml + - tool: web_search + arguments: + query: "Latest AI developments" + ``` -### 工作流步骤类型 +3. **评估**:执行计算或处理数据。 + ```yaml + - evaluate: + average_score: "sum(scores) / len(scores)" + ``` -Julep 中的任务可以包含各种类型的步骤: +4. **等待输入**:暂停工作流程,直到收到输入。 + ```yaml + - wait_for_input: + info: + message: "Please provide additional information." + ``` -1. **提示**:向 AI 模型发送消息并接收响应。 - ```python - {"prompt": "分析以下数据:{{data}}"} +5. **日志**:记录指定的值或消息。 + ```yaml + - log: "Processing completed for item {{item_id}}" ``` -2. **工具调用**:执行集成的工具或 API。 - ```python - {"tool": "web_search", "arguments": {"query": "最新 AI 发展"}} +#### 键值步骤 + +6. **获取**:从键值存储中检索值。 + ```yaml + - get: "user_preference" ``` -3. **评估**:执行计算或操作数据。 - ```python - {"evaluate": {"average_score": "sum(scores) / len(scores)"}} +7. **设置**:为键值存储中的键分配一个值。 + ```yaml + - set: + user_preference: "dark_mode" ``` -4. **条件逻辑**:基于条件执行步骤。 - ```python - {"if": "score > 0.8", "then": [...], "else": [...]} +#### 迭代步骤 + +8. **Foreach**:遍历集合并对每个项目执行步骤。 + ```yaml + - foreach: + in: "data_list" + do: + - log: "Processing item {{_}}" ``` -5. **循环**:遍历数据或重复步骤。 - ```python - {"foreach": {"in": "data_list", "do": [...]}} +9. **Map-Reduce**:对集合进行映射并减少结果。 + ```yaml + - map_reduce: + over: "numbers" + map: + - evaluate: + squared: "_ ** 2" + reduce: "sum(results)" ``` -| 步骤类型 | 描述 | 输入 | -|---------|------|------| -| **提示** | 向 AI 模型发送消息并接收响应。 | 提示文本或模板 | -| **工具调用** | 执行集成的工具或 API。 | 工具名称和参数 | -| **评估** | 执行计算或操作数据。 | 要评估的表达式或变量 | -| **等待输入** | 暂停工作流直到收到输入。 | 任何所需的用户或系统输入 | -| **日志** | 记录指定的值或消息。 | 要记录的消息或值 | -| **嵌入** | 将文本嵌入到特定格式或系统中。 | 要嵌入的文本或内容 | -| **搜索** | 基于查询执行文档搜索。 | 搜索查询 | -| **获取** | 从键值存储中检索值。 | 键标识符 | -| **设置** | 在键值存储中为键分配值。 | 要分配的键和值 | -| **并行** | 并行运行多个步骤。 | 要同时执行的步骤列表 | -| **遍历** | 遍历集合并为每个项目执行步骤。 | 要遍历的集合或列表 | -| **映射归约** | 对集合进行映射并基于表达式归约结果。 | 要映射和归约的集合和表达式 | -| **如果-否则** | 基于条件执行步骤。 | 要评估的条件 | -| **开关** | 基于多个条件执行步骤,类似于 switch-case 语句。 | 多个条件和相应的步骤 | -| **生成** | 运行子工作流并等待其完成。 | 子工作流标识符和输入数据 | -| **错误** | 通过指定错误消息来处理错误。 | 错误消息或处理指令 | -| **睡眠** | 暂停工作流指定的持续时间。 | 持续时间(秒、分钟等) | -| **返回** | 从工作流返回值。 | 要返回的值 | - -有关每种步骤类型的详细信息和高级用法,请参阅我们的[任务文档](https://docs.julep.ai/tasks)。 +10.**并行**:并行运行多个步骤。 + ```yaml + - parallel: + - tool: web_search + arguments: + query: "AI news" + - tool: weather_check + arguments: + location: "New York" + ``` + +#### 条件步骤 + +11. **If-Else**:条件执行步骤。 + ```yaml + - if: "score > 0.8" + then: + - log: "High score achieved" + else: + - log: "Score needs improvement" + ``` + +12.**Switch**:根据多种条件执行步骤。 + ```yaml + - switch: + - case: "category == 'A'" + then: + - log: "Category A processing" + - case: "category == 'B'" + then: + - log: "Category B processing" + - case: "_" # Default case + then: + - log: "Unknown category" + ``` + +#### 其他控制流 + +13. **睡眠**:暂停工作流一段指定的时间。 + ```yaml + - sleep: + seconds: 30 + ``` + +14. **返回**:从工作流返回一个值。 + ```yaml + - return: + result: "Task completed successfully" + ``` + +15. **收益**:运行子工作流并等待其完成。 + ```yaml + - yield: + workflow: "data_processing_subflow" + arguments: + input_data: "{{raw_data}}" + ``` + +16.**错误**:通过指定错误消息来处理错误。 + ```yaml + - error: "Invalid input provided" + ``` + +每种步骤类型在构建复杂的 AI 工作流中都有特定的用途。此分类有助于理解 Julep 任务中可用的各种控制流程和操作。 ## 高级功能 -Julep 提供了一系列高级功能来增强您的 AI 工作流: +Julep 提供一系列高级功能来增强您的 AI 工作流程: -### 为代理添加工具 +### 向代理添加工具 -通过集成外部工具和 API 来扩展代理的能力: +通过集成外部工具和 API 来扩展代理的功能: ```python client.agents.tools.create( agent_id=agent.id, name="web_search", - description="搜索网络以获取信息。", + description="Search the web for information.", integration={ "provider": "brave", "method": "search", @@ -610,82 +794,144 @@ Julep 为持久交互提供了强大的会话管理: ```python session = client.sessions.create( agent_id=agent.id, - user_id="user123", + user_id=user.id, context_overflow="adaptive" ) -# 在同一会话中继续对话 +# Continue conversation in the same session response = client.sessions.chat( session_id=session.id, messages=[ - { - "role": "user", - "content": "继续我们之前的对话。" - } + { + "role": "user", + "content": "Follow up on the previous conversation." + } ] ) ``` -### 文档集成和搜索 +### 文档集成与搜索 轻松管理和搜索代理的文档: ```python -# 上传文档 +# Upload a document document = client.agents.docs.create( title="AI advancements", content="AI is changing the world...", metadata={"category": "research_paper"} ) -# 搜索文档 +# Search documents results = client.agents.docs.search( text="AI advancements", metadata_filter={"category": "research_paper"} ) ``` -有关更多高级功能和详细用法,请参阅我们的[高级功能文档](https://docs.julep.ai/advanced-features)。 +有关更多高级功能和详细用法,请参阅我们的[高级功能文档](https://docs.julep.ai/advanced-features)。 -## SDK 参考 +## 集成 -- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) -- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) +Julep 支持各种集成,可以扩展您的 AI 代理的功能。以下是可用集成及其支持的参数的列表: -## API 参考 +### 勇敢搜索 -探索我们全面的 API 文档,了解更多关于代理、任务和执行的信息: +```yaml +setup: + api_key: string # The API key for Brave Search -- [代理 API](https://api.julep.ai/api/docs#tag/agents) -- [任务 API](https://api.julep.ai/api/docs#tag/tasks) -- [执行 API](https://api.julep.ai/api/docs#tag/executions) +arguments: + query: string # The search query for searching with Brave + +output: + result: string # The result of the Brave Search +``` + +### 浏览器基础 + +```yaml +setup: + api_key: string # The API key for BrowserBase + project_id: string # The project ID for BrowserBase + session_id: string # (Optional) The session ID for BrowserBase + +arguments: + urls: list[string] # The URLs for loading with BrowserBase -## 示例和教程 +output: + documents: list # The documents loaded from the URLs +``` + +### 电子邮件 + +```yaml +setup: + host: string # The host of the email server + port: integer # The port of the email server + user: string # The username of the email server + password: string # The password of the email server + +arguments: + to: string # The email address to send the email to + from: string # The email address to send the email from + subject: string # The subject of the email + body: string # The body of the email + +output: + success: boolean # Whether the email was sent successfully +``` + +### 蜘蛛 + +```yaml +setup: + spider_api_key: string # The API key for Spider + +arguments: + url: string # The URL for which to fetch data + mode: string # The type of crawlers (default: "scrape") + params: dict # (Optional) The parameters for the Spider API -发现示例项目和教程,帮助您入门并基于提供的示例进行构建: +output: + documents: list # The documents returned from the spider +``` -- [示例项目](https://github.com/julep-ai/julep/tree/main/examples) -- [教程](https://docs.julep.ai/tutorials) +### 天气 -## 贡献 +```yaml +setup: + openweathermap_api_key: string # The API key for OpenWeatherMap -我们欢迎对项目的贡献!了解如何贡献以及我们的行为准则: +arguments: + location: string # The location for which to fetch weather data -- [贡献指南](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) -- [行为准则](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) +output: + result: string # The weather data for the specified location +``` -## 支持和社区 +维基百科 -加入我们的社区,获取帮助、提问和分享您的想法: +```yaml +arguments: + query: string # The search query string + load_max_docs: integer # Maximum number of documents to load (default: 2) -- [Discord](https://discord.com/invite/JTSBGRZrzj) -- [GitHub 讨论](https://github.com/julep-ai/julep/discussions) -- [Twitter](https://twitter.com/julep_ai) +output: + documents: list # The documents returned from the Wikipedia search +``` -## 许可证 +这些集成可用于您的任务中,以扩展您的 AI 代理的功能。有关如何在您的工作流程中使用这些集成的详细信息,请参阅我们的 [集成文档](https://docs.julep.ai/integrations)。 + +## SDK 参考 -本项目采用 [Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE) 许可。 +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) -## 致谢 +API 参考 -我们要感谢所有贡献者和开源社区为他们宝贵的资源和贡献。 +浏览我们全面的 API 文档,以了解有关代理、任务和执行的更多信息: + +- [代理 API](https://api.julep.ai/api/docs#tag/agents) +- [任务 API](https://api.julep.ai/api/docs#tag/tasks) +- [执行 API](https://api.julep.ai/api/docs#tag/executions) diff --git a/README-FR.md b/README-FR.md new file mode 100644 index 000000000..b2dbc511d --- /dev/null +++ b/README-FR.md @@ -0,0 +1,948 @@ +English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) + +
+ julep +
+ +

+
+ Explorer les documents + · + Discorde + · + 𝕏 + · + LinkedIn +

+ + +

+ NPM Version +   + PyPI - Version +   + Docker Image Version +   + GitHub License +

+ +***** + +> [!REMARQUE] +> 👨‍💻 Vous êtes ici pour l'événement devfest.ai ? Rejoignez notre [Discord](https://discord.com/invite/JTSBGRZrzj) et consultez les détails ci-dessous. + +
+🌟 Contributeurs et participants au DevFest.AI(Cliquez pour agrandir) + +## 🌟 Appel aux contributeurs ! + +Nous sommes ravis d'accueillir de nouveaux contributeurs au projet Julep ! Nous avons créé plusieurs « bons premiers numéros » pour vous aider à démarrer. Voici comment vous pouvez contribuer : + +1. Consultez notre fichier [CONTRIBUTING.md](https://github.com/julep-ai/julep/blob/dev/CONTRIBUTING.md) pour obtenir des instructions sur la façon de contribuer. +2. Parcourez nos [bons premiers numéros](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) pour trouver une tâche qui vous intéresse. +3. Si vous avez des questions ou avez besoin d'aide, n'hésitez pas à nous contacter sur notre chaîne [Discord](https://discord.com/invite/JTSBGRZrzj). + +Vos contributions, grandes ou petites, nous sont précieuses. Construisons ensemble quelque chose d'extraordinaire ! 🚀 + +### 🎉 DevFest.AI octobre 2024 + +Des nouvelles passionnantes ! Nous participons au DevFest.AI tout au long du mois d'octobre 2024 ! 🗓️ + +- Contribuez à Julep pendant cet événement et obtenez une chance de gagner de superbes produits et cadeaux Julep ! 🎁 +- Rejoignez des développeurs du monde entier pour contribuer aux référentiels d'IA et participer à des événements incroyables. +- Un grand merci à DevFest.AI pour l'organisation de cette fantastique initiative ! + +> [!TIP] +> Prêt à vous joindre à la fête ? **[Tweetez que vous participez](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** et commençons à coder ! 🖥️ + +> [!REMARQUE] +> Obtenez votre clé API [ici](https://dashboard-dev.julep.ai). +> +> Pendant que nous sommes en version bêta, vous pouvez également nous contacter sur [Discord](https://discord.com/invite/JTSBGRZrzj) pour obtenir la levée des limites de débit sur votre clé API. + +![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) + +
+ + + +
+

📖 Table of Contents

+ +- [Introduction](#introduction) +- [Exemple rapide](#exemple-rapide) +- [Principales caractéristiques](#principales-caract%C3%A9ristiques) +- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain%C2%A0) + - [Différents cas d'utilisation](#diff%C3%A9rents-cas-dutilisation) + - [Facteur de forme différent](#facteur-de-forme-diff%C3%A9rent) + - [En résumé](#en-r%C3%A9sum%C3%A9) +- [Installation](#installation) +- [Démarrage rapide de Python 🐍](#d%C3%A9marrage-rapide-de-python-) + - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent) + - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e) + - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che) + - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent) +- [Démarrage rapide de Node.js 🟩](#d%C3%A9marrage-rapide-de-nodejs-) + - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent-1) + - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e-1) + - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che-1) + - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent-1) +- [Composants](#composants) + - [Modèle mental](#mod%C3%A8le-mental) +- [Concepts](#concepts) +- [Comprendre les tâches](#comprendre-les-t%C3%A2ches) + - [Types d'étapes de flux de travail](#types-d%C3%A9tapes-de-flux-de-travail) +- [Fonctionnalités avancées](#fonctionnalit%C3%A9s-avanc%C3%A9es) + - [Ajout d'outils aux agents](#ajout-doutils-aux-agents) + - [Gestion des sessions et des utilisateurs](#gestion-des-sessions-et-des-utilisateurs) + - [Intégration et recherche de documents](#int%C3%A9gration-et-recherche-de-documents) +- [Intégrations](#int%C3%A9grations) + - [Recherche courageuse](#recherche-courageuse) + - [Base de navigateur](#base-de-navigateur) + - [E-mail](#e-mail) + - [Araignée](#araign%C3%A9e) + - [Météo](#m%C3%A9t%C3%A9o) + - [Wikipédia](#wikip%C3%A9dia) +- [Référence du SDK](#r%C3%A9f%C3%A9rence-du-sdk) +- [Référence API](#r%C3%A9f%C3%A9rence-api) + +
+ + +## Introduction + +Julep est une plateforme permettant de créer des agents IA qui se souviennent des interactions passées et peuvent effectuer des tâches complexes. Elle offre une mémoire à long terme et gère des processus en plusieurs étapes. + +Julep permet la création de tâches en plusieurs étapes intégrant la prise de décision, les boucles, le traitement parallèle et l'intégration avec de nombreux outils et API externes. + +Alors que de nombreuses applications d’IA se limitent à des chaînes simples et linéaires d’invites et d’appels d’API avec une ramification minimale, Julep est conçu pour gérer des scénarios plus complexes. + +Il prend en charge : +- Processus complexes en plusieurs étapes +- Prise de décision dynamique +- Exécution parallèle + +> [!TIP] +> Imaginez que vous souhaitiez créer un agent d'IA capable de faire plus que simplement répondre à des questions simples : il doit gérer des tâches complexes, se souvenir des interactions passées et peut-être même utiliser d'autres outils ou API. C'est là qu'intervient Julep. + +## Exemple rapide + +Imaginez un agent d’IA de recherche capable d’effectuer les opérations suivantes : +1. Prenez un sujet, +2. Proposez 100 requêtes de recherche pour ce sujet, +3. Effectuez ces recherches sur le Web en parallèle, +4. Résumez les résultats, +5. Envoyez le résumé sur Discord + +Dans Julep, ce serait une tâche unique sous80 lignes de codeet courirentièrement gérétout seul. Toutes les étapes sont exécutées sur les propres serveurs de Julep et vous n'avez pas besoin de lever le petit doigt. Voici un exemple fonctionnel : + +```yaml +name: Research Agent + +# Optional: Define the input schema for the task +input_schema: + type: object + properties: + topic: + type: string + description: The main topic to research + +# Define the tools that the agent can use +tools: +- name: web_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +- name: discord_webhook + type: api_call + api_call: + url: "YOUR_DISCORD_WEBHOOK_URL" + method: POST + headers: + Content-Type: application/json + +# Special variables: +# - inputs: for accessing the input to the task +# - outputs: for accessing the output of previous steps +# - _: for accessing the output of the previous step + +# Define the main workflow +main: +- prompt: + - role: system + content: >- + You are a research assistant. + Generate 100 diverse search queries related to the topic: + {{inputs[0].topic}} + + Write one query per line. + unwrap: true + +# Evaluate the search queries using a simple python expression +- evaluate: + search_queries: "_.split('\n')" + +# Run the web search in parallel for each query +- over: "_.search_queries" + map: + tool: web_search + arguments: + query: "_" + parallelism: 100 + +# Collect the results from the web search +- evaluate: + results: "'\n'.join([item.result for item in _])" + +# Summarize the results +- prompt: + - role: system + content: > + You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. + The summary should be well-structured, informative, and highlight key findings and insights: + {{_.results}} + unwrap: true + +# Send the summary to Discord +- tool: discord_webhook + arguments: + content: > + **Research Summary for {{inputs[0].topic}}** + + {{_}} +``` + +> [!TIP] +> Julep est vraiment utile lorsque vous souhaitez créer des agents IA capables de conserver le contexte et l'état lors d'interactions à long terme. Il est idéal pour concevoir des flux de travail complexes en plusieurs étapes et pour intégrer divers outils et API directement dans les processus de votre agent. +> +> Dans cet exemple, Julep gérera automatiquement les exécutions parallèles, réessayera les étapes ayant échoué, renverra les requêtes API et maintiendra les tâches en cours d'exécution de manière fiable jusqu'à leur achèvement. + +## Principales caractéristiques + +1. 🧠 **Agents IA persistants** : mémorisent le contexte et les informations au cours d'interactions à long terme. +2. 💾 **Sessions avec état** : gardez une trace des interactions passées pour des réponses personnalisées. +3. 🔄 **Tâches en plusieurs étapes** : créez des processus complexes en plusieurs étapes avec des boucles et une prise de décision. +4. ⏳ **Gestion des tâches** : gérez les tâches de longue durée qui peuvent s'exécuter indéfiniment. +5. 🛠️ **Outils intégrés** : utilisez des outils intégrés et des API externes dans vos tâches. +6. 🔧 **Auto-réparation** : Julep réessaiera automatiquement les étapes ayant échoué, renverra les messages et assurera généralement le bon déroulement de vos tâches. +7. 📚 **RAG** ​​: Utilisez le magasin de documents de Julep pour créer un système permettant de récupérer et d'utiliser vos propres données. + +Julep est idéal pour les applications qui nécessitent des cas d’utilisation de l’IA au-delà des simples modèles de réponse rapide. + +## Pourquoi Julep vs. LangChain ? + +### Différents cas d'utilisation + +Considérez LangChain et Julep comme des outils avec des objectifs différents au sein de la pile de développement de l’IA. + +LangChain est idéal pour créer des séquences d'invites et gérer les interactions avec les modèles d'IA. Il dispose d'un vaste écosystème avec de nombreuses intégrations prédéfinies, ce qui le rend pratique si vous souhaitez mettre en place quelque chose rapidement. LangChain s'adapte bien aux cas d'utilisation simples qui impliquent une chaîne linéaire d'invites et d'appels d'API. + +Julep, en revanche, s'intéresse davantage à la création d'agents d'IA persistants capables de mémoriser des éléments au cours d'interactions à long terme. Il est particulièrement efficace lorsque vous avez besoin de tâches complexes impliquant plusieurs étapes, une prise de décision et une intégration avec divers outils ou API directement dans le processus de l'agent. Il est conçu dès le départ pour gérer les sessions persistantes et les tâches complexes. + +Utilisez Julep si vous imaginez créer un assistant IA complexe qui doit : + +- Suivez les interactions des utilisateurs sur plusieurs jours ou semaines. +- Exécutez des tâches planifiées, comme l'envoi de résumés quotidiens ou la surveillance de sources de données. +- Prendre des décisions basées sur des interactions antérieures ou des données stockées. +- Interagir avec plusieurs services externes dans le cadre de sa mission. + +Ensuite, Julep fournit l’infrastructure pour prendre en charge tout cela sans que vous ayez à le construire à partir de zéro. + +### Facteur de forme différent + +Julep est une **plateforme** qui comprend un langage pour décrire les tâches, un serveur pour exécuter ces tâches et un SDK pour interagir avec la plateforme. Pour créer quelque chose avec Julep, vous écrivez une description de la tâche en YAML, puis vous exécutez la tâche dans le cloud. + +Julep est conçu pour les tâches lourdes, en plusieurs étapes et de longue durée, et il n'y a aucune limite à la complexité de la tâche. + +LangChain est une **bibliothèque** qui inclut quelques outils et un framework pour créer des chaînes linéaires d'invites et d'outils. Pour créer quelque chose avec LangChain, vous écrivez généralement du code Python qui configure et exécute les chaînes de modèles que vous souhaitez utiliser. + +LangChain pourrait être suffisant et plus rapide à mettre en œuvre pour les cas d'utilisation simples impliquant une chaîne linéaire d'invites et d'appels d'API. + +### En résumé + +Utilisez LangChain lorsque vous devez gérer les interactions des modèles d’IA et les séquences d’invite dans un contexte sans état ou à court terme. + +Choisissez Julep lorsque vous avez besoin d'un framework robuste pour les agents avec état avec des capacités de tâches avancées, des sessions persistantes et une gestion de tâches complexes. + +## Installation + +Pour commencer à utiliser Julep, installez-le en utilisant [npm](https://www.npmjs.com/package/@julep/sdk) ou [pip](https://pypi.org/project/julep/) : + +```bash +npm install @julep/sdk +``` + +ou + +```bash +pip install julep +``` + +> [!REMARQUE] +> Obtenez votre clé API [ici](https://dashboard-dev.julep.ai). +> +> Pendant que nous sommes en version bêta, vous pouvez également nous contacter sur [Discord](https://discord.com/invite/JTSBGRZrzj) pour obtenir la levée des limites de débit sur votre clé API. + +> [!TIP] +> 💻 Êtes-vous du genre à vouloir _montrer le code !™_ ? Nous avons créé une multitude de livres de recettes pour vous aider à démarrer. **Consultez les [livres de recettes](https://github.com/julep-ai/julep/tree/dev/cookbooks)** pour parcourir les exemples. +> +> 💡 Il existe également de nombreuses idées que vous pouvez développer en plus de Julep. **Consultez la [liste d'idées](https://github.com/julep-ai/julep/tree/dev/cookbooks/IDEAS.md)** pour vous inspirer. + +## Démarrage rapide de Python 🐍 + +### Étape 1 : Créer un agent + +```python +import yaml +from julep import Julep # or AsyncJulep + +client = Julep(api_key="your_julep_api_key") + +agent = client.agents.create( + name="Storytelling Agent", + model="gpt-4o", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +) + +# 🛠️ Add an image generation tool (DALL·E) to the agent +client.agents.tools.create( + agent_id=agent.id, + name="image_generator", + description="Use this tool to generate images based on descriptions.", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_openai_api_key", + }, + }, +) +``` + +### Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée + +Définissons une tâche en plusieurs étapes pour créer une histoire et générer une bande dessinée à panneaux basée sur une idée d'entrée : + +```python +# 📋 Task +# Create a task that takes an idea and creates a story and a 4-panel comic strip +task_yaml = """ +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].strip() + panels: re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: "[output.image.url for output in outputs[2]]" +""" + +task = client.tasks.create( + agent_id=agent.id, + **yaml.safe_load(task_yaml) +) +``` + +### Étape 3 : Exécuter la tâche + +```python +# 🚀 Execute the task with an input idea +execution = client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} +) + +# 🎉 Watch as the story and comic panels are generated +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) + +# 📦 Once the execution is finished, retrieve the results +result = client.executions.get(execution_id=execution.id) +``` + +### Étape 4 : Discuter avec l'agent + +Démarrez une session de chat interactive avec l'agent : + +```python +session = client.sessions.create(agent_id=agent.id) + +# 💬 Send messages to the agent +while (message := input("Enter a message: ")) != "quit": + response = client.sessions.chat( + session_id=session.id, + message=message, + ) + + print(response) +``` + +> [!TIP] +> Vous pouvez trouver l'exemple Python complet [ici](example.py). + + +## Démarrage rapide de Node.js 🟩 + +### Étape 1 : Créer un agent + +```javascript +import { Julep } from '@julep/sdk'; +import yaml from 'js-yaml'; + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +async function createAgent() { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", + }); + + // 🛠️ Add an image generation tool (DALL·E) to the agent + await client.agents.tools.create(agent.id, { + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", + integration: { + provider: "dalle", + method: "generate_image", + setup: { + api_key: "your_openai_api_key", + }, + }, + }); + + return agent; +} +``` + +### Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée + +```javascript +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent) { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} +``` + +### Étape 3 : Exécuter la tâche + +```javascript +async function executeTask(task) { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } + }); + + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } + + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} +``` + +### Étape 4 : Discuter avec l'agent + +```javascript +async function chatWithAgent(agent) { + const session = await client.sessions.create({ agent_id: agent.id }); + + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} + +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); +} + +runExample().catch(console.error); +``` + +> [!TIP] +> Vous pouvez trouver l'exemple complet de Node.js [ici](example.js). + +## Composants + +Julep est composé des éléments suivants : + +- **Plateforme Julep** : la plateforme Julep est un service cloud qui exécute vos workflows. Elle comprend un langage pour décrire les workflows, un serveur pour exécuter ces workflows et un SDK pour interagir avec la plateforme. +- **SDK Julep** : les SDK Julep sont un ensemble de bibliothèques permettant de créer des workflows. Il existe des SDK pour Python et JavaScript, et d'autres sont en cours de développement. +- **API Julep** : L'API Julep est une API RESTful que vous pouvez utiliser pour interagir avec la plateforme Julep. + +### Modèle mental + +
+ +
+ +Considérez Julep comme une plateforme qui combine des composants côté client et côté serveur pour vous aider à créer des agents d'IA avancés. Voici comment le visualiser : + +1. **Votre code d'application :** +- Vous utilisez le SDK Julep dans votre application pour définir des agents, des tâches et des workflows. +- Le SDK fournit des fonctions et des classes qui facilitent la configuration et la gestion de ces composants. + +2. **Service back-end Julep :** +- Le SDK communique avec le backend Julep via le réseau. +- Le backend gère l'exécution des tâches, maintient l'état de la session, stocke les documents et orchestre les flux de travail. + +3. **Intégration avec les outils et les API :** +- Au sein de vos workflows, vous pouvez intégrer des outils et services externes. +- Le backend facilite ces intégrations, afin que vos agents puissent, par exemple, effectuer des recherches sur le Web, accéder à des bases de données ou appeler des API tierces. + +En termes plus simples : +- Julep est une plateforme permettant de créer des agents d'IA avec état. +- Vous utilisez le SDK (comme une boîte à outils) dans votre code pour définir ce que font vos agents. +- Le service backend (que vous pouvez considérer comme le moteur) exécute ces définitions, gère l'état et gère la complexité. + +## Concepts + +Julep s'appuie sur plusieurs composants techniques clés qui fonctionnent ensemble pour créer de puissants flux de travail d'IA : + +```mermaid +graph TD + User[User] ==> Session[Session] + Session --> Agent[Agent] + Agent --> Tasks[Tasks] + Agent --> LLM[Large Language Model] + Tasks --> Tools[Tools] + Agent --> Documents[Documents] + Documents --> VectorDB[Vector Database] + Tasks --> Executions[Executions] + + classDef client fill:#9ff,stroke:#333,stroke-width:1px; + class User client; + + classDef core fill:#f9f,stroke:#333,stroke-width:2px; + class Agent,Tasks,Session core; +``` + +- **Agents** : entités alimentées par l'IA et soutenues par de grands modèles linguistiques (LLM) qui exécutent des tâches et interagissent avec les utilisateurs. +- **Utilisateurs** : entités qui interagissent avec les agents via des sessions. +- **Sessions** : interactions avec état entre agents et utilisateurs, maintenant le contexte sur plusieurs échanges. +- **Tâches** : flux de travail programmatiques en plusieurs étapes que les agents peuvent exécuter, y compris différents types d'étapes telles que des invites, des appels d'outils et une logique conditionnelle. +- **Outils** : intégrations qui étendent les capacités d'un agent, y compris les fonctions définies par l'utilisateur, les outils système ou les intégrations d'API tierces. +- **Documents** : Objets textes ou données associés à des agents ou utilisateurs, vectorisés et stockés pour la recherche et la récupération sémantiques. +- **Exécutions** : instances de tâches qui ont été initiées avec des entrées spécifiques, avec leur propre cycle de vie et leur propre machine d'état. + +Pour une explication plus détaillée de ces concepts et de leurs interactions, veuillez vous référer à notre [Documentation sur les concepts](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md). + +## Comprendre les tâches + +Les tâches sont au cœur du système de workflow de Julep. Elles vous permettent de définir des workflows IA complexes en plusieurs étapes que vos agents peuvent exécuter. Voici un bref aperçu des composants des tâches : + +- **Nom et description** : Chaque tâche a un nom et une description uniques pour une identification facile. +- **Étapes principales** : Le cœur d’une tâche, définissant la séquence d’actions à effectuer. +- **Outils** : intégrations facultatives qui étendent les capacités de votre agent pendant l'exécution des tâches. + +### Types d'étapes de flux de travail + +Les tâches dans Julep peuvent inclure différents types d'étapes, ce qui vous permet de créer des flux de travail complexes et puissants. Voici un aperçu des types d'étapes disponibles, organisés par catégorie : + +#### Étapes courantes + +1. **Invite** : envoyez un message au modèle d’IA et recevez une réponse. + ```yaml + - prompt: "Analyze the following data: {{data}}" + ``` + +2. **Appel d'outil** : Exécutez un outil ou une API intégrée. + ```yaml + - tool: web_search + arguments: + query: "Latest AI developments" + ``` + +3. **Évaluer** : Effectuer des calculs ou manipuler des données. + ```yaml + - evaluate: + average_score: "sum(scores) / len(scores)" + ``` + +4. **Attendre l'entrée** : mettre le flux de travail en pause jusqu'à ce que l'entrée soit reçue. + ```yaml + - wait_for_input: + info: + message: "Please provide additional information." + ``` + +5. **Journal** : Enregistrer une valeur ou un message spécifié. + ```yaml + - log: "Processing completed for item {{item_id}}" + ``` + +#### Étapes clé-valeur + +6. **Get** : récupérer une valeur à partir d'un magasin clé-valeur. + ```yaml + - get: "user_preference" + ``` + +7. **Set** : attribuez une valeur à une clé dans un magasin clé-valeur. + ```yaml + - set: + user_preference: "dark_mode" + ``` + +#### Étapes d'itération + +8. **Foreach** : itérer sur une collection et effectuer des étapes pour chaque élément. + ```yaml + - foreach: + in: "data_list" + do: + - log: "Processing item {{_}}" + ``` + +9. **Map-Reduce** : Cartographiez une collection et réduisez les résultats. + ```yaml + - map_reduce: + over: "numbers" + map: + - evaluate: + squared: "_ ** 2" + reduce: "sum(results)" + ``` + +10. **Parallèle** : exécuter plusieurs étapes en parallèle. + ```yaml + - parallel: + - tool: web_search + arguments: + query: "AI news" + - tool: weather_check + arguments: + location: "New York" + ``` + +#### Étapes conditionnelles + +11. **If-Else** : Exécution conditionnelle des étapes. + ```yaml + - if: "score > 0.8" + then: + - log: "High score achieved" + else: + - log: "Score needs improvement" + ``` + +12. **Switch** : exécuter des étapes en fonction de plusieurs conditions. + ```yaml + - switch: + - case: "category == 'A'" + then: + - log: "Category A processing" + - case: "category == 'B'" + then: + - log: "Category B processing" + - case: "_" # Default case + then: + - log: "Unknown category" + ``` + +#### Autre flux de contrôle + +13. **Veille** : met le flux de travail en pause pendant une durée spécifiée. + ```yaml + - sleep: + seconds: 30 + ``` + +14. **Retour** : renvoie une valeur du flux de travail. + ```yaml + - return: + result: "Task completed successfully" + ``` + +15. **Rendement** : Exécutez un sous-flux de travail et attendez sa fin. + ```yaml + - yield: + workflow: "data_processing_subflow" + arguments: + input_data: "{{raw_data}}" + ``` + +16. **Erreur** : gérez les erreurs en spécifiant un message d’erreur. + ```yaml + - error: "Invalid input provided" + ``` + +Chaque type d'étape remplit un objectif spécifique dans la création de workflows d'IA sophistiqués. Cette catégorisation permet de comprendre les différents flux de contrôle et opérations disponibles dans les tâches Julep. + +## Fonctionnalités avancées + +Julep propose une gamme de fonctionnalités avancées pour améliorer vos flux de travail d'IA : + +### Ajout d'outils aux agents + +Étendez les capacités de votre agent en intégrant des outils et des API externes : + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) +``` + +### Gestion des sessions et des utilisateurs + +Julep fournit une gestion de session robuste pour les interactions persistantes : + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id=user.id, + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] +) +``` + +### Intégration et recherche de documents + +Gérez et recherchez facilement des documents pour vos agents : + +```python +# Upload a document +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} +) +``` + +Pour des fonctionnalités plus avancées et une utilisation détaillée, veuillez vous référer à notre [Documentation sur les fonctionnalités avancées](https://docs.julep.ai/advanced-features). + +## Intégrations + +Julep prend en charge diverses intégrations qui étendent les capacités de vos agents IA. Voici une liste des intégrations disponibles et de leurs arguments pris en charge : + +### Recherche courageuse + +```yaml +setup: + api_key: string # The API key for Brave Search + +arguments: + query: string # The search query for searching with Brave + +output: + result: string # The result of the Brave Search +``` + +### Base de navigateur + +```yaml +setup: + api_key: string # The API key for BrowserBase + project_id: string # The project ID for BrowserBase + session_id: string # (Optional) The session ID for BrowserBase + +arguments: + urls: list[string] # The URLs for loading with BrowserBase + +output: + documents: list # The documents loaded from the URLs +``` + +### E-mail + +```yaml +setup: + host: string # The host of the email server + port: integer # The port of the email server + user: string # The username of the email server + password: string # The password of the email server + +arguments: + to: string # The email address to send the email to + from: string # The email address to send the email from + subject: string # The subject of the email + body: string # The body of the email + +output: + success: boolean # Whether the email was sent successfully +``` + +### Araignée + +```yaml +setup: + spider_api_key: string # The API key for Spider + +arguments: + url: string # The URL for which to fetch data + mode: string # The type of crawlers (default: "scrape") + params: dict # (Optional) The parameters for the Spider API + +output: + documents: list # The documents returned from the spider +``` + +### Météo + +```yaml +setup: + openweathermap_api_key: string # The API key for OpenWeatherMap + +arguments: + location: string # The location for which to fetch weather data + +output: + result: string # The weather data for the specified location +``` + +### Wikipédia + +```yaml +arguments: + query: string # The search query string + load_max_docs: integer # Maximum number of documents to load (default: 2) + +output: + documents: list # The documents returned from the Wikipedia search +``` + +Ces intégrations peuvent être utilisées dans vos tâches pour étendre les capacités de vos agents IA. Pour des informations plus détaillées sur la manière d'utiliser ces intégrations dans vos workflows, veuillez consulter notre [Documentation sur les intégrations](https://docs.julep.ai/integrations). + +## Référence du SDK + +- [Kit de développement logiciel Node.js](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [SDK Python](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## Référence API + +Explorez notre documentation API complète pour en savoir plus sur les agents, les tâches et les exécutions : + +- [API des agents](https://api.julep.ai/api/docs#tag/agents) +- [API des tâches](https://api.julep.ai/api/docs#tag/tasks) +- [API d'exécution](https://api.julep.ai/api/docs#tag/executions) diff --git a/README-JA.md b/README-JA.md new file mode 100644 index 000000000..6a4ff3ab0 --- /dev/null +++ b/README-JA.md @@ -0,0 +1,945 @@ +English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) + +
+ julep +
+ +

+
+ ドキュメントを見る + · + 不和 + · + 𝕏 + · + リンクトイン +

+ + +

+ NPM Version +   + PyPI - Version +   + Docker Image Version +   + GitHub License +

+ +***** + +> [!注意] +> 👨‍💻 devfest.ai イベントに参加しませんか? [Discord](https://discord.com/invite/JTSBGRZrzj) に参加して、以下の詳細を確認してください。 + +
+🌟 貢献者とDevFest.AI参加者(クリックして拡大) + +## 🌟 貢献者を募集します! + +Julep プロジェクトに新しい貢献者を迎えられることを嬉しく思います。プロジェクトを始めるのに役立つ「最初の良い問題」をいくつか作成しました。貢献する方法は次のとおりです。 + +1. 貢献方法に関するガイドラインについては、[CONTRIBUTING.md](https://github.com/julep-ai/julep/blob/dev/CONTRIBUTING.md) ファイルをご覧ください。 +2. [good first issues](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) を参照して、興味のあるタスクを見つけます。 +3. ご質問やご不明な点がございましたら、[Discord](https://discord.com/invite/JTSBGRZrzj) チャンネルまでお気軽にお問い合わせください。 + +あなたの貢献は、大小を問わず私たちにとって貴重です。一緒に素晴らしいものを作りましょう!🚀 + +### 🎉 DevFest.AI 2024年10月 + +嬉しいニュースです!2024 年 10 月を通して DevFest.AI に参加します!🗓️ + +- このイベント中に Julep に貢献すると、素晴らしい Julep のグッズや景品を獲得するチャンスが得られます! 🎁 +- 世界中の開発者とともに AI リポジトリに貢献し、素晴らしいイベントに参加しましょう。 +- この素晴らしい取り組みを企画してくださった DevFest.AI に心から感謝します。 + +> [!ヒント] +> 楽しみに参加する準備はできましたか? **[参加することをツイート](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)**して、コーディングを始めましょう! 🖥️ + +> [!注意] +> API キーを [こちら](https://dashboard-dev.julep.ai) から取得します。 +> +> ベータ版では、[Discord](https://discord.com/invite/JTSBGRZrzj) に連絡して、API キーのレート制限を解除することもできます。 + +![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) + +
+ + + +
+

📖 Table of Contents

+ +- [簡単な例](#%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BE%8B) +- [主な特徴](#%E4%B8%BB%E3%81%AA%E7%89%B9%E5%BE%B4) +- [Julep と LangChain を比較する理由](#julep-%E3%81%A8-langchain-%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1) + - [さまざまなユースケース](#%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9) + - [異なるフォームファクタ](#%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF) +- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) +- [Python クイックスタート 🐍](#python-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) + - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) + - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) + - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) + - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B) +- [Node.js クイックスタート 🟩](#nodejs-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) + - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) + - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) + - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-1) + - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-1) +- [コンポーネント](#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88) + - [メンタルモデル](#%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB) +- [コンセプト](#%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88) +- [タスクを理解する](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B) + - [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E) +- [高度な機能](#%E9%AB%98%E5%BA%A6%E3%81%AA%E6%A9%9F%E8%83%BD) + - [エージェントへのツールの追加](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0) + - [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86) + - [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2) +- [統合](#%E7%B5%B1%E5%90%88) + - [ブレイブサーチ](#%E3%83%96%E3%83%AC%E3%82%A4%E3%83%96%E3%82%B5%E3%83%BC%E3%83%81) + - [ブラウザベース](#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%99%E3%83%BC%E3%82%B9) + - [メール](#%E3%83%A1%E3%83%BC%E3%83%AB) + - [スパイダー](#%E3%82%B9%E3%83%91%E3%82%A4%E3%83%80%E3%83%BC) + - [ウィキペディア](#%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2) +- [SDK リファレンス](#sdk-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) +- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) + +
+ + +## 導入 + +Julep は、過去のやり取りを記憶し、複雑なタスクを実行できる AI エージェントを作成するためのプラットフォームです。長期記憶を提供し、複数ステップのプロセスを管理します。 + +Julep を使用すると、意思決定、ループ、並列処理、多数の外部ツールや API との統合を組み込んだ複数ステップのタスクを作成できます。 + +多くの AI アプリケーションは、分岐が最小限の、プロンプトと API 呼び出しの単純な線形チェーンに制限されていますが、Julep はより複雑なシナリオを処理できるように構築されています。 + +サポート対象: +- 複雑で多段階のプロセス +- ダイナミックな意思決定 +- 並列実行 + +> [!ヒント] +> 単純な質問に答えるだけでなく、複雑なタスクを処理し、過去のやり取りを記憶し、場合によっては他のツールや API も使用できる AI エージェントを構築したいとします。そこで Julep の出番です。 + +## 簡単な例 + +次のことができる研究 AI エージェントを想像してください。 +1. トピックを取り上げ、 +2. そのトピックについて100個の検索クエリを考えます。 +3. ウェブ検索を並行して実行する +4. 結果をまとめる +5.要約をDiscordに送信する + +Julepでは、これは単一のタスクになります80行のコードそして走る完全に管理されたすべては Julep のサーバー上で実行されます。すべての手順は Julep のサーバー上で実行されるため、何もする必要はありません。次に動作例を示します。 + +```yaml +name: Research Agent + +# Optional: Define the input schema for the task +input_schema: + type: object + properties: + topic: + type: string + description: The main topic to research + +# Define the tools that the agent can use +tools: +- name: web_search + type: integration + integration: + provider: brave + setup: + api_key: "YOUR_BRAVE_API_KEY" + +- name: discord_webhook + type: api_call + api_call: + url: "YOUR_DISCORD_WEBHOOK_URL" + method: POST + headers: + Content-Type: application/json + +# Special variables: +# - inputs: for accessing the input to the task +# - outputs: for accessing the output of previous steps +# - _: for accessing the output of the previous step + +# Define the main workflow +main: +- prompt: + - role: system + content: >- + You are a research assistant. + Generate 100 diverse search queries related to the topic: + {{inputs[0].topic}} + + Write one query per line. + unwrap: true + +# Evaluate the search queries using a simple python expression +- evaluate: + search_queries: "_.split('\n')" + +# Run the web search in parallel for each query +- over: "_.search_queries" + map: + tool: web_search + arguments: + query: "_" + parallelism: 100 + +# Collect the results from the web search +- evaluate: + results: "'\n'.join([item.result for item in _])" + +# Summarize the results +- prompt: + - role: system + content: > + You are a research summarizer. Create a comprehensive summary of the following research results on the topic {{inputs[0].topic}}. + The summary should be well-structured, informative, and highlight key findings and insights: + {{_.results}} + unwrap: true + +# Send the summary to Discord +- tool: discord_webhook + arguments: + content: > + **Research Summary for {{inputs[0].topic}}** + + {{_}} +``` + +> [!ヒント] +> Julep は、長期的なインタラクションを通じてコン​​テキストと状態を維持できる AI エージェントを構築する場合に非常に便利です。複雑な複数ステップのワークフローを設計し、さまざまなツールや API をエージェントのプロセスに直接統合するのに最適です。 +> +> この例では、Julep は並列実行を自動的に管理し、失敗したステップを再試行し、API リクエストを再送信し、タスクが完了するまで確実に実行し続けます。 + +## 主な特徴 + +1. 🧠 **永続的な AI エージェント**: 長期にわたるやり取りを通じてコン​​テキストと情報を記憶します。 +2. 💾 **ステートフル セッション**: 過去のやり取りを追跡して、パーソナライズされた応答を提供します。 +3. 🔄 **複数ステップのタスク**: ループと意思決定を使用して、複雑な複数ステップのプロセスを構築します。 +4. ⏳ **タスク管理**: 無期限に実行される可能性のある長時間実行タスクを処理します。 +5. 🛠️ **組み込みツール**: タスクで組み込みツールと外部 API を使用します。 +6. 🔧 **自己修復**: Julep は失敗したステップを自動的に再試行し、メッセージを再送信し、タスクをスムーズに実行し続けます。 +7. 📚 **RAG**: Julep のドキュメント ストアを使用して、独自のデータを取得して使用するためのシステムを構築します。 + +Julep は、単純なプロンプト応答モデルを超えた AI ユースケースを必要とするアプリケーションに最適です。 + +## Julep と LangChain を比較する理由 + +### さまざまなユースケース + +LangChain と Julep は、AI 開発スタック内で異なる重点を置いたツールと考えてください。 + +LangChain は、プロンプトのシーケンスを作成し、AI モデルとのやり取りを管理するのに最適です。多数の事前構築された統合を備えた大規模なエコシステムを備えているため、何かをすぐに立ち上げて実行したい場合に便利です。LangChain は、プロンプトと API 呼び出しの線形チェーンを含む単純なユースケースに適しています。 + +一方、Julep は、長期的なインタラクションを通じて物事を記憶できる永続的な AI エージェントの構築に重点を置いています。エージェントのプロセス内で複数のステップ、意思決定、さまざまなツールや API との直接統合を伴う複雑なタスクが必要な場合に効果を発揮します。永続的なセッションと複雑なタスクを管理するために、ゼロから設計されています。 + +以下のことが必要となる複雑な AI アシスタントの構築を考えている場合には、Julep を使用してください。 + +- 数日または数週間にわたってユーザーのインタラクションを追跡します。 +- 毎日のサマリーの送信やデータ ソースの監視などのスケジュールされたタスクを実行します。 +- 以前のやり取りや保存されたデータに基づいて決定を下します。 +- タスクの一部として複数の外部サービスと対話します。 + +そして、Julep は、ゼロから構築する必要なく、これらすべてをサポートするインフラストラクチャを提供します。 + +### 異なるフォームファクタ + +Julep は、タスクを記述するための言語、それらのタスクを実行するためのサーバー、プラットフォームと対話するための SDK を含む **プラットフォーム** です。Julep で何かを構築するには、タスクの説明を `YAML` で記述し、クラウドでタスクを実行します。 + +Julep は、負荷の高い、複数のステップから成る、長時間実行されるタスク向けに構築されており、タスクの複雑さに制限はありません。 + +LangChain は、プロンプトとツールの線形チェーンを構築するためのいくつかのツールとフレームワークを含む **ライブラリ** です。LangChain を使用して何かを構築するには、通常、使用するモデル チェーンを設定して実行する Python コードを記述します。 + +LangChain は、プロンプトと API 呼び出しの線形チェーンを含む単純なユースケースでは十分であり、実装も迅速です。 + +### 要約すれば + +ステートレスまたは短期的なコンテキストで AI モデルのインタラクションとプロンプト シーケンスを管理する必要がある場合は、LangChain を使用します。 + +高度なタスク機能、永続的なセッション、複雑なタスク管理を備えたステートフル エージェント用の堅牢なフレームワークが必要な場合は、Julep を選択してください。 + +## インストール + +Julep を使い始めるには、[npm](https://www.npmjs.com/package/@julep/sdk) または [pip](https://pypi.org/project/julep/) を使用してインストールします。 + +```bash +npm install @julep/sdk +``` + +または + +```bash +pip install julep +``` + +> [!注意] +> API キーを [こちら](https://dashboard-dev.julep.ai) から取得します。 +> +> ベータ版では、[Discord](https://discord.com/invite/JTSBGRZrzj) に連絡して、API キーのレート制限を解除することもできます。 + +> [!ヒント] +> 💻 あなたは「コードを見せてください!™」タイプの人ですか? 始めるにあたって役立つクックブックを多数作成しました。**[クックブック](https://github.com/julep-ai/julep/tree/dev/cookbooks)** をチェックして、例を参照してください。 +> +> 💡 Julep をベースに構築できるアイデアもたくさんあります。**[アイデアのリスト](https://github.com/julep-ai/julep/tree/dev/cookbooks/IDEAS.md)** をチェックして、インスピレーションを得てください。 + +## Python クイックスタート 🐍 + +### ステップ 1: エージェントを作成する + +```python +import yaml +from julep import Julep # or AsyncJulep + +client = Julep(api_key="your_julep_api_key") + +agent = client.agents.create( + name="Storytelling Agent", + model="gpt-4o", + about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", +) + +# 🛠️ Add an image generation tool (DALL·E) to the agent +client.agents.tools.create( + agent_id=agent.id, + name="image_generator", + description="Use this tool to generate images based on descriptions.", + integration={ + "provider": "dalle", + "method": "generate_image", + "setup": { + "api_key": "your_openai_api_key", + }, + }, +) +``` + +### ステップ2: ストーリーと漫画を生成するタスクを作成する + +入力されたアイデアに基づいてストーリーを作成し、パネル化された漫画を生成するためのマルチステップタスクを定義しましょう。 + +```python +# 📋 Task +# Create a task that takes an idea and creates a story and a 4-panel comic strip +task_yaml = """ +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].strip() + panels: re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: "[output.image.url for output in outputs[2]]" +""" + +task = client.tasks.create( + agent_id=agent.id, + **yaml.safe_load(task_yaml) +) +``` + +### ステップ3: タスクを実行する + +```python +# 🚀 Execute the task with an input idea +execution = client.executions.create( + task_id=task.id, + input={"idea": "A cat who learns to fly"} +) + +# 🎉 Watch as the story and comic panels are generated +for transition in client.executions.transitions.stream(execution_id=execution.id): + print(transition) + +# 📦 Once the execution is finished, retrieve the results +result = client.executions.get(execution_id=execution.id) +``` + +### ステップ4: エージェントとチャットする + +エージェントとの対話型チャット セッションを開始します。 + +```python +session = client.sessions.create(agent_id=agent.id) + +# 💬 Send messages to the agent +while (message := input("Enter a message: ")) != "quit": + response = client.sessions.chat( + session_id=session.id, + message=message, + ) + + print(response) +``` + +> [!ヒント] +> 完全な Python の例は [ここ](example.py) にあります。 + + +## Node.js クイックスタート 🟩 + +### ステップ 1: エージェントを作成する + +```javascript +import { Julep } from '@julep/sdk'; +import yaml from 'js-yaml'; + +const client = new Julep({ apiKey: 'your_julep_api_key' }); + +async function createAgent() { + const agent = await client.agents.create({ + name: "Storytelling Agent", + model: "gpt-4", + about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", + }); + + // 🛠️ Add an image generation tool (DALL·E) to the agent + await client.agents.tools.create(agent.id, { + name: "image_generator", + description: "Use this tool to generate images based on descriptions.", + integration: { + provider: "dalle", + method: "generate_image", + setup: { + api_key: "your_openai_api_key", + }, + }, + }); + + return agent; +} +``` + +### ステップ2: ストーリーと漫画を生成するタスクを作成する + +```javascript +const taskYaml = ` +name: Story and Comic Creator +description: Create a story based on an idea and generate a 4-panel comic strip illustrating the story. + +main: + # Step 1: Generate a story and outline into 4 panels + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. + Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story. + unwrap: true + + # Step 2: Extract the panel descriptions and story + - evaluate: + story: _.split('1. ')[0].trim() + panels: _.match(/\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)/g) + + # Step 3: Generate images for each panel using the image generator tool + - foreach: + in: _.panels + do: + tool: image_generator + arguments: + description: _ + + # Step 4: Generate a catchy title for the story + - prompt: + - role: system + content: You are {{agent.name}}. {{agent.about}} + - role: user + content: > + Based on the story below, generate a catchy title. + + Story: {{outputs[1].story}} + unwrap: true + + # Step 5: Return the story, the generated images, and the title + - return: + title: outputs[3] + story: outputs[1].story + comic_panels: outputs[2].map(output => output.image.url) +`; + +async function createTask(agent) { + const task = await client.tasks.create(agent.id, yaml.load(taskYaml)); + return task; +} +``` + +### ステップ3: タスクを実行する + +```javascript +async function executeTask(task) { + const execution = await client.executions.create(task.id, { + input: { idea: "A cat who learns to fly" } + }); + + // 🎉 Watch as the story and comic panels are generated + for await (const transition of client.executions.transitions.stream(execution.id)) { + console.log(transition); + } + + // 📦 Once the execution is finished, retrieve the results + const result = await client.executions.get(execution.id); + return result; +} +``` + +### ステップ4: エージェントとチャットする + +```javascript +async function chatWithAgent(agent) { + const session = await client.sessions.create({ agent_id: agent.id }); + + // 💬 Send messages to the agent + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + const chat = async () => { + rl.question("Enter a message (or 'quit' to exit): ", async (message) => { + if (message.toLowerCase() === 'quit') { + rl.close(); + return; + } + + const response = await client.sessions.chat(session.id, { message }); + console.log(response); + chat(); + }); + }; + + chat(); +} + +// Run the example +async function runExample() { + const agent = await createAgent(); + const task = await createTask(agent); + const result = await executeTask(task); + console.log("Task Result:", result); + await chatWithAgent(agent); +} + +runExample().catch(console.error); +``` + +> [!ヒント] +> 完全な Node.js の例は [ここ](example.js) にあります。 + +## コンポーネント + +Julep は次のコンポーネントで構成されています。 + +- **Julep プラットフォーム**: Julep プラットフォームは、ワークフローを実行するクラウド サービスです。ワークフローを記述するための言語、ワークフローを実行するためのサーバー、プラットフォームと対話するための SDK が含まれています。 +- **Julep SDK**: Julep SDK は、ワークフローを構築するためのライブラリのセットです。Python 用と JavaScript 用の SDK があり、今後さらに追加される予定です。 +- **Julep API**: Julep API は、Julep プラットフォームと対話するために使用できる RESTful API です。 + +### メンタルモデル + +
+ +
+ +Julep は、クライアント側とサーバー側の両方のコンポーネントを組み合わせて、高度な AI エージェントの構築を支援するプラットフォームと考えてください。これを視覚化する方法は次のとおりです。 + +1. **アプリケーションコード:** +- アプリケーションで Julep SDK を使用して、エージェント、タスク、ワークフローを定義します。 +- SDK は、これらのコンポーネントの設定と管理を容易にする関数とクラスを提供します。 + +2. **Julep バックエンド サービス:** +- SDK はネットワーク経由で Julep バックエンドと通信します。 +- バックエンドは、タスクの実行を処理し、セッション状態を維持し、ドキュメントを保存し、ワークフローを調整します。 + +3. **ツールとAPIとの統合:** +- ワークフロー内で、外部ツールやサービスを統合できます。 +- バックエンドはこれらの統合を容易にするため、エージェントは、たとえば、Web 検索を実行したり、データベースにアクセスしたり、サードパーティの API を呼び出したりすることができます。 + +もっと簡単に言うと: +- Julep は、ステートフル AI エージェントを構築するためのプラットフォームです。 +- コード内で SDK (ツールキットのようなもの) を使用して、エージェントの動作を定義します。 +- バックエンド サービス (エンジンと考えることができます) は、これらの定義を実行し、状態を管理し、複雑さを処理します。 + +## コンセプト + +Julep は、強力な AI ワークフローを作成するために連携するいくつかの主要な技術コンポーネントに基づいて構築されています。 + +```mermaid +graph TD + User[User] ==> Session[Session] + Session --> Agent[Agent] + Agent --> Tasks[Tasks] + Agent --> LLM[Large Language Model] + Tasks --> Tools[Tools] + Agent --> Documents[Documents] + Documents --> VectorDB[Vector Database] + Tasks --> Executions[Executions] + + classDef client fill:#9ff,stroke:#333,stroke-width:1px; + class User client; + + classDef core fill:#f9f,stroke:#333,stroke-width:2px; + class Agent,Tasks,Session core; +``` + +- **エージェント**: タスクを実行し、ユーザーと対話する大規模言語モデル (LLM) を搭載した AI 搭載エンティティ。 +- **ユーザー**: セッションを通じてエージェントと対話するエンティティ。 +- **セッション**: エージェントとユーザー間のステートフルなやり取り。複数のやり取りにわたってコンテキストを維持します。 +- **タスク**: プロンプト、ツール呼び出し、条件付きロジックなどのさまざまな種類のステップを含む、エージェントが実行できる複数ステップのプログラム ワークフロー。 +- **ツール**: ユーザー定義関数、システム ツール、サードパーティ API 統合など、エージェントの機能を拡張する統合。 +- **ドキュメント**: エージェントまたはユーザーに関連付けられたテキストまたはデータ オブジェクト。セマンティック検索と取得のためにベクトル化され、保存されます。 +- **実行**: 特定の入力で開始され、独自のライフサイクルとステート マシンを持つタスクのインスタンス。 + +これらの概念とその相互作用の詳細な説明については、[概念ドキュメント](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)を参照してください。 + +## タスクを理解する + +タスクは Julep のワークフロー システムの中核です。タスクを使用すると、エージェントが実行できる複雑な複数ステップの AI ワークフローを定義できます。タスク コンポーネントの概要は次のとおりです。 + +- **名前と説明**: 各タスクには、簡単に識別できるように一意の名前と説明が付いています。 +- **メインステップ**: タスクの中核であり、実行されるアクションのシーケンスを定義します。 +- **ツール**: タスク実行中にエージェントの機能を拡張するオプションの統合。 + +### ワークフローステップの種類 + +Julep のタスクにはさまざまな種類のステップを含めることができるため、複雑で強力なワークフローを作成できます。利用可能なステップの種類の概要をカテゴリ別にまとめると次のようになります。 + +#### 一般的な手順 + +1. **プロンプト**: AI モデルにメッセージを送信し、応答を受信します。 + ```yaml + - prompt: "Analyze the following data: {{data}}" + ``` + +2. **ツール呼び出し**: 統合ツールまたは API を実行します。 + ```yaml + - tool: web_search + arguments: + query: "Latest AI developments" + ``` + +3. **評価**: 計算を実行したり、データを操作したりします。 + ```yaml + - evaluate: + average_score: "sum(scores) / len(scores)" + ``` + +4. **入力を待機**: 入力が受信されるまでワークフローを一時停止します。 + ```yaml + - wait_for_input: + info: + message: "Please provide additional information." + ``` + +5. **ログ**: 指定された値またはメッセージをログに記録します。 + ```yaml + - log: "Processing completed for item {{item_id}}" + ``` + +#### キー値ステップ + +6. **Get**: キー値ストアから値を取得します。 + ```yaml + - get: "user_preference" + ``` + +7. **Set**: キー値ストア内のキーに値を割り当てます。 + ```yaml + - set: + user_preference: "dark_mode" + ``` + +#### 反復ステップ + +8. **Foreach**: コレクションを反復処理し、各項目に対して手順を実行します。 + ```yaml + - foreach: + in: "data_list" + do: + - log: "Processing item {{_}}" + ``` + +9. **Map-Reduce**: コレクションをマップし、結果を縮小します。 + ```yaml + - map_reduce: + over: "numbers" + map: + - evaluate: + squared: "_ ** 2" + reduce: "sum(results)" + ``` + +10. **並列**: 複数のステップを並列に実行します。 + ```yaml + - parallel: + - tool: web_search + arguments: + query: "AI news" + - tool: weather_check + arguments: + location: "New York" + ``` + +#### 条件付きステップ + +11. **If-Else**: ステップの条件付き実行。 + ```yaml + - if: "score > 0.8" + then: + - log: "High score achieved" + else: + - log: "Score needs improvement" + ``` + +12. **スイッチ**: 複数の条件に基づいてステップを実行します。 + ```yaml + - switch: + - case: "category == 'A'" + then: + - log: "Category A processing" + - case: "category == 'B'" + then: + - log: "Category B processing" + - case: "_" # Default case + then: + - log: "Unknown category" + ``` + +#### その他の制御フロー + +13. **スリープ**: 指定した期間、ワークフローを一時停止します。 + ```yaml + - sleep: + seconds: 30 + ``` + +14. **Return**: ワークフローから値を返します。 + ```yaml + - return: + result: "Task completed successfully" + ``` + +15. **Yield**: サブワークフローを実行し、完了を待ちます。 + ```yaml + - yield: + workflow: "data_processing_subflow" + arguments: + input_data: "{{raw_data}}" + ``` + +16. **エラー**: エラー メッセージを指定してエラーを処理します。 + ```yaml + - error: "Invalid input provided" + ``` + +各ステップ タイプは、高度な AI ワークフローを構築する上で特定の目的を果たします。この分類は、Julep タスクで使用できるさまざまな制御フローと操作を理解するのに役立ちます。 + +## 高度な機能 + +Julep は、AI ワークフローを強化するためのさまざまな高度な機能を提供します。 + +### エージェントへのツールの追加 + +外部ツールと API を統合してエージェントの機能を拡張します。 + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) +``` + +### セッションとユーザーの管理 + +Julep は、永続的なインタラクションのための堅牢なセッション管理を提供します。 + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id=user.id, + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] +) +``` + +### ドキュメントの統合と検索 + +エージェントのドキュメントを簡単に管理および検索できます。 + +```python +# Upload a document +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} +) +``` + +より高度な機能と詳細な使用方法については、[高度な機能のドキュメント](https://docs.julep.ai/advanced-features)を参照してください。 + +## 統合 + +Julep は、AI エージェントの機能を拡張するさまざまな統合をサポートしています。利用可能な統合とサポートされている引数のリストは次のとおりです。 + +### ブレイブサーチ + +```yaml +setup: + api_key: string # The API key for Brave Search + +arguments: + query: string # The search query for searching with Brave + +output: + result: string # The result of the Brave Search +``` + +### ブラウザベース + +```yaml +setup: + api_key: string # The API key for BrowserBase + project_id: string # The project ID for BrowserBase + session_id: string # (Optional) The session ID for BrowserBase + +arguments: + urls: list[string] # The URLs for loading with BrowserBase + +output: + documents: list # The documents loaded from the URLs +``` + +### メール + +```yaml +setup: + host: string # The host of the email server + port: integer # The port of the email server + user: string # The username of the email server + password: string # The password of the email server + +arguments: + to: string # The email address to send the email to + from: string # The email address to send the email from + subject: string # The subject of the email + body: string # The body of the email + +output: + success: boolean # Whether the email was sent successfully +``` + +### スパイダー + +```yaml +setup: + spider_api_key: string # The API key for Spider + +arguments: + url: string # The URL for which to fetch data + mode: string # The type of crawlers (default: "scrape") + params: dict # (Optional) The parameters for the Spider API + +output: + documents: list # The documents returned from the spider +``` + +### 天気 + +```yaml +setup: + openweathermap_api_key: string # The API key for OpenWeatherMap + +arguments: + location: string # The location for which to fetch weather data + +output: + result: string # The weather data for the specified location +``` + +### ウィキペディア + +```yaml +arguments: + query: string # The search query string + load_max_docs: integer # Maximum number of documents to load (default: 2) + +output: + documents: list # The documents returned from the Wikipedia search +``` + +これらの統合をタスク内で使用して、AI エージェントの機能を拡張できます。ワークフローでこれらの統合を使用する方法の詳細については、[統合ドキュメント](https://docs.julep.ai/integrations)を参照してください。 + +## SDK リファレンス + +- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) +- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) + +## APIリファレンス + +エージェント、タスク、実行の詳細については、包括的な API ドキュメントをご覧ください。 + +- [エージェント API](https://api.julep.ai/api/docs#tag/agents) +- [タスク API](https://api.julep.ai/api/docs#tag/tasks) +- [実行API](https://api.julep.ai/api/docs#tag/executions) diff --git a/README.md b/README.md index 0801dce07..0e4b36635 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ ***** > [!NOTE] -> 👨‍💻 Here for the devfest.ai event? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below. +> 👨‍💻 Here for the devfest.ai event ? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below.
🌟 Contributors and DevFest.AI Participants (Click to expand) diff --git a/scripts/readme_translator.py b/scripts/readme_translator.py new file mode 100644 index 000000000..011763b52 --- /dev/null +++ b/scripts/readme_translator.py @@ -0,0 +1,75 @@ +import re +from typing import List +from pathlib import Path +from functools import partial +from deep_translator import GoogleTranslator +import parmapper + +HTML_TAGS_PATTERN = r"(<[^>]+>)" +CODEBLOCK_PATTERN = r"(```[\s\S]*?```|\n)" + +def create_translator(target: str) -> GoogleTranslator: + """ + Create a translator for a given target language. + """ + return GoogleTranslator(source="en", target=target) + +def translate_segment(translator: GoogleTranslator, segment: str) -> str: + """ + Translate a given raw HTML content using the provided translator, preserving HTML tags and newlines. + """ + if re.fullmatch(CODEBLOCK_PATTERN, segment) or segment == '\n': + return segment + + segments = re.split(HTML_TAGS_PATTERN, segment) + translated_segments = [] + + for sub_segment in segments: + if re.fullmatch(HTML_TAGS_PATTERN, sub_segment): + translated_segments.append(sub_segment) + else: + try: + if re.fullmatch(r'^[!"#$%&\'()*+,\-./:;<=>?@[\]^_`{|}~]+$', sub_segment): + translated_segments.append(sub_segment) + continue + + translated = translator.translate(sub_segment) + translated_segments.append(translated if translated else sub_segment) + except Exception as e: + print(f"Error translating segment '{sub_segment}': {e}") + translated_segments.append(sub_segment) + + return "".join(translated_segments) + +def translate_readme(source: str, target: str) -> str: + """ + Translate a README file from source to target language, preserving code blocks and newlines. + """ + file_content = Path(source).read_text(encoding='utf-8') + translator = create_translator(target) + segments = re.split(CODEBLOCK_PATTERN, file_content) + segment_translation = partial(translate_segment, translator) + translated_segments = list(parmapper.parmap(segment_translation, segments)) + return ''.join(translated_segments) + +def save_translated_readme(translated_content: str, lang: str) -> None: + """ + Save the translated README content to a file. + """ + filename = f"README-{lang.split('-')[-1].upper()}.md" + with open(filename, "w", encoding='utf-8') as file: + file.write(translated_content) + +def main() -> None: + """ + Main function to translate README.md to multiple languages. + """ + source_file = "README.md" + destination_langs = ["zh-CN", "ja", "fr"] + + for lang in destination_langs: + translated_readme = translate_readme(source_file, lang) + save_translated_readme(translated_readme, lang) + +if __name__ == "__main__": + main() \ No newline at end of file From d11c22ac2ad0732edcecc566a1435b191d839c7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 13 Oct 2024 20:43:46 +0000 Subject: [PATCH 105/113] chore(readme): translate README.md --- README-CN.md | 308 ++++++++++++++++++++++++++++++++++++-------------- README-FR.md | 307 ++++++++++++++++++++++++++++++++++++-------------- README-JA.md | 312 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 670 insertions(+), 257 deletions(-) diff --git a/README-CN.md b/README-CN.md index ebf51db6e..d4a70f67d 100644 --- a/README-CN.md +++ b/README-CN.md @@ -56,7 +56,7 @@ > 准备好加入这场有趣的活动了吗?**[发推文表示你正在参与](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** 让我们开始编码吧!🖥️ > [!注意] -> 从[此处](https://dashboard-dev.julep.ai)获取您的 API 密钥。 +> 从 [此处](https://dashboard-dev.julep.ai) 获取您的 API 密钥。 > > 虽然我们处于测试阶段,但您也可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 联系,以解除 API 密钥的速率限制。 @@ -67,33 +67,50 @@
-

📖 Table of Contents

- -- [为什么选择 Julep 而不是 LangChain?](#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9-julep-%E8%80%8C%E4%B8%8D%E6%98%AF-langchain) - - [不同的用例](#%E4%B8%8D%E5%90%8C%E7%9A%84%E7%94%A8%E4%BE%8B) - - [不同的外形尺寸](#%E4%B8%8D%E5%90%8C%E7%9A%84%E5%A4%96%E5%BD%A2%E5%B0%BA%E5%AF%B8) -- [Python 快速入门🐍](#python-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8) - - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86) - - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1) - - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1) - - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9) -- [Node.js 快速入门 🟩](#nodejs-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8-) - - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86-1) - - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1-1) - - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1-1) - - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9-1) - - [心智模型](#%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B) -- [概念](#%E6%A6%82%E5%BF%B5) -- [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1) - - [工作流步骤的类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%9A%84%E7%B1%BB%E5%9E%8B) -- [高级功能](#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD) - - [向代理添加工具](#%E5%90%91%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7) - - [管理会话和用户](#%E7%AE%A1%E7%90%86%E4%BC%9A%E8%AF%9D%E5%92%8C%E7%94%A8%E6%88%B7) - - [文档集成与搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E4%B8%8E%E6%90%9C%E7%B4%A2) -- [集成](#%E9%9B%86%E6%88%90) - - [勇敢搜索](#%E5%8B%87%E6%95%A2%E6%90%9C%E7%B4%A2) - - [浏览器基础](#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9F%BA%E7%A1%80) -- [SDK 参考](#sdk-%E5%8F%82%E8%80%83) +

📖 目录

+ +- [简介](#introduction) +- [快速示例](#quick-example) +- [主要特点](#key-features) +- [为什么选择 Julep 而不是 LangChain?](#why-julep-vs-langchain) +- [不同用例](#different-use-cases) +- [不同的外形尺寸](#different-form-factor) +- [总结](#in-summary) +- [安装](#安装) +- [Python 快速入门 🐍](#python-quick-start-) +- [步骤 1:创建代理](#step-1-create-an-agent) +- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip) +- [步骤 3:执行任务](#step-3-execute-the-task) +- [步骤 4:与代理聊天](#step-4-chat-with-the-agent) +- [Node.js 快速入门🟩](#nodejs-quick-start-) +- [步骤 1:创建代理](#step-1-create-an-agent-1) +- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) +- [步骤 3:执行任务](#step-3-execute-the-task-1) +- [步骤 4:与代理聊天](#step-4-chat-with-the-agent-1) +- [组件](#components) +- [心智模型](#mental-model) +- [概念](#concepts) +- [理解任务](#understanding-tasks) +- [工作流步骤的类型](#types-of-workflow-steps) +- [工具类型](#tool-types) +- [用户定义的函数](#user-defined-functions) +- [`系统` 工具](#system-tools) +- [内置集成](#built-in-integrations) +- [直接 `api_call`](#direct-api_calls) +- [集成](#integrations) +- [勇敢搜索](#brave-search) +- [BrowserBase](#browserbase) +- [电子邮件](#email) +- [蜘蛛](#蜘蛛) +- [天气](#天气) +- [维基百科](#wikipedia) +- [其他功能](#other-features) +- [向代理添加工具](#adding-tools-to-agents) +- [管理会话和用户](#managing-sessions-and-users) +- [文档集成与搜索](#document-integration-and-search) +- [本地快速启动](#local-quickstart) +- [SDK 参考](#sdk-reference) +- [API 参考](#api-reference)
@@ -271,7 +288,7 @@ pip install julep ``` > [!注意] -> 从[此处](https://dashboard-dev.julep.ai)获取您的 API 密钥。 +> 从 [此处](https://dashboard-dev.julep.ai) 获取您的 API 密钥。 > > 虽然我们处于测试阶段,但您也可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 联系,以解除 API 密钥的速率限制。 @@ -766,70 +783,106 @@ Julep 中的任务可以包含各种类型的步骤,让您可以创建复杂 每种步骤类型在构建复杂的 AI 工作流中都有特定的用途。此分类有助于理解 Julep 任务中可用的各种控制流程和操作。 -## 高级功能 -Julep 提供一系列高级功能来增强您的 AI 工作流程: +## 工具类型 -### 向代理添加工具 +代理可以访问许多“工具”——基础模型可以使用一组输入“调用”的任何编程接口来实现目标。例如,它可以使用“web_search(query)”工具在互联网上搜索一些信息。 -通过集成外部工具和 API 来扩展代理的功能: +与代理框架不同,julep 是管理代理执行的后端。客户端可以使用我们的 SDK 与代理进行交互。julep 负责执行任务和运行集成。 -```python -client.agents.tools.create( - agent_id=agent.id, - name="web_search", - description="Search the web for information.", - integration={ - "provider": "brave", - "method": "search", - "setup": {"api_key": "your_brave_api_key"}, - }, -) -``` +julep 中的工具可以是以下之一: -### 管理会话和用户 +### 用户定义的函数 -Julep 为持久交互提供了强大的会话管理: +这些是您可以为模型提供的函数签名,类似于 [openai] 的函数调用工作方式。例如: -```python -session = client.sessions.create( - agent_id=agent.id, - user_id=user.id, - context_overflow="adaptive" -) +```yaml + name: Example system tool task + description: List agents using system call -# Continue conversation in the same session -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": "Follow up on the previous conversation." - } - ] -) -``` - -### 文档集成与搜索 + tools: + - name: send_notification + description: Send a notification to the user + type: function + function: + parameters: + type: object + properties: + text: + type: string + description: Content of the notification -轻松管理和搜索代理的文档: + main: + - tool: send_notification + arguments: + content: hi +``` + +每当 julep 遇到_用户定义函数_时,它就会暂停,将控制权交还给客户端,并等待客户端运行函数调用并将结果返回给 julep。 -```python -# Upload a document -document = client.agents.docs.create( - title="AI advancements", - content="AI is changing the world...", - metadata={"category": "research_paper"} -) +> [!提示] +> **示例食谱**:[cookbooks/13-Error_Handling_and_Recovery.py](https://github.com/julep-ai/julep/blob/dev/cookbooks/13-Error_Handling_and_Recovery.py) + +### `系统` 工具 +内置工具可用于调用 julep API 本身,例如触发任务执行、附加到元数据字段等。 +“系统”工具内置于后端。它们会在需要时自动执行。它们不需要客户端的任何操作。 + +例如, + + ```yaml + name: Example system tool task + description: List agents using system call + + tools: + - name: list_agents + description: List all agents + type: system + system: + resource: agent + operation: list + main: + - tool: list_agents + arguments: + limit: 10 + ``` -# Search documents -results = client.agents.docs.search( - text="AI advancements", - metadata_filter={"category": "research_paper"} -) -``` +> [!提示] +> **示例食谱**:[cookbooks/10-Document_Management_and_Search.py​​](https://github.com/julep-ai/julep/blob/dev/cookbooks/10-Document_Management_and_Search.py​​) + +### 内置“集成” +Julep 带有许多内置集成(如下节所述)。`集成` 工具直接在 julep 后端执行。它们在运行时所需的任何其他参数都可以在代理/会话/用户的 `元数据` 字段中设置。 -有关更多高级功能和详细用法,请参阅我们的[高级功能文档](https://docs.julep.ai/advanced-features)。 +> [!提示] +> **示例食谱**:[cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + +julep 后端附带来自以下提供商的集成第三方工具: +- [composio](https://composio.dev) \*\* +- [匿名](https://anon.com)\*\* +- [langchain 工具包](https://python.langchain.com/v0.2/docs/integrations/toolkits/)。计划支持 _Github、Gitlab、Gmail、Jira、MultiOn、Slack_ 工具包。 + +\*\* 由于 _composio_ 和 _anon_ 是第三方提供商,因此他们的工具需要设置帐户链接。 + + +### 直接 `api_call` + +julep 还可以在工作流执行期间直接以工具调用的形式进行 api 调用。与“集成”相同,其他运行时参数从“元数据”字段加载。 + +例如, + + ```yaml + name: Example api_call task + tools: + - type: api_call + name: hello + api_call: + method: GET + url: https://httpbin.org/get + main: + - tool: hello + arguments: + params: + test: _.input + ``` ## 集成 @@ -848,6 +901,9 @@ output: result: string # The result of the Brave Search ``` +> [!提示] +> **示例食谱**:[cookbooks/03-SmartResearcher_With_WebSearch.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) + ### 浏览器基础 ```yaml @@ -882,6 +938,9 @@ output: success: boolean # Whether the email was sent successfully ``` +> [!提示] +> **示例食谱**:[cookbooks/00-Devfest-Email-Assistant.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/00-Devfest-Email-Assistant.ipynb) + ### 蜘蛛 ```yaml @@ -897,6 +956,9 @@ output: documents: list # The documents returned from the spider ``` +> [!提示] +> **示例食谱**:[cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + ### 天气 ```yaml @@ -910,6 +972,9 @@ output: result: string # The weather data for the specified location ``` +> [!提示] +> **示例食谱**:[cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + 维基百科 ```yaml @@ -921,8 +986,87 @@ output: documents: list # The documents returned from the Wikipedia search ``` +> [!提示] +> **示例食谱**:[cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + 这些集成可用于您的任务中,以扩展您的 AI 代理的功能。有关如何在您的工作流程中使用这些集成的详细信息,请参阅我们的 [集成文档](https://docs.julep.ai/integrations)。 +其他功能 + +Julep 提供一系列高级功能来增强您的 AI 工作流程: + +### 向代理添加工具 + +通过集成外部工具和 API 来扩展代理的功能: + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) +``` + +### 管理会话和用户 + +Julep 为持久交互提供了强大的会话管理: + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id=user.id, + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] +) +``` + +### 文档集成与搜索 + +轻松管理和搜索代理的文档: + +```python +# Upload a document +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} +) +``` + +## 本地快速启动 + +**要求**: +- 安装了最新的docker compose + +**步骤**: +1. `git 克隆 https://github.com/julep-ai/julep.git` +2. `cd julep` +3. `docker 卷创建 cozo_backup` +4. `docker 卷创建 cozo_data` +5. `cp .env.example .env # <-- 编辑此文件` +6. `docker compose --env-file .env --profile temporary-ui --profile single-tenant --profile self-hosted-db up --build` + ## SDK 参考 - [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) @@ -930,7 +1074,7 @@ output: API 参考 -浏览我们全面的 API 文档,以了解有关代理、任务和执行的更多信息: +浏览我们全面的 API 文档,了解有关代理、任务和执行的更多信息: - [代理 API](https://api.julep.ai/api/docs#tag/agents) - [任务 API](https://api.julep.ai/api/docs#tag/tasks) diff --git a/README-FR.md b/README-FR.md index b2dbc511d..8ec14de75 100644 --- a/README-FR.md +++ b/README-FR.md @@ -67,44 +67,50 @@ Des nouvelles passionnantes ! Nous participons au DevFest.AI tout au long du moi
-

📖 Table of Contents

- -- [Introduction](#introduction) -- [Exemple rapide](#exemple-rapide) -- [Principales caractéristiques](#principales-caract%C3%A9ristiques) -- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain%C2%A0) - - [Différents cas d'utilisation](#diff%C3%A9rents-cas-dutilisation) - - [Facteur de forme différent](#facteur-de-forme-diff%C3%A9rent) - - [En résumé](#en-r%C3%A9sum%C3%A9) +

📖 Table des matières

+ +- [Présentation](#introduction) +- [Exemple rapide](#quick-example) +- [Caractéristiques principales](#key-features) +- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain) +- [Différents cas d'utilisation](#different-use-cases) +- [Facteur de forme différent](#different-form-factor) +- [En résumé](#en-resumé) - [Installation](#installation) -- [Démarrage rapide de Python 🐍](#d%C3%A9marrage-rapide-de-python-) - - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent) - - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e) - - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che) - - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent) -- [Démarrage rapide de Node.js 🟩](#d%C3%A9marrage-rapide-de-nodejs-) - - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent-1) - - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e-1) - - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che-1) - - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent-1) +- [Démarrage rapide de Python 🐍](#python-quick-start-) +- [Étape 1 : Créer un agent](#step-1-create-an-agent) +- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip) +- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task) +- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent) +- [Démarrage rapide de Node.js 🟩](#nodejs-quick-start-) +- [Étape 1 : Créer un agent](#step-1-create-an-agent-1) +- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) +- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task-1) +- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent-1) - [Composants](#composants) - - [Modèle mental](#mod%C3%A8le-mental) +- [Modèle mental](#mental-model) - [Concepts](#concepts) -- [Comprendre les tâches](#comprendre-les-t%C3%A2ches) - - [Types d'étapes de flux de travail](#types-d%C3%A9tapes-de-flux-de-travail) -- [Fonctionnalités avancées](#fonctionnalit%C3%A9s-avanc%C3%A9es) - - [Ajout d'outils aux agents](#ajout-doutils-aux-agents) - - [Gestion des sessions et des utilisateurs](#gestion-des-sessions-et-des-utilisateurs) - - [Intégration et recherche de documents](#int%C3%A9gration-et-recherche-de-documents) -- [Intégrations](#int%C3%A9grations) - - [Recherche courageuse](#recherche-courageuse) - - [Base de navigateur](#base-de-navigateur) - - [E-mail](#e-mail) - - [Araignée](#araign%C3%A9e) - - [Météo](#m%C3%A9t%C3%A9o) - - [Wikipédia](#wikip%C3%A9dia) -- [Référence du SDK](#r%C3%A9f%C3%A9rence-du-sdk) -- [Référence API](#r%C3%A9f%C3%A9rence-api) +- [Comprendre les tâches](#understanding-tasks) +- [Types d'étapes de flux de travail](#types-of-workflow-steps) +- [Types d'outils](#types-d'outils) +- [Fonctions définies par l'utilisateur](#user-defined-functions) +- [outils système](#outils-système) +- [Intégrations intégrées](#integrations-integrées) +- [Appels directs d'API](#appels directs d'API) +- [Intégrations](#intégrations) +- [Recherche courageuse](#brave-search) +- [Base du navigateur](#basedunavigateur) +- [Courriel](#courriel) +- [Araignée](#araignée) +- [Météo](#météo) +- [Wikipédia](#wikipédia) +- [Autres fonctionnalités](#other-features) +- [Ajout d'outils aux agents](#adding-tools-to-agents) +- [Gestion des sessions et des utilisateurs](#managing-sessions-and-users) +- [Intégration et recherche de documents](#document-integration-and-search) +- [Démarrage rapide local](#local-quickstart) +- [Référence SDK](#sdk-reference) +- [Référence API](#api-reference)
@@ -777,70 +783,106 @@ Les tâches dans Julep peuvent inclure différents types d'étapes, ce qui vous Chaque type d'étape remplit un objectif spécifique dans la création de workflows d'IA sophistiqués. Cette catégorisation permet de comprendre les différents flux de contrôle et opérations disponibles dans les tâches Julep. -## Fonctionnalités avancées -Julep propose une gamme de fonctionnalités avancées pour améliorer vos flux de travail d'IA : +## Types d'outils -### Ajout d'outils aux agents +Les agents peuvent avoir accès à un certain nombre d'« outils » : toute interface de programmation qu'un modèle de base peut « appeler » avec un ensemble d'entrées pour atteindre un objectif. Par exemple, il peut utiliser un outil « web_search(query) » pour rechercher des informations sur Internet. -Étendez les capacités de votre agent en intégrant des outils et des API externes : +Contrairement aux frameworks d'agents, Julep est un backend qui gère l'exécution des agents. Les clients peuvent interagir avec les agents à l'aide de nos SDK. Julep s'occupe de l'exécution des tâches et de l'exécution des intégrations. -```python -client.agents.tools.create( - agent_id=agent.id, - name="web_search", - description="Search the web for information.", - integration={ - "provider": "brave", - "method": "search", - "setup": {"api_key": "your_brave_api_key"}, - }, -) -``` +Les outils du julep peuvent être l’un des suivants : -### Gestion des sessions et des utilisateurs +### Fonctions définies par l'utilisateur -Julep fournit une gestion de session robuste pour les interactions persistantes : +Il s'agit de signatures de fonctions que vous pouvez attribuer au modèle pour qu'il puisse choisir, de la même manière que fonctionne l'appel de fonctions d'[openai]. Un exemple : -```python -session = client.sessions.create( - agent_id=agent.id, - user_id=user.id, - context_overflow="adaptive" -) +```yaml + name: Example system tool task + description: List agents using system call -# Continue conversation in the same session -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": "Follow up on the previous conversation." - } - ] -) -``` - -### Intégration et recherche de documents + tools: + - name: send_notification + description: Send a notification to the user + type: function + function: + parameters: + type: object + properties: + text: + type: string + description: Content of the notification -Gérez et recherchez facilement des documents pour vos agents : + main: + - tool: send_notification + arguments: + content: hi +``` + +Chaque fois que julep rencontre une _fonction définie par l'utilisateur_, il s'arrête, rend le contrôle au client et attend que le client exécute l'appel de fonction et renvoie les résultats à julep. -```python -# Upload a document -document = client.agents.docs.create( - title="AI advancements", - content="AI is changing the world...", - metadata={"category": "research_paper"} -) +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/13-Error_Handling_and_Recovery.py](https://github.com/julep-ai/julep/blob/dev/cookbooks/13-Error_Handling_and_Recovery.py) + +### outils `système` +Outils intégrés qui peuvent être utilisés pour appeler les API julep elles-mêmes, comme déclencher l'exécution d'une tâche, ajouter à un champ de métadonnées, etc. +Les outils « système » sont intégrés au backend. Ils sont exécutés automatiquement lorsque cela est nécessaire. Ils ne nécessitent aucune action du côté client. + +Par exemple, + + ```yaml + name: Example system tool task + description: List agents using system call + + tools: + - name: list_agents + description: List all agents + type: system + system: + resource: agent + operation: list + main: + - tool: list_agents + arguments: + limit: 10 + ``` -# Search documents -results = client.agents.docs.search( - text="AI advancements", - metadata_filter={"category": "research_paper"} -) -``` +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/10-Document_Management_and_Search.py](https://github.com/julep-ai/julep/blob/dev/cookbooks/10-Document_Management_and_Search.py) + +### Intégrations intégrées +Julep est livré avec un certain nombre d'intégrations intégrées (comme décrit dans la section ci-dessous). Les outils « d'intégration » sont directement exécutés sur le backend de Julep. Tous les paramètres supplémentaires dont ils ont besoin au moment de l'exécution peuvent être définis dans les champs « métadonnées » de l'agent/session/utilisateur. -Pour des fonctionnalités plus avancées et une utilisation détaillée, veuillez vous référer à notre [Documentation sur les fonctionnalités avancées](https://docs.julep.ai/advanced-features). +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + +Le backend Julep est livré avec des outils tiers intégrés provenant des fournisseurs suivants : +- [composio](https://composio.dev) \*\* +- [anonyme](https://anon.com) \*\* +- [kits d'outils langchain](https://python.langchain.com/v0.2/docs/integrations/toolkits/). La prise en charge des kits d'outils _Github, Gitlab, Gmail, Jira, MultiOn, Slack_ est prévue. + +\*\* Étant donné que _composio_ et _anon_ sont des fournisseurs tiers, leurs outils nécessitent la configuration d'une liaison de compte. + + +### Appels directs `api_call` + +julep peut également effectuer directement des appels d'API lors des exécutions de workflows sous forme d'appels d'outils. Comme pour `integration`, des paramètres d'exécution supplémentaires sont chargés à partir des champs `metadata`. + +Par exemple, + + ```yaml + name: Example api_call task + tools: + - type: api_call + name: hello + api_call: + method: GET + url: https://httpbin.org/get + main: + - tool: hello + arguments: + params: + test: _.input + ``` ## Intégrations @@ -859,6 +901,9 @@ output: result: string # The result of the Brave Search ``` +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/03-SmartResearcher_With_WebSearch.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) + ### Base de navigateur ```yaml @@ -893,6 +938,9 @@ output: success: boolean # Whether the email was sent successfully ``` +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/00-Devfest-Email-Assistant.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/00-Devfest-Email-Assistant.ipynb) + ### Araignée ```yaml @@ -908,6 +956,9 @@ output: documents: list # The documents returned from the spider ``` +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + ### Météo ```yaml @@ -921,6 +972,9 @@ output: result: string # The weather data for the specified location ``` +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + ### Wikipédia ```yaml @@ -932,8 +986,87 @@ output: documents: list # The documents returned from the Wikipedia search ``` +> [!TIP] +> **Exemple de livre de recettes** : [cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + Ces intégrations peuvent être utilisées dans vos tâches pour étendre les capacités de vos agents IA. Pour des informations plus détaillées sur la manière d'utiliser ces intégrations dans vos workflows, veuillez consulter notre [Documentation sur les intégrations](https://docs.julep.ai/integrations). +## Autres fonctionnalités + +Julep propose une gamme de fonctionnalités avancées pour améliorer vos flux de travail d'IA : + +### Ajout d'outils aux agents + +Étendez les capacités de votre agent en intégrant des outils et des API externes : + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) +``` + +### Gestion des sessions et des utilisateurs + +Julep fournit une gestion de session robuste pour les interactions persistantes : + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id=user.id, + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] +) +``` + +### Intégration et recherche de documents + +Gérez et recherchez facilement des documents pour vos agents : + +```python +# Upload a document +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} +) +``` + +## Démarrage rapide local + +**Exigences**: +- dernier docker compose installé + +**Mesures**: +1. `git clone https://github.com/julep-ai/julep.git` +2. `cd julep` +3. `docker volume create cozo_backup` +4. `docker volume create cozo_data` +5. `cp .env.example .env # <-- Modifier ce fichier` +6. `docker compose --env-file .env --profile temporal-ui --profile single-tenant --profile self-hosted-db up --build` + ## Référence du SDK - [Kit de développement logiciel Node.js](https://github.com/julep-ai/node-sdk/blob/main/api.md) diff --git a/README-JA.md b/README-JA.md index 6a4ff3ab0..20d3707cc 100644 --- a/README-JA.md +++ b/README-JA.md @@ -67,41 +67,50 @@ Julep プロジェクトに新しい貢献者を迎えられることを嬉し
-

📖 Table of Contents

- -- [簡単な例](#%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BE%8B) -- [主な特徴](#%E4%B8%BB%E3%81%AA%E7%89%B9%E5%BE%B4) -- [Julep と LangChain を比較する理由](#julep-%E3%81%A8-langchain-%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1) - - [さまざまなユースケース](#%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9) - - [異なるフォームファクタ](#%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF) -- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) -- [Python クイックスタート 🐍](#python-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) - - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) - - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) - - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) - - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B) -- [Node.js クイックスタート 🟩](#nodejs-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) - - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) - - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) - - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-1) - - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-1) -- [コンポーネント](#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88) - - [メンタルモデル](#%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB) -- [コンセプト](#%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88) -- [タスクを理解する](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B) - - [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E) -- [高度な機能](#%E9%AB%98%E5%BA%A6%E3%81%AA%E6%A9%9F%E8%83%BD) - - [エージェントへのツールの追加](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0) - - [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86) - - [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2) -- [統合](#%E7%B5%B1%E5%90%88) - - [ブレイブサーチ](#%E3%83%96%E3%83%AC%E3%82%A4%E3%83%96%E3%82%B5%E3%83%BC%E3%83%81) - - [ブラウザベース](#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%99%E3%83%BC%E3%82%B9) - - [メール](#%E3%83%A1%E3%83%BC%E3%83%AB) - - [スパイダー](#%E3%82%B9%E3%83%91%E3%82%A4%E3%83%80%E3%83%BC) - - [ウィキペディア](#%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2) -- [SDK リファレンス](#sdk-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) -- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) +

📖 目次

+ +- [はじめに](#introduction) +- [簡単な例](#quick-example) +- [主な機能](#key-features) +- [なぜ Julep と LangChain を比較するのか?](#why-julep-vs-langchain) +- [さまざまなユースケース](#different-use-cases) +- [異なるフォームファクター](#different-form-factor) +- [要約](#in-summary) +- [インストール](#installation) +- [Python クイックスタート 🐍](#python-quick-start-) +- [ステップ 1: エージェントを作成する](#step-1-create-an-agent) +- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip) +- [ステップ 3: タスクを実行する](#step-3-execute-the-task) +- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent) +- [Node.js クイック スタート 🟩](#nodejs-quick-start-) +- [ステップ 1: エージェントを作成する](#step-1-create-an-agent-1) +- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) +- [ステップ 3: タスクを実行する](#step-3-execute-the-task-1) +- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent-1) +- [コンポーネント](#components) +- [メンタルモデル](#mental-model) +- [コンセプト](#concepts) +- [タスクの理解](#understanding-tasks) +- [ワークフロー ステップの種類](#types-of-workflow-steps) +- [ツールの種類](#tool-types) +- [ユーザー定義の `function`](#user-defined-functions) +- [`システム` ツール](#system-tools) +- [組み込みの `integration`s](#built-in-integrations) +- [直接の `api_call`](#direct-api_calls) +- [統合](#integrations) +- [勇敢な検索](#brave-search) +- [ブラウザベース](#browserbase) +- [メールアドレス](#email) +- [スパイダー](#spider) +- [天気](#weather) +- [ウィキペディア](#wikipedia) +- [その他の機能](#other-features) +- [エージェントへのツールの追加](#adding-tools-to-agents) +- [セッションとユーザーの管理](#managing-sessions-and-users) +- [ドキュメントの統合と検索](#document-integration-and-search) +- [ローカルクイックスタート](#local-quickstart) +- [SDKリファレンス](#sdk-reference) +- [APIリファレンス](#api-reference)
@@ -585,7 +594,7 @@ Julep は、クライアント側とサーバー側の両方のコンポーネ 1. **アプリケーションコード:** - アプリケーションで Julep SDK を使用して、エージェント、タスク、ワークフローを定義します。 -- SDK は、これらのコンポーネントの設定と管理を容易にする関数とクラスを提供します。 +- SDK は、これらのコンポーネントのセットアップと管理を容易にする関数とクラスを提供します。 2. **Julep バックエンド サービス:** - SDK はネットワーク経由で Julep バックエンドと通信します。 @@ -774,70 +783,106 @@ Julep のタスクにはさまざまな種類のステップを含めること 各ステップ タイプは、高度な AI ワークフローを構築する上で特定の目的を果たします。この分類は、Julep タスクで使用できるさまざまな制御フローと操作を理解するのに役立ちます。 -## 高度な機能 -Julep は、AI ワークフローを強化するためのさまざまな高度な機能を提供します。 +## ツールの種類 -### エージェントへのツールの追加 +エージェントには、さまざまな「ツール」へのアクセスを許可できます。これは、基盤モデルが一連の入力を使用して「呼び出す」ことができるプログラム インターフェイスです。たとえば、インターネットで何らかの情報を検索するには、`web_search(query)` ツールを使用します。 -外部ツールと API を統合してエージェントの機能を拡張します。 +エージェント フレームワークとは異なり、julep はエージェントの実行を管理する _バックエンド_ です。クライアントは SDK を使用してエージェントと対話できます。julep はタスクの実行と統合の実行を担当します。 -```python -client.agents.tools.create( - agent_id=agent.id, - name="web_search", - description="Search the web for information.", - integration={ - "provider": "brave", - "method": "search", - "setup": {"api_key": "your_brave_api_key"}, - }, -) -``` +julep のツールは次のいずれかになります。 -### セッションとユーザーの管理 +### ユーザー定義の `function` -Julep は、永続的なインタラクションのための堅牢なセッション管理を提供します。 +これらは、[openai] の関数呼び出しの仕組みと同様に、モデルに選択させることができる関数シグネチャです。例: -```python -session = client.sessions.create( - agent_id=agent.id, - user_id=user.id, - context_overflow="adaptive" -) +```yaml + name: Example system tool task + description: List agents using system call -# Continue conversation in the same session -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": "Follow up on the previous conversation." - } - ] -) -``` - -### ドキュメントの統合と検索 + tools: + - name: send_notification + description: Send a notification to the user + type: function + function: + parameters: + type: object + properties: + text: + type: string + description: Content of the notification -エージェントのドキュメントを簡単に管理および検索できます。 + main: + - tool: send_notification + arguments: + content: hi +``` + +julep は、_ユーザー定義関数_ に遭遇するたびに一時停止し、制御をクライアントに戻し、クライアントが関数呼び出しを実行して結果を julep に返すのを待ちます。 -```python -# Upload a document -document = client.agents.docs.create( - title="AI advancements", - content="AI is changing the world...", - metadata={"category": "research_paper"} -) +> [!ヒント] +> **サンプルクックブック**: [cookbooks/13-Error_Handling_and_Recovery.py](https://github.com/julep-ai/julep/blob/dev/cookbooks/13-Error_Handling_and_Recovery.py) + +### `システム` ツール +タスク実行のトリガー、メタデータ フィールドへの追加など、julep API 自体を呼び出すために使用できる組み込みツール。 +`system` ツールはバックエンドに組み込まれています。必要に応じて自動的に実行されます。クライアント側からのアクションは必要ありません。 + +例えば、 + + ```yaml + name: Example system tool task + description: List agents using system call + + tools: + - name: list_agents + description: List all agents + type: system + system: + resource: agent + operation: list + main: + - tool: list_agents + arguments: + limit: 10 + ``` -# Search documents -results = client.agents.docs.search( - text="AI advancements", - metadata_filter={"category": "research_paper"} -) -``` +> [!ヒント] +> **サンプルクックブック**: [cookbooks/10-Document_Management_and_Search.py​​](https://github.com/julep-ai/julep/blob/dev/cookbooks/10-Document_Management_and_Search.py​​) + +### 組み込みの `integration` +Julep には、多数の組み込み統合が付属しています (以下のセクションで説明)。`integration` ツールは、julep バックエンドで直接実行されます。実行時に必要な追加パラメータは、エージェント/セッション/ユーザーの `metadata` フィールドで設定できます。 -より高度な機能と詳細な使用方法については、[高度な機能のドキュメント](https://docs.julep.ai/advanced-features)を参照してください。 +> [!ヒント] +> **サンプルクックブック**: [cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + +julep バックエンドには、次のプロバイダーからの統合サードパーティ ツールが付属しています。 +- [composio](https://composio.dev) \*\* +- [匿名](https://anon.com) \*\* +- [langchain ツールキット](https://python.langchain.com/v0.2/docs/integrations/toolkits/)。_Github、Gitlab、Gmail、Jira、MultiOn、Slack_ ツールキットのサポートが計画されています。 + +\*\* _composio_ と _anon_ はサードパーティプロバイダーであるため、それらのツールではアカウントリンクを設定する必要があります。 + + +### 直接の `api_call` + +julep は、ワークフロー実行中にツール呼び出しとして直接 API 呼び出しを行うこともできます。`integration` と同様に、追加のランタイム パラメータは `metadata` フィールドから読み込まれます。 + +例えば、 + + ```yaml + name: Example api_call task + tools: + - type: api_call + name: hello + api_call: + method: GET + url: https://httpbin.org/get + main: + - tool: hello + arguments: + params: + test: _.input + ``` ## 統合 @@ -856,6 +901,9 @@ output: result: string # The result of the Brave Search ``` +> [!ヒント] +> **サンプルクックブック**: [cookbooks/03-SmartResearcher_With_WebSearch.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/03-SmartResearcher_With_WebSearch.ipynb) + ### ブラウザベース ```yaml @@ -890,6 +938,9 @@ output: success: boolean # Whether the email was sent successfully ``` +> [!ヒント] +> **サンプルクックブック**: [cookbooks/00-Devfest-Email-Assistant.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/00-Devfest-Email-Assistant.ipynb) + ### スパイダー ```yaml @@ -905,6 +956,9 @@ output: documents: list # The documents returned from the spider ``` +> [!ヒント] +> **サンプルクックブック**: [cookbooks/01-Website_Crawler_using_Spider.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/01-Website_Crawler_using_Spider.ipynb) + ### 天気 ```yaml @@ -918,6 +972,9 @@ output: result: string # The weather data for the specified location ``` +> [!ヒント] +> **サンプルクックブック**: [cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + ### ウィキペディア ```yaml @@ -929,8 +986,87 @@ output: documents: list # The documents returned from the Wikipedia search ``` +> [!ヒント] +> **サンプルクックブック**: [cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb](https://github.com/julep-ai/julep/blob/dev/cookbooks/04-TripPlanner_With_Weather_And_WikiInfo.ipynb) + これらの統合をタスク内で使用して、AI エージェントの機能を拡張できます。ワークフローでこれらの統合を使用する方法の詳細については、[統合ドキュメント](https://docs.julep.ai/integrations)を参照してください。 +## その他の機能 + +Julep は、AI ワークフローを強化するためのさまざまな高度な機能を提供します。 + +### エージェントへのツールの追加 + +外部ツールと API を統合してエージェントの機能を拡張します。 + +```python +client.agents.tools.create( + agent_id=agent.id, + name="web_search", + description="Search the web for information.", + integration={ + "provider": "brave", + "method": "search", + "setup": {"api_key": "your_brave_api_key"}, + }, +) +``` + +### セッションとユーザーの管理 + +Julep は、永続的なインタラクションのための堅牢なセッション管理を提供します。 + +```python +session = client.sessions.create( + agent_id=agent.id, + user_id=user.id, + context_overflow="adaptive" +) + +# Continue conversation in the same session +response = client.sessions.chat( + session_id=session.id, + messages=[ + { + "role": "user", + "content": "Follow up on the previous conversation." + } + ] +) +``` + +### ドキュメントの統合と検索 + +エージェントのドキュメントを簡単に管理および検索できます。 + +```python +# Upload a document +document = client.agents.docs.create( + title="AI advancements", + content="AI is changing the world...", + metadata={"category": "research_paper"} +) + +# Search documents +results = client.agents.docs.search( + text="AI advancements", + metadata_filter={"category": "research_paper"} +) +``` + +## ローカルクイックスタート + +**要件**: +- 最新の docker compose がインストールされている + +**手順**: +1. `git clone https://github.com/julep-ai/julep.git` +2. `cd ジュレップ` +3. `docker volume create cozo_backup` +4. `docker volume create cozo_data` +5. `cp .env.example .env # <-- このファイルを編集します` +6. `docker compose --env-file .env --profile temporal-ui --profile single-tenant --profile self-hosted-db up --build` + ## SDK リファレンス - [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) From ca03414de3689a7aeef3141b3a25e84415885107 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 13 Oct 2024 17:45:15 -0400 Subject: [PATCH 106/113] feat: Add simple deploy compose file Signed-off-by: Diwank Singh Tomer --- README-JP.md | 695 ------------------------------ README.md | 9 +- deploy/simple-docker-compose.yaml | 328 ++++++++++++++ 3 files changed, 331 insertions(+), 701 deletions(-) delete mode 100644 README-JP.md create mode 100644 deploy/simple-docker-compose.yaml diff --git a/README-JP.md b/README-JP.md deleted file mode 100644 index fb3c1dd97..000000000 --- a/README-JP.md +++ /dev/null @@ -1,695 +0,0 @@ -[English](README.md) | [中文翻译](/README-CN.md) | 日本語 - -
- julep -
- -

-
- ドキュメントを探索する - · - Discord - · - 𝕏 - · - LinkedIn -

- - -

- NPM Version -   - PyPI - Version -   - Docker Image Version -   - GitHub License -

- -***** - -> [!TIP] -> 👨‍💻 devfest.aiイベントに参加されましたか?私たちの[Discord](https://discord.com/invite/JTSBGRZrzj)に参加して、以下の詳細をご確認ください。 - -
-🌟 コントリビューターとDevFest.AI参加者の皆様へ: - -## 🌟 コントリビューター募集! - -Julepプロジェクトに新しいコントリビューターを歓迎します!スタートに役立つ「初心者向けの問題」をいくつか作成しました。以下は、貢献する方法です: - -1. [CONTRIBUTING.md](CONTRIBUTING.md)ファイルを確認して、貢献のガイドラインを確認してください。 -2. [初心者向けの問題](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)を閲覧して、興味のあるタスクを見つけてください。 -3. 質問がある場合や助けが必要な場合は、[Discord](https://discord.com/invite/JTSBGRZrzj)チャンネルでお気軽にお問い合わせください。 - -あなたの貢献、大きいものでも小さいものでも、私たちにとっては貴重です。一緒に素晴らしいものを作りましょう!🚀 - -### 🎉 DevFest.AI 2024年10月 - -エキサイティングなニュース!2024年10月中、DevFest.AIに参加します!🗓️ - -- このイベント中にJulepに貢献し、素晴らしいJulepのグッズや景品を獲得するチャンスを得ましょう!🎁 -- 世界中の開発者と一緒にAIリポジトリに貢献し、素晴らしいイベントに参加しましょう。 -- この素晴らしいイニシアチブを組織してくれたDevFest.AIに大きな感謝を! - -> [!TIP] -> 楽しみに参加する準備はできましたか?**[ツイートして参加を開始](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)**し、コーディングを始めましょう!🖥️ - -![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif) - -
- - - -
-

📖 Table of Contents

- -- [紹介](#%E7%B4%B9%E4%BB%8B) -- [特徴](#%E7%89%B9%E5%BE%B4) -- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) -- [クイックスタートガイド](#%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%AC%E3%82%A4%E3%83%89) - - [ステップ1:Julepをインポートする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971julep%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B) - - [ステップ2:エージェントを初期化する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B) - - [ステップ3:エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B) - - [ステップ4:多段階タスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974%E5%A4%9A%E6%AE%B5%E9%9A%8E%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) - - [ステップ5:タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%975%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) -- [概念](#%E6%A6%82%E5%BF%B5) - - [エージェント](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88) - - [ユーザー](#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC) - - [セッション](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3) - - [タスク](#%E3%82%BF%E3%82%B9%E3%82%AF) - - [ツール](#%E3%83%84%E3%83%BC%E3%83%AB) - - [ドキュメント](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88) - - [実行](#%E5%AE%9F%E8%A1%8C) -- [タスクの理解](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E7%90%86%E8%A7%A3) - - [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E) -- [高度な機能](#%E9%AB%98%E5%BA%A6%E3%81%AA%E6%A9%9F%E8%83%BD) - - [エージェントにツールを追加する](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AB%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B) - - [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86) - - [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2) -- [SDKリファレンス](#sdk%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) -- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) -- [例とチュートリアル](#%E4%BE%8B%E3%81%A8%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB) -- [貢献](#%E8%B2%A2%E7%8C%AE) -- [サポートとコミュニティ](#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3) -- [ライセンス](#%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9) -- [謝辞](#%E8%AC%9D%E8%BE%9E) - -
- - -## 紹介 - -Julepは、カスタマイズ可能なワークフローを持つ持続可能なAIエージェントを作成するためのオープンソースプラットフォームです。柔軟性と使いやすさに重点を置いて、AI駆動のアプリケーションを開発、管理、展開するためのツールを提供します。 - -Julepを使用すると、次のことができます: -- 複数のインタラクションにわたってコンテキストと状態を保持するAIエージェントを迅速に開発する -- AIエージェントに合わせた洗練されたワークフローを設計および実行する -- さまざまなツールやAPIをAIワークフローにシームレスに統合する -- 持続的なセッションとユーザーインタラクションを簡単に管理する - -チャットボットの開発、タスクの自動化、または複雑なAIアシスタントの構築を行う場合でも、Julepはアイデアを迅速かつ効率的に現実に変えるために必要な柔軟性と機能を提供します。 - - - -
-ここに簡単なPythonの例があります: - - - -

-from julep import Julep, AsyncJulep
-
-# 🔑 Julepクライアントを初期化する
-#     または、非同期操作のためにAsyncJulepを使用する
-client = Julep(api_key="your_api_key")
-
-##################
-## 🤖 エージェント 🤖 ##
-##################
-
-# 研究エージェントを作成する
-agent = client.agents.create(
-    name="Research Agent",
-    model="claude-3.5-sonnet",
-    about="You are a research agent designed to handle research inquiries.",
-)
-
-# 🔍 エージェントにウェブ検索ツールを追加する
-client.agents.tools.create(
-    agent_id=agent.id,
-    name="web_search",  # Pythonの有効な変数名である必要があります
-    description="Use this tool to research inquiries.",
-    integration={
-        "provider": "brave",
-        "method": "search",
-        "setup": {
-            "api_key": "your_brave_api_key",
-        },
-    },
-)
-
-#################
-## 💬 チャット 💬 ##
-#################
-
-# エージェントとのインタラクティブなチャットセッションを開始する
-session = client.sessions.create(
-    agent_id=agent.id,
-    context_overflow="adaptive",  # 🧠 必要に応じてJulepがコンテキストウィンドウを動的に計算します
-)
-
-# 🔄 チャットループ
-while (user_input := input("You: ")) != "exit":
-    response = client.sessions.chat(
-        session_id=session.id,
-        message=user_input,
-    )
-
-    print("Agent: ", response.choices[0].message.content)
-
-
-#################
-## 📋 タスク 📋 ##
-#################
-
-# エージェントのための定期的な研究タスクを作成する
-task = client.tasks.create(
-    agent_id=agent.id,
-    name="Research Task",
-    description="Research the given topic every 24 hours.",
-    #
-    # 🛠️ タスク固有のツール
-    tools=[
-        {
-            "name": "send_email",
-            "description": "Send an email to the user with the results.",
-            "api_call": {
-                "method": "post",
-                "url": "https://api.sendgrid.com/v3/mail/send",
-                "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
-            },
-        }
-    ],
-    #
-    # 🔢 タスクの主なステップ
-    main=[
-        #
-        # ステップ1:トピックを調査する
-        {
-            # `_`(アンダースコア)変数は前のステップの出力を指します
-            # ここでは、ユーザーからのトピック入力を指します
-            "prompt": "Look up topic '{{_.topic}}' and summarize the results.",
-            "tools": [{"ref": {"name": "web_search"}}],  # 🔍 エージェントのウェブ検索ツールを使用する
-            "unwrap": True,
-        },
-        #
-        # ステップ2:研究結果を含むメールを送信する
-        {
-            "tool": "send_email",
-            "arguments": {
-                "subject": "Research Results",
-                "body": "'Here are the research results for today: ' + _.content",
-                "to": "inputs[0].email",  # ユーザーの入力からメールを参照する
-            },
-        },
-        #
-        # ステップ3:繰り返す前に24時間待つ
-        {"sleep": "24 * 60 * 60"},
-    ],
-)
-
-# 🚀 定期的なタスクを開始する
-client.executions.create(task_id=task.id, input={"topic": "Python"})
-
-# 🔁 これにより、タスクは24時間ごとに実行され、
-#    "Python"のトピックを調査し、
-#    結果をユーザーのメールに送信します
-
-
- - -## 特徴 - -Julepは、カスタマイズ可能なワークフローを持つ持続可能なAIエージェントの構築プロセスを簡素化します。主な特徴は次のとおりです: - -- **持続可能なAIエージェント**:複数のインタラクションにわたってコンテキストを保持するAIエージェントを作成および管理します。 -- **カスタマイズ可能なワークフロー**:タスクを使用して複雑な多段階のAIワークフローを設計します。 -- **ツール統合**:さまざまなツールやAPIをAIワークフローにシームレスに統合します。 -- **ドキュメント管理**:エージェントのためのドキュメントを効率的に管理および検索します。 -- **セッション管理**:継続的なインタラクションのための持続的なセッションを処理します。 -- **柔軟な実行**:ワークフローでの並行処理、条件ロジック、およびエラー処理をサポートします。 - -## インストール - -Julepを始めるには、[npm](https://www.npmjs.com/package/@julep/sdk)または[pip](https://pypi.org/project/julep/)を使用してインストールします: - -```bash -npm install @julep/sdk -``` - -または - -```bash -pip install julep -``` - -> [!TIP] -> ~~APIキーを[こちら](https://app.julep.ai/api-keys)から取得してください。~~ -> -> ベータ版の間、APIキーを取得するには[Discord](https://discord.com/invite/JTSBGRZrzj)でお問い合わせください。 - -## クイックスタートガイド - -### ステップ1:Julepをインポートする - -まず、Julep SDKをプロジェクトにインポートします: - -```javascript -const Julep = require('@julep/sdk'); -``` - -または - -```python -from julep import AsyncJulep -``` - -### ステップ2:エージェントを初期化する - -基本設定で新しいエージェントを作成します: - -```javascript -const julep = new Julep({ apiKey: 'your-api-key' }); - -const agent = await julep.agents.create({ - name: 'ResearchAssistant', - model: 'gpt-4-turbo', - about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", -}); -``` - -または - -```python -client = AsyncJulep(api_key="your_api_key") - -agent = await client.agents.create( - name="Storytelling Agent", - model="gpt-4-turbo", - about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.", -) -``` - -### ステップ3:エージェントとチャットする - -エージェントとのインタラクティブなチャットセッションを開始します: - -```javascript -const session = await julep.sessions.create({ - agentId: agent.id, -}); - -// エージェントにメッセージを送信する -const response = await julep.sessions.chat({ - sessionId: session.id, - message: 'Hello, can you tell me a story?', -}); - -console.log(response); -``` - -または - -```python -session = await client.sessions.create(agent_id=agent.id) - -# エージェントにメッセージを送信する -response = await client.sessions.chat( - session_id=session.id, - message="Hello, can you tell me a story?", -) - -print(response) -``` - - -### ステップ4:多段階タスクを作成する - -入力されたアイデアに基づいてストーリーを作成し、パネル化されたコミックストリップを生成する多段階タスクを定義しましょう: - -```python -# 🛠️ エージェントに画像生成ツール(DALL·E)を追加する -await client.agents.tools.create( - agent_id=agent.id, - name="image_generator", - description="Use this tool to generate images based on descriptions.", - integration={ - "provider": "dalle", - "method": "generate_image", - "setup": { - "api_key": "your_dalle_api_key", - }, - }, -) - -# 📋 タスク -# アイデアを受け取り、ストーリーと4コマ漫画を作成するタスクを作成する -task = await client.tasks.create( - agent_id=agent.id, - name="Story and Comic Creator", - description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.", - main=[ - # ステップ1:ストーリーを生成し、4つのパネルに要約する - { - "prompt": [ - { - "role": "system", - "content": "You are {{agent.name}}. {{agent.about}}" - }, - { - "role": "user", - "content": ( - "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. " - "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story." - ), - }, - ], - "unwrap": True, - }, - # ステップ2:パネルの説明とストーリーを抽出する - { - "evaluate": { - "story": "_.split('1. ')[0].strip()", - "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)", - } - }, - # ステップ3:画像生成ツールを使用して各パネルの画像を生成する - { - "foreach": { - "in": "_.panels", - "do": { - "tool": "image_generator", - "arguments": { - "description": "_", - }, - }, - }, - }, - # ステップ4:ストーリーのキャッチーなタイトルを生成する - { - "prompt": [ - { - "role": "system", - "content": "You are {{agent.name}}. {{agent.about}}" - }, - { - "role": "user", - "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}", - }, - ], - "unwrap": True, - }, - # ステップ5:ストーリー、生成された画像、およびタイトルを返す - { - "return": { - "title": "outputs[3]", - "story": "outputs[1].story", - "comic_panels": "[output.image.url for output in outputs[2]]", - } - }, - ], -) -``` - -> [!TIP] -> これのnode.jsバージョンは似ています。 - -### ステップ5:タスクを実行する - -```python -# 🚀 アイデアを入力してタスクを実行する -execution = await client.executions.create( - task_id=task.id, - input={"idea": "A cat who learns to fly"} -) - -# 🎉 ストーリーとコミックパネルが生成される様子を見守る -await client.executions.stream(execution_id=execution.id) -``` - -この例は、カスタムツールを持つエージェントを作成し、複数のステップを持つ複雑なタスクを定義し、それを実行してクリエイティブな出力を生成する方法を示しています。 - - - -> [!TIP] -> もう一つのnode.jsの例は[こちら](example.ts)またはpythonの例は[こちら](example.py)にあります。 - -## 概念 - -Julepは、強力なAIワークフローを作成するために連携するいくつかの主要な技術コンポーネントに基づいて構築されています: - -### エージェント -タスクを実行し、ユーザーと対話する大規模な言語モデル(LLM)に支えられたAIエンティティ。エージェントはJulepのコア機能ユニットです。 - -```mermaid -graph TD - Agent[Agent] --> LLM[Large Language Model] - Agent --> Tasks[Tasks] - Agent --> Users[Users] - Tasks --> Tools[Tools] -``` - -### ユーザー -エージェントと対話するエンティティ。ユーザーはセッションに関連付けられ、独自のメタデータを持つことができ、個別の対話が可能になります。 - -```mermaid -graph LR - User[User] --> Sessions[Sessions] - Sessions --> Agents[Agents] - Sessions --> Metadata[Metadata] -``` - -### セッション -エージェントとユーザーの間の有状態の対話。セッションは複数の交換にわたってコンテキストを保持し、コンテキスト管理やオーバーフロー処理などの異なる動作に対して構成できます。 - -```mermaid -graph LR - Sessions[Sessions] --> Agents[Agents] - Sessions --> Users[Users] - Sessions --> ContextManagement[Context Management] - Sessions --> OverflowHandling[Overflow Handling] -``` - -### タスク -エージェントが実行できる多段階のプログラムワークフロー。タスクは複雑な操作を定義し、プロンプト、ツール呼び出し、条件ロジックなどのさまざまなタイプのステップを含むことができます。 - -```mermaid -graph TD - Tasks[Tasks] --> Steps[Workflow Steps] - Steps --> Prompt[Prompt] - Steps --> ToolCalls[Tool Calls] - Steps --> ConditionalLogic[Conditional Logic] -``` - -### ツール -エージェントの能力を拡張する統合。ツールはユーザー定義の関数、システムツール、またはサードパーティのAPI統合である可能性があります。これにより、エージェントはテキスト生成を超えたアクションを実行できます。 - -```mermaid -graph LR - Tools[Tools] --> UserDefinedFunctions[User-Defined Functions] - Tools --> SystemTools[System Tools] - Tools --> ThirdPartyAPIs[Third-Party APIs] -``` - -### ドキュメント -エージェントまたはユーザーに関連付けることができるテキストまたはデータオブジェクト。ドキュメントはベクトル化され、エージェントの対話中にセマンティック検索と取得を可能にするベクトルデータベースに保存されます。 - -```mermaid -graph LR - Documents[Documents] --> VectorDatabase[Vector Database] - Documents --> SemanticSearch[Semantic Search] - Documents --> AgentsOrUsers[Agents or Users] -``` - -### 実行 -特定の入力で開始されたタスクのインスタンス。実行には独自のライフサイクルと状態マシンがあり、長時間実行されるプロセスの監視、管理、および再開が可能です。 - -```mermaid -graph LR - Executions[Executions] --> Tasks[Tasks] - Executions --> Lifecycle[Lifecycle] - Executions --> Monitoring[Monitoring] - Executions --> Management[Management] - Executions --> Resumption[Resumption] -``` - -これらの概念とその相互作用の詳細な説明については、[概念ドキュメント](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)を参照してください。 - -## タスクの理解 - -タスクはJulepのワークフローシステムのコアです。これにより、エージェントが実行できる複雑な多段階のAIワークフローを定義できます。タスクコンポーネントの概要は次のとおりです: - -- **名前と説明**:各タスクには、簡単に識別できるように一意の名前と説明があります。 -- **主要なステップ**:タスクのコアであり、実行されるアクションのシーケンスを定義します。 -- **ツール**:タスク実行中にエージェントの能力を拡張するオプションの統合。 - -### ワークフローステップの種類 - -Julepのタスクには、さまざまな種類のステップを含めることができます: - -1. **プロンプト**:AIモデルにメッセージを送信し、応答を受け取ります。 - ```python - {"prompt": "Analyze the following data: {{data}}"} - ``` - -2. **ツール呼び出し**:統合されたツールまたはAPIを実行します。 - ```python - {"tool": "web_search", "arguments": {"query": "Latest AI developments"}} - ``` - -3. **評価**:計算を実行するか、データを操作します。 - ```python - {"evaluate": {"average_score": "sum(scores) / len(scores)"}} - ``` - -4. **条件ロジック**:条件に基づいてステップを実行します。 - ```python - {"if": "score > 0.8", "then": [...], "else": [...]} - ``` - -5. **ループ**:データを反復処理するか、ステップを繰り返します。 - ```python - {"foreach": {"in": "data_list", "do": [...]}} - ``` - -| ステップ名 | 説明 | 入力 | -|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------| -| **プロンプト** | AIモデルにメッセージを送信し、応答を受け取ります。 | プロンプトテキストまたはテンプレート | -| **ツール呼び出し** | 統合されたツールまたはAPIを実行します。 | ツール名と引数 | -| **評価** | 計算を実行するか、データを操作します。 | 評価する式または変数 | -| **入力待ち** | 入力が受信されるまでワークフローを一時停止します。 | 必要なユーザーまたはシステム入力 | -| **ログ** | 指定された値またはメッセージを記録します。 | 記録するメッセージまたは値 | -| **埋め込み** | テキストを特定の形式またはシステムに埋め込みます。 | 埋め込むテキストまたはコンテンツ | -| **検索** | クエリに基づいてドキュメント検索を実行します。 | 検索クエリ | -| **取得** | キー値ストアから値を取得します。 | キー識別子 | -| **設定** | キー値ストアのキーに値を割り当てます。 | 割り当てるキーと値 | -| **並列** | 複数のステップを並行して実行します。 | 同時に実行するステップのリスト | -| **反復** | コレクションを反復処理し、各アイテムに対してステップを実行します。 | 反復するコレクションまたはリスト | -| **マップリデュース** | コレクションをマップし、式に基づいて結果をリデュースします。 | マップおよびリデュースするコレクションと式 | -| **条件分岐** | 条件に基づいてステップを実行します。 | 評価する条件 | -| **スイッチ** | 複数の条件に基づいてステップを実行します。スイッチケース文に似ています。 | 複数の条件と対応するステップ | -| **生成** | サブワークフローを実行し、その完了を待ちます。 | サブワークフロー識別子と入力データ | -| **エラー** | エラーメッセージを指定してエラーを処理します。 | エラーメッセージまたは処理指示 | -| **スリープ** | 指定された期間ワークフローを一時停止します。 | 期間(秒、分など) | -| **リターン** | ワークフローから値を返します。 | 返す値 | - -各ステップタイプの詳細情報と高度な使用法については、[タスクドキュメント](https://docs.julep.ai/tasks)を参照してください。 - -## 高度な機能 - -Julepは、AIワークフローを強化するための高度な機能を提供します: - -### エージェントにツールを追加する - -外部ツールやAPIを統合してエージェントの能力を拡張します: - -```python -client.agents.tools.create( - agent_id=agent.id, - name="web_search", - description="Search the web for information.", - integration={ - "provider": "brave", - "method": "search", - "setup": {"api_key": "your_brave_api_key"}, - }, -) -``` - -### セッションとユーザーの管理 - -Julepは、持続的なインタラクションのための強力なセッション管理を提供します: - -```python -session = client.sessions.create( - agent_id=agent.id, - user_id=user.id, - context_overflow="adaptive" -) - -# 同じセッションで会話を続ける -response = client.sessions.chat( - session_id=session.id, - messages=[ - { - "role": "user", - "content": "Follow up on our previous conversation." - } - ] -) -``` - -### ドキュメントの統合と検索 - -エージェントのためのドキュメントを簡単に管理および検索します: - -```python -# ドキュメントをアップロードする -document = client.agents.docs.create( - title="AI advancements", - content="AI is changing the world...", - metadata={"category": "research_paper"} -) - -# ドキュメントを検索する -results = client.agents.docs.search( - text="AI advancements", - metadata_filter={"category": "research_paper"} -) -``` - -高度な機能と詳細な使用法については、[高度な機能ドキュメント](https://docs.julep.ai/advanced-features)を参照してください。 - -## SDKリファレンス - -- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md) -- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md) - -## APIリファレンス - -エージェント、タスク、および実行について詳しく学ぶために、包括的なAPIドキュメントを探索してください: - -- [エージェントAPI](https://api.julep.ai/api/docs#tag/agents) -- [タスクAPI](https://api.julep.ai/api/docs#tag/tasks) -- [実行API](https://api.julep.ai/api/docs#tag/executions) - -## 例とチュートリアル - -提供された例を基にして始めるのに役立つ例のプロジェクトとチュートリアルを見つけてください: - -- [例のプロジェクト](https://github.com/julep-ai/julep/tree/main/examples) -- [チュートリアル](https://docs.julep.ai/tutorials) - -## 貢献 - -プロジェクトへの貢献を歓迎します!貢献方法と行動規範を学びましょう: - -- [貢献ガイドライン](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md) -- [行動規範](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md) - -## サポートとコミュニティ - -コミュニティに参加して、助けを得たり、質問したり、アイデアを共有したりしましょう: - -- [Discord](https://discord.com/invite/JTSBGRZrzj) -- [GitHub Discussions](https://github.com/julep-ai/julep/discussions) -- [Twitter](https://twitter.com/julep_ai) - -## ライセンス - -このプロジェクトは[Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE)の下でライセンスされています。 - -## 謝辞 - -貴重なリソースと貢献を提供してくれたすべての貢献者とオープンソースコミュニティに感謝します。 diff --git a/README.md b/README.md index 0e4b36635..2b9e69dc5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) +[English](README.md) | [中文翻译](README-CN.md) | [日本語翻訳](README-JA.md) | [French](README-FR.md)
julep @@ -30,6 +30,8 @@ > [!NOTE] > 👨‍💻 Here for the devfest.ai event ? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below. +> +> Get your API key [here](https://dashboard-dev.julep.ai).
🌟 Contributors and DevFest.AI Participants (Click to expand) @@ -55,11 +57,6 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓 > [!TIP] > Ready to join the fun? **[Tweet that you are participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️ -> [!NOTE] -> Get your API key [here](https://dashboard-dev.julep.ai). -> -> While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key. - ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
diff --git a/deploy/simple-docker-compose.yaml b/deploy/simple-docker-compose.yaml new file mode 100644 index 000000000..8b6093e9a --- /dev/null +++ b/deploy/simple-docker-compose.yaml @@ -0,0 +1,328 @@ +name: julep + +services: + agents-api: + depends_on: + worker: + condition: service_started + required: true + environment: + AGENTS_API_HOSTNAME: localhost + AGENTS_API_KEY: ${AGENTS_API_KEY} + AGENTS_API_KEY_HEADER_NAME: Authorization + AGENTS_API_PROTOCOL: http + AGENTS_API_PUBLIC_PORT: "80" + AGENTS_API_URL: http://agents-api:8080 + COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN} + COZO_HOST: http://memory-store:9070 + EMBEDDING_MODEL_ID: voyage/voyage-3 + INTEGRATION_SERVICE_URL: http://integrations:8000 + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} + LITELLM_URL: http://litellm:4000 + SUMMARIZATION_MODEL_NAME: gpt-4o-mini + TEMPORAL_ENDPOINT: temporal:7233 + TEMPORAL_NAMESPACE: default + TEMPORAL_TASK_QUEUE: julep-task-queue + TEMPORAL_WORKER_URL: temporal:7233 + TRUNCATE_EMBED_TEXT: "True" + WORKER_URL: temporal:7233 + image: julepai/agents-api:${TAG:-1.0} + networks: + default: null + ports: + - mode: ingress + target: 8080 + published: "8080" + protocol: tcp + + cozo-migrate: + environment: + AGENTS_API_HOSTNAME: localhost + AGENTS_API_KEY: ${AGENTS_API_KEY} + AGENTS_API_KEY_HEADER_NAME: Authorization + AGENTS_API_PROTOCOL: http + AGENTS_API_PUBLIC_PORT: "80" + AGENTS_API_URL: http://agents-api:8080 + COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN} + COZO_HOST: http://memory-store:9070 + EMBEDDING_MODEL_ID: voyage/voyage-3 + INTEGRATION_SERVICE_URL: http://integrations:8000 + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} + LITELLM_URL: http://litellm:4000 + SUMMARIZATION_MODEL_NAME: gpt-4o-mini + TEMPORAL_ENDPOINT: temporal:7233 + TEMPORAL_NAMESPACE: default + TEMPORAL_TASK_QUEUE: julep-task-queue + TEMPORAL_WORKER_URL: temporal:7233 + TRUNCATE_EMBED_TEXT: "True" + WORKER_URL: temporal:7233 + image: julepai/cozo-migrate:${TAG:-1.0} + networks: + default: null + restart: "no" + + integrations: + environment: + OPENAI_API_KEY: ${OPENAI_API_KEY} + networks: + default: null + ports: + - mode: ingress + target: 8000 + published: "8000" + protocol: tcp + + litellm: + command: + - --config + - /app/config.yaml + - --port + - "4000" + - --num_workers + - "8" + - --telemetry + - "False" + depends_on: + litellm-db: + condition: service_started + required: true + litellm-redis: + condition: service_started + required: true + environment: + ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY} + CLOUDFLARE_ACCOUNT_ID: ${CLOUDFLARE_ACCOUNT_ID} + CLOUDFLARE_API_KEY: ${CLOUDFLARE_API_KEY} + DATABASE_URL: ${DATABASE_URL} + GITHUB_API_KEY: ${GITHUB_API_KEY} + GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS} + GROQ_API_KEY: ${GROQ_API_KEY} + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} + NVIDIA_NIM_API_KEY: ${NVIDIA_NIM_API_KEY} + OPENAI_API_KEY: ${OPENAI_API_KEY} + REDIS_URL: redis://default:${REDIS_PASSWORD:-redis}@litellm-redis:6379 + VOYAGE_API_KEY: ${VOYAGE_API_KEY} + hostname: litellm + image: ghcr.io/berriai/litellm-database:main-v1.46.6 + networks: + default: null + restart: unless-stopped + volumes: + - type: bind + source: ./llm-proxy/litellm-config.yaml + target: /app/config.yaml + bind: + create_host_path: true + - type: bind + source: ./llm-proxy/.keys + target: /app/.keys + read_only: true + bind: + create_host_path: true + + litellm-db: + environment: + POSTGRES_DB: ${LITELM_POSTGRES_DB:-litellm} + POSTGRES_PASSWORD: ${LITELM_POSTGRES_PASSWORD:-postgres} + POSTGRES_USER: ${LITELM_POSTGRES_USER:-llmproxy} + healthcheck: + test: + - CMD-SHELL + - pg_isready -d ${LITELM_POSTGRES_DB:-litellm} -U ${LITELM_POSTGRES_USER:-llmproxy} + timeout: 5s + interval: 1s + retries: 10 + image: postgres:16 + networks: + default: null + restart: unless-stopped + volumes: + - type: volume + source: litellm-db-data + target: /var/lib/postgresql/data + volume: {} + + litellm-redis: + environment: + REDIS_ARGS: --requirepass ${REDIS_PASSWORD:-redis} + image: redis/redis-stack-server + networks: + default: null + restart: unless-stopped + volumes: + - type: volume + source: litellm-redis-data + target: /data + volume: {} + + memory-store: + environment: + COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN} + COZO_BACKUP_DIR: /backup + COZO_MNT_DIR: /data + COZO_PORT: "9070" + image: julepai/memory-store:${TAG:-1.0} + labels: + ofelia.enabled: "true" + ofelia.job-exec.backupcron.command: bash /app/backup.sh + ofelia.job-exec.backupcron.environment: '["COZO_PORT=9070", "COZO_AUTH_TOKEN=${COZO_AUTH_TOKEN}", "COZO_BACKUP_DIR=/backup"]' + ofelia.job-exec.backupcron.schedule: '@every 3h' + networks: + default: null + ports: + - mode: ingress + target: 9070 + published: "9070" + protocol: tcp + volumes: + - type: volume + source: cozo_data + target: /data + volume: {} + - type: volume + source: cozo_backup + target: /backup + volume: {} + + memory-store-backup-cron: + command: + - daemon + - --docker + - -f + - label=com.docker.compose.project=julep + depends_on: + memory-store: + condition: service_started + required: true + image: mcuadros/ofelia:latest + networks: + default: null + restart: unless-stopped + volumes: + - type: bind + source: /var/run/docker.sock + target: /var/run/docker.sock + read_only: true + bind: + create_host_path: true + + temporal: + depends_on: + temporal-db: + condition: service_started + required: true + environment: + DB: postgres12 + DB_HOST: temporal-db + DB_PORT: "5432" + DYNAMIC_CONFIG_FILE_PATH: config/dynamicconfig/temporal-postgres.yaml + LOG_LEVEL: info + POSTGRES_DB: ${TEMPORAL_POSTGRES_DB:-temporal} + POSTGRES_PWD: ${TEMPORAL_POSTGRES_PASSWORD:-temporal} + POSTGRES_SEEDS: temporal-db + POSTGRES_TLS_CA_FILE: /cert/ca.crt + POSTGRES_TLS_DISABLE_HOST_VERIFICATION: "false" + POSTGRES_TLS_ENABLED: "false" + POSTGRES_USER: ${TEMPORAL_POSTGRES_USER:-temporal} + SKIP_DB_CREATE: "false" + SKIP_SCHEMA_SETUP: "false" + SQL_CA: /cert/ca.crt + SQL_TLS_ENABLED: "false" + TEMPORAL_ADDRESS: temporal:7233 + VISIBILITY_DBNAME: temporal_visibility + hostname: temporal + image: temporalio/auto-setup:1.25 + networks: + default: null + volumes: + - type: bind + source: ./scheduler/dynamicconfig + target: /etc/temporal/config/dynamicconfig + bind: + create_host_path: true + - type: bind + source: ./scheduler/cert + target: /cert + bind: + create_host_path: true + + temporal-db: + environment: + POSTGRES_DB: ${TEMPORAL_POSTGRES_DB:-temporal} + POSTGRES_PASSWORD: ${TEMPORAL_POSTGRES_PASSWORD:-temporal} + POSTGRES_USER: ${TEMPORAL_POSTGRES_USER:-temporal} + healthcheck: + test: + - CMD-SHELL + - pg_isready -d ${TEMPORAL_POSTGRES_DB:-temporal} -U ${TEMPORAL_POSTGRES_USER:-temporal} + timeout: 5s + interval: 1s + retries: 10 + image: postgres:16 + networks: + default: null + restart: unless-stopped + volumes: + - type: volume + source: temporal-db-data + target: /var/lib/postgresql/data + volume: {} + + temporal-ui: + environment: + TEMPORAL_ADDRESS: temporal:7233 + TEMPORAL_CODEC_ENDPOINT: http://localhost/api/temporal + TEMPORAL_CSRF_COOKIE_INSECURE: "true" + TEMPORAL_FEEDBACK_URL: https://github.com/julep-ai/julep + TEMPORAL_NOTIFY_ON_NEW_VERSION: "false" + TEMPORAL_OPEN_API_ENABLED: "true" + TEMPORAL_UI_ENABLED: "true" + image: temporalio/ui:latest + networks: + default: null + ports: + - mode: ingress + target: 8080 + published: "9000" + protocol: tcp + + worker: + environment: + AGENTS_API_HOSTNAME: localhost + AGENTS_API_KEY: ${AGENTS_API_KEY} + AGENTS_API_KEY_HEADER_NAME: Authorization + AGENTS_API_PROTOCOL: http + AGENTS_API_PUBLIC_PORT: "80" + AGENTS_API_URL: http://agents-api:8080 + COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN} + COZO_HOST: http://memory-store:9070 + EMBEDDING_MODEL_ID: voyage/voyage-3 + INTEGRATION_SERVICE_URL: http://integrations:8000 + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} + LITELLM_URL: http://litellm:4000 + SUMMARIZATION_MODEL_NAME: gpt-4o-mini + TEMPORAL_ENDPOINT: temporal:7233 + TEMPORAL_NAMESPACE: default + TEMPORAL_TASK_QUEUE: julep-task-queue + TEMPORAL_WORKER_URL: temporal:7233 + TRUNCATE_EMBED_TEXT: "True" + WORKER_URL: temporal:7233 + image: julepai/worker:${TAG:-1.0} + networks: + default: null + +networks: + default: + name: julep_default + +volumes: + cozo_backup: + name: cozo_backup + cozo_data: + name: cozo_data + litellm-db-data: + name: julep_litellm-db-data + litellm-redis-data: + name: julep_litellm-redis-data + temporal-db-data: + name: julep_temporal-db-data From 0ac6dc8786ead6a15a8134b9b9b7e08b85da44d0 Mon Sep 17 00:00:00 2001 From: creatorrr Date: Sun, 13 Oct 2024 21:45:34 +0000 Subject: [PATCH 107/113] chore(docs): update TOC --- README-CN.md | 76 ++++++++++++++++++++-------------------------- README-FR.md | 82 +++++++++++++++++++++++++------------------------- README-JA.md | 85 +++++++++++++++++++++++++--------------------------- 3 files changed, 114 insertions(+), 129 deletions(-) diff --git a/README-CN.md b/README-CN.md index d4a70f67d..b765f4af9 100644 --- a/README-CN.md +++ b/README-CN.md @@ -67,50 +67,38 @@
-

📖 目录

- -- [简介](#introduction) -- [快速示例](#quick-example) -- [主要特点](#key-features) -- [为什么选择 Julep 而不是 LangChain?](#why-julep-vs-langchain) -- [不同用例](#different-use-cases) -- [不同的外形尺寸](#different-form-factor) -- [总结](#in-summary) -- [安装](#安装) -- [Python 快速入门 🐍](#python-quick-start-) -- [步骤 1:创建代理](#step-1-create-an-agent) -- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip) -- [步骤 3:执行任务](#step-3-execute-the-task) -- [步骤 4:与代理聊天](#step-4-chat-with-the-agent) -- [Node.js 快速入门🟩](#nodejs-quick-start-) -- [步骤 1:创建代理](#step-1-create-an-agent-1) -- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) -- [步骤 3:执行任务](#step-3-execute-the-task-1) -- [步骤 4:与代理聊天](#step-4-chat-with-the-agent-1) -- [组件](#components) -- [心智模型](#mental-model) -- [概念](#concepts) -- [理解任务](#understanding-tasks) -- [工作流步骤的类型](#types-of-workflow-steps) -- [工具类型](#tool-types) -- [用户定义的函数](#user-defined-functions) -- [`系统` 工具](#system-tools) -- [内置集成](#built-in-integrations) -- [直接 `api_call`](#direct-api_calls) -- [集成](#integrations) -- [勇敢搜索](#brave-search) -- [BrowserBase](#browserbase) -- [电子邮件](#email) -- [蜘蛛](#蜘蛛) -- [天气](#天气) -- [维基百科](#wikipedia) -- [其他功能](#other-features) -- [向代理添加工具](#adding-tools-to-agents) -- [管理会话和用户](#managing-sessions-and-users) -- [文档集成与搜索](#document-integration-and-search) -- [本地快速启动](#local-quickstart) -- [SDK 参考](#sdk-reference) -- [API 参考](#api-reference) +

📖 Table of Contents

+ +- [为什么选择 Julep 而不是 LangChain?](#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9-julep-%E8%80%8C%E4%B8%8D%E6%98%AF-langchain) + - [不同的用例](#%E4%B8%8D%E5%90%8C%E7%9A%84%E7%94%A8%E4%BE%8B) + - [不同的外形尺寸](#%E4%B8%8D%E5%90%8C%E7%9A%84%E5%A4%96%E5%BD%A2%E5%B0%BA%E5%AF%B8) +- [Python 快速入门🐍](#python-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8) + - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86) + - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1) + - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1) + - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9) +- [Node.js 快速入门 🟩](#nodejs-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8-) + - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86-1) + - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1-1) + - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1-1) + - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9-1) + - [心智模型](#%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B) +- [概念](#%E6%A6%82%E5%BF%B5) +- [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1) + - [工作流步骤的类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%9A%84%E7%B1%BB%E5%9E%8B) +- [工具类型](#%E5%B7%A5%E5%85%B7%E7%B1%BB%E5%9E%8B) + - [用户定义的函数](#%E7%94%A8%E6%88%B7%E5%AE%9A%E4%B9%89%E7%9A%84%E5%87%BD%E6%95%B0) + - [`系统` 工具](#%E7%B3%BB%E7%BB%9F-%E5%B7%A5%E5%85%B7) + - [内置“集成”](#%E5%86%85%E7%BD%AE%E9%9B%86%E6%88%90) + - [直接 `api_call`](#%E7%9B%B4%E6%8E%A5-api_call) +- [集成](#%E9%9B%86%E6%88%90) + - [勇敢搜索](#%E5%8B%87%E6%95%A2%E6%90%9C%E7%B4%A2) + - [浏览器基础](#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9F%BA%E7%A1%80) + - [向代理添加工具](#%E5%90%91%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7) + - [管理会话和用户](#%E7%AE%A1%E7%90%86%E4%BC%9A%E8%AF%9D%E5%92%8C%E7%94%A8%E6%88%B7) + - [文档集成与搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E4%B8%8E%E6%90%9C%E7%B4%A2) +- [本地快速启动](#%E6%9C%AC%E5%9C%B0%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8) +- [SDK 参考](#sdk-%E5%8F%82%E8%80%83)
diff --git a/README-FR.md b/README-FR.md index 8ec14de75..9708f992e 100644 --- a/README-FR.md +++ b/README-FR.md @@ -67,50 +67,50 @@ Des nouvelles passionnantes ! Nous participons au DevFest.AI tout au long du moi
-

📖 Table des matières

- -- [Présentation](#introduction) -- [Exemple rapide](#quick-example) -- [Caractéristiques principales](#key-features) -- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain) -- [Différents cas d'utilisation](#different-use-cases) -- [Facteur de forme différent](#different-form-factor) -- [En résumé](#en-resumé) +

📖 Table of Contents

+ +- [Introduction](#introduction) +- [Exemple rapide](#exemple-rapide) +- [Principales caractéristiques](#principales-caract%C3%A9ristiques) +- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain%C2%A0) + - [Différents cas d'utilisation](#diff%C3%A9rents-cas-dutilisation) + - [Facteur de forme différent](#facteur-de-forme-diff%C3%A9rent) + - [En résumé](#en-r%C3%A9sum%C3%A9) - [Installation](#installation) -- [Démarrage rapide de Python 🐍](#python-quick-start-) -- [Étape 1 : Créer un agent](#step-1-create-an-agent) -- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip) -- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task) -- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent) -- [Démarrage rapide de Node.js 🟩](#nodejs-quick-start-) -- [Étape 1 : Créer un agent](#step-1-create-an-agent-1) -- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) -- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task-1) -- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent-1) +- [Démarrage rapide de Python 🐍](#d%C3%A9marrage-rapide-de-python-) + - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent) + - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e) + - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che) + - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent) +- [Démarrage rapide de Node.js 🟩](#d%C3%A9marrage-rapide-de-nodejs-) + - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent-1) + - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e-1) + - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che-1) + - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent-1) - [Composants](#composants) -- [Modèle mental](#mental-model) + - [Modèle mental](#mod%C3%A8le-mental) - [Concepts](#concepts) -- [Comprendre les tâches](#understanding-tasks) -- [Types d'étapes de flux de travail](#types-of-workflow-steps) -- [Types d'outils](#types-d'outils) -- [Fonctions définies par l'utilisateur](#user-defined-functions) -- [outils système](#outils-système) -- [Intégrations intégrées](#integrations-integrées) -- [Appels directs d'API](#appels directs d'API) -- [Intégrations](#intégrations) -- [Recherche courageuse](#brave-search) -- [Base du navigateur](#basedunavigateur) -- [Courriel](#courriel) -- [Araignée](#araignée) -- [Météo](#météo) -- [Wikipédia](#wikipédia) -- [Autres fonctionnalités](#other-features) -- [Ajout d'outils aux agents](#adding-tools-to-agents) -- [Gestion des sessions et des utilisateurs](#managing-sessions-and-users) -- [Intégration et recherche de documents](#document-integration-and-search) -- [Démarrage rapide local](#local-quickstart) -- [Référence SDK](#sdk-reference) -- [Référence API](#api-reference) +- [Comprendre les tâches](#comprendre-les-t%C3%A2ches) + - [Types d'étapes de flux de travail](#types-d%C3%A9tapes-de-flux-de-travail) +- [Types d'outils](#types-doutils) + - [Fonctions définies par l'utilisateur](#fonctions-d%C3%A9finies-par-lutilisateur) + - [outils `système`](#outils-syst%C3%A8me) + - [Intégrations intégrées](#int%C3%A9grations-int%C3%A9gr%C3%A9es) + - [Appels directs `api_call`](#appels-directs-api_call) +- [Intégrations](#int%C3%A9grations) + - [Recherche courageuse](#recherche-courageuse) + - [Base de navigateur](#base-de-navigateur) + - [E-mail](#e-mail) + - [Araignée](#araign%C3%A9e) + - [Météo](#m%C3%A9t%C3%A9o) + - [Wikipédia](#wikip%C3%A9dia) +- [Autres fonctionnalités](#autres-fonctionnalit%C3%A9s) + - [Ajout d'outils aux agents](#ajout-doutils-aux-agents) + - [Gestion des sessions et des utilisateurs](#gestion-des-sessions-et-des-utilisateurs) + - [Intégration et recherche de documents](#int%C3%A9gration-et-recherche-de-documents) +- [Démarrage rapide local](#d%C3%A9marrage-rapide-local) +- [Référence du SDK](#r%C3%A9f%C3%A9rence-du-sdk) +- [Référence API](#r%C3%A9f%C3%A9rence-api)
diff --git a/README-JA.md b/README-JA.md index 20d3707cc..5a65e7b7e 100644 --- a/README-JA.md +++ b/README-JA.md @@ -67,50 +67,47 @@ Julep プロジェクトに新しい貢献者を迎えられることを嬉し
-

📖 目次

- -- [はじめに](#introduction) -- [簡単な例](#quick-example) -- [主な機能](#key-features) -- [なぜ Julep と LangChain を比較するのか?](#why-julep-vs-langchain) -- [さまざまなユースケース](#different-use-cases) -- [異なるフォームファクター](#different-form-factor) -- [要約](#in-summary) -- [インストール](#installation) -- [Python クイックスタート 🐍](#python-quick-start-) -- [ステップ 1: エージェントを作成する](#step-1-create-an-agent) -- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip) -- [ステップ 3: タスクを実行する](#step-3-execute-the-task) -- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent) -- [Node.js クイック スタート 🟩](#nodejs-quick-start-) -- [ステップ 1: エージェントを作成する](#step-1-create-an-agent-1) -- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) -- [ステップ 3: タスクを実行する](#step-3-execute-the-task-1) -- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent-1) -- [コンポーネント](#components) -- [メンタルモデル](#mental-model) -- [コンセプト](#concepts) -- [タスクの理解](#understanding-tasks) -- [ワークフロー ステップの種類](#types-of-workflow-steps) -- [ツールの種類](#tool-types) -- [ユーザー定義の `function`](#user-defined-functions) -- [`システム` ツール](#system-tools) -- [組み込みの `integration`s](#built-in-integrations) -- [直接の `api_call`](#direct-api_calls) -- [統合](#integrations) -- [勇敢な検索](#brave-search) -- [ブラウザベース](#browserbase) -- [メールアドレス](#email) -- [スパイダー](#spider) -- [天気](#weather) -- [ウィキペディア](#wikipedia) -- [その他の機能](#other-features) -- [エージェントへのツールの追加](#adding-tools-to-agents) -- [セッションとユーザーの管理](#managing-sessions-and-users) -- [ドキュメントの統合と検索](#document-integration-and-search) -- [ローカルクイックスタート](#local-quickstart) -- [SDKリファレンス](#sdk-reference) -- [APIリファレンス](#api-reference) +

📖 Table of Contents

+ +- [簡単な例](#%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BE%8B) +- [主な特徴](#%E4%B8%BB%E3%81%AA%E7%89%B9%E5%BE%B4) +- [Julep と LangChain を比較する理由](#julep-%E3%81%A8-langchain-%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1) + - [さまざまなユースケース](#%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9) + - [異なるフォームファクタ](#%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF) +- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) +- [Python クイックスタート 🐍](#python-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) + - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) + - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) + - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) + - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B) +- [Node.js クイックスタート 🟩](#nodejs-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) + - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) + - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) + - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-1) + - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-1) +- [コンポーネント](#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88) + - [メンタルモデル](#%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB) +- [コンセプト](#%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88) +- [タスクを理解する](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B) + - [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E) +- [ツールの種類](#%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E7%A8%AE%E9%A1%9E) + - [ユーザー定義の `function`](#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E3%81%AE-function) + - [`システム` ツール](#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%84%E3%83%BC%E3%83%AB) + - [組み込みの `integration`](#%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE-integration) + - [直接の `api_call`](#%E7%9B%B4%E6%8E%A5%E3%81%AE-api_call) +- [統合](#%E7%B5%B1%E5%90%88) + - [ブレイブサーチ](#%E3%83%96%E3%83%AC%E3%82%A4%E3%83%96%E3%82%B5%E3%83%BC%E3%83%81) + - [ブラウザベース](#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%99%E3%83%BC%E3%82%B9) + - [メール](#%E3%83%A1%E3%83%BC%E3%83%AB) + - [スパイダー](#%E3%82%B9%E3%83%91%E3%82%A4%E3%83%80%E3%83%BC) + - [ウィキペディア](#%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2) +- [その他の機能](#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E6%A9%9F%E8%83%BD) + - [エージェントへのツールの追加](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0) + - [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86) + - [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2) +- [ローカルクイックスタート](#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88) +- [SDK リファレンス](#sdk-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) +- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)
From 8e25bee00eb418bad0abb6d6b05352f39714ff41 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 13 Oct 2024 17:52:58 -0400 Subject: [PATCH 108/113] doc: Add some more documentation to .env.example Signed-off-by: Diwank Singh Tomer --- .env.example | 65 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/.env.example b/.env.example index bf86df708..e468aae8b 100644 --- a/.env.example +++ b/.env.example @@ -5,9 +5,9 @@ # Note: For just testing, you can set them to the same value. # On Linux, you can generate a random key with: -# openssl rand -base64 32 +# > openssl rand -base64 32 # OR -# tr -dc 'A-Za-z0-9+_/' tr -dc 'A-Za-z0-9+_/' AGENTS_API_KEY= @@ -18,24 +18,33 @@ LITELLM_MASTER_KEY= LITELLM_SALT_KEY= LITELLM_REDIS_PASSWORD= -# Memory Store -# ----------- +# LLM Providers +# -------------- -# COZO_HOST=http://memory-store:9070 -# COZO_PORT=9070 -# COZO_ROCKSDB_DIR=cozo.db -# COZO_BACKUP_DIR=/backup -# COZO_MNT_DIR=/data +### Recommended LLM Providers -# Gateway -# ------ +# OPENAI_API_KEY= +# VOYAGE_API_KEY= -# GATEWAY_PORT=80 -# TRAEFIK_LOG_LEVEL=INFO +# HUGGING_FACE_HUB_TOKEN= +# ANTHROPIC_API_KEY= +# GROQ_API_KEY= +# CLOUDFLARE_API_KEY= +# CLOUDFLARE_ACCOUNT_ID= +# NVIDIA_NIM_API_KEY= +# GITHUB_API_KEY= +# GOOGLE_APPLICATION_CREDENTIALS=.keys/julep-vertexai-svc.json # Agents API # --------- +### Embedding Model +### > Set to either "voyage/voyage-3" or "Alibaba-NLP/gte-large-en-v1.5" +### > Use Alibaba-NLP/gte-large-en-v1.5 with local embedding server + +# EMBEDDING_MODEL_ID=voyage/voyage-3 +# EMBEDDING_MODEL_ID=Alibaba-NLP/gte-large-en-v1.5 + # AGENTS_API_HOSTNAME=localhost # AGENTS_API_PROTOCOL=http # AGENTS_API_KEY_HEADER_NAME=Authorization @@ -43,12 +52,26 @@ LITELLM_REDIS_PASSWORD= # TRUNCATE_EMBED_TEXT=true # WORKER_URL=temporal:7233 # AGENTS_API_DEBUG=false -# EMBEDDING_MODEL_ID=Alibaba-NLP/gte-large-en-v1.5 # NUM_GPUS=1 # INTEGRATION_SERVICE_URL=http://integrations:8000 # USE_BLOB_STORE_FOR_TEMPORAL=false # BLOB_STORE_CUTOFF_KB=1024 +# Memory Store +# ----------- + +# COZO_HOST=http://memory-store:9070 +# COZO_PORT=9070 +# COZO_ROCKSDB_DIR=cozo.db +# COZO_BACKUP_DIR=/backup +# COZO_MNT_DIR=/data + +# Gateway +# ------ + +# GATEWAY_PORT=80 +# TRAEFIK_LOG_LEVEL=INFO + # Temporal # -------- @@ -67,20 +90,6 @@ LITELLM_REDIS_PASSWORD= # LITELLM_REDIS_HOST=litellm-redis # LITELLM_REDIS_PORT=6379 -# LLM Providers -# -------------- - -# OPENAI_API_KEY= -# HUGGING_FACE_HUB_TOKEN= -# ANTHROPIC_API_KEY= -# GROQ_API_KEY= -# CLOUDFLARE_API_KEY= -# CLOUDFLARE_ACCOUNT_ID= -# NVIDIA_NIM_API_KEY= -# GITHUB_API_KEY= -# VOYAGE_API_KEY= -# GOOGLE_APPLICATION_CREDENTIALS=.keys/julep-vertexai-svc.json - # Blob Store # ----------- From 799a9dd444850bafd98eb52d7e4add96cf11616f Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 13 Oct 2024 18:04:18 -0400 Subject: [PATCH 109/113] fix: Fix TAG in docker-compose files Signed-off-by: Diwank Singh Tomer --- .env.example | 5 +++++ agents-api/docker-compose.yml | 6 +++--- blob-store/docker-compose.yml | 2 +- deploy/simple-docker-compose.yaml | 17 +++++++++-------- gateway/docker-compose.yml | 2 +- integrations-service/docker-compose.yml | 1 + memory-store/docker-compose.yml | 2 +- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/.env.example b/.env.example index e468aae8b..8e5392a0d 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,8 @@ +# Image Tags +# ---------- + +TAG=dev + # Security # -------- diff --git a/agents-api/docker-compose.yml b/agents-api/docker-compose.yml index e086affbf..d385db0a8 100644 --- a/agents-api/docker-compose.yml +++ b/agents-api/docker-compose.yml @@ -24,7 +24,7 @@ x--shared-environment: &shared-environment WORKER_URL: ${WORKER_URL:-temporal:7233} x--base-agents-api: &base-agents-api - image: julepai/agents-api:${TAG} + image: julepai/agents-api:${TAG:-dev} depends_on: worker: condition: service_started @@ -67,7 +67,7 @@ services: AGENTS_API_PREFIX: "/api" worker: - image: julepai/worker:${TAG} + image: julepai/worker:${TAG:-dev} environment: <<: *shared-environment build: @@ -87,7 +87,7 @@ services: path: Dockerfile.worker cozo-migrate: - image: julepai/cozo-migrate:${TAG} + image: julepai/cozo-migrate:${TAG:-dev} container_name: cozo-migrate build: context: . diff --git a/blob-store/docker-compose.yml b/blob-store/docker-compose.yml index 60a296db7..4fe9a658e 100644 --- a/blob-store/docker-compose.yml +++ b/blob-store/docker-compose.yml @@ -2,7 +2,7 @@ name: julep-blob-store services: seaweedfs: - image: julepai/blob-store:${TAG} + image: julepai/blob-store:${TAG:-dev} build: context: . dockerfile: Dockerfile diff --git a/deploy/simple-docker-compose.yaml b/deploy/simple-docker-compose.yaml index 8b6093e9a..0b21af407 100644 --- a/deploy/simple-docker-compose.yaml +++ b/deploy/simple-docker-compose.yaml @@ -26,7 +26,7 @@ services: TEMPORAL_WORKER_URL: temporal:7233 TRUNCATE_EMBED_TEXT: "True" WORKER_URL: temporal:7233 - image: julepai/agents-api:${TAG:-1.0} + image: julepai/agents-api:${TAG:-dev} networks: default: null ports: @@ -56,12 +56,13 @@ services: TEMPORAL_WORKER_URL: temporal:7233 TRUNCATE_EMBED_TEXT: "True" WORKER_URL: temporal:7233 - image: julepai/cozo-migrate:${TAG:-1.0} + image: julepai/cozo-migrate:${TAG:-dev} networks: default: null restart: "no" integrations: + image: julepai/integrations:${TAG:-dev} environment: OPENAI_API_KEY: ${OPENAI_API_KEY} networks: @@ -109,12 +110,12 @@ services: restart: unless-stopped volumes: - type: bind - source: ./llm-proxy/litellm-config.yaml + source: ../llm-proxy/litellm-config.yaml target: /app/config.yaml bind: create_host_path: true - type: bind - source: ./llm-proxy/.keys + source: ../llm-proxy/.keys target: /app/.keys read_only: true bind: @@ -161,7 +162,7 @@ services: COZO_BACKUP_DIR: /backup COZO_MNT_DIR: /data COZO_PORT: "9070" - image: julepai/memory-store:${TAG:-1.0} + image: julepai/memory-store:${TAG:-dev} labels: ofelia.enabled: "true" ofelia.job-exec.backupcron.command: bash /app/backup.sh @@ -236,12 +237,12 @@ services: default: null volumes: - type: bind - source: ./scheduler/dynamicconfig + source: ../scheduler/dynamicconfig target: /etc/temporal/config/dynamicconfig bind: create_host_path: true - type: bind - source: ./scheduler/cert + source: ../scheduler/cert target: /cert bind: create_host_path: true @@ -307,7 +308,7 @@ services: TEMPORAL_WORKER_URL: temporal:7233 TRUNCATE_EMBED_TEXT: "True" WORKER_URL: temporal:7233 - image: julepai/worker:${TAG:-1.0} + image: julepai/worker:${TAG:-dev} networks: default: null diff --git a/gateway/docker-compose.yml b/gateway/docker-compose.yml index d4ce6a2bd..c43ba0e49 100644 --- a/gateway/docker-compose.yml +++ b/gateway/docker-compose.yml @@ -2,7 +2,7 @@ name: julep-gateway services: gateway: - image: julepai/gateway:${TAG} + image: julepai/gateway:${TAG:-dev} environment: - GATEWAY_PORT=80 - JWT_SHARED_KEY=${JWT_SHARED_KEY} diff --git a/integrations-service/docker-compose.yml b/integrations-service/docker-compose.yml index 750dc473d..27a93cfb7 100644 --- a/integrations-service/docker-compose.yml +++ b/integrations-service/docker-compose.yml @@ -6,6 +6,7 @@ x--shared-environment: &shared-environment services: integrations: + image: julepai/integrations:${TAG:-dev} environment: <<: *shared-environment diff --git a/memory-store/docker-compose.yml b/memory-store/docker-compose.yml index e785a3526..51dcaea32 100644 --- a/memory-store/docker-compose.yml +++ b/memory-store/docker-compose.yml @@ -2,7 +2,7 @@ name: julep-memory-store services: memory-store: - image: julepai/memory-store:${TAG} + image: julepai/memory-store:${TAG:-dev} environment: - COZO_AUTH_TOKEN=${COZO_AUTH_TOKEN} - COZO_PORT=${COZO_PORT:-9070} From e05c1a0186de318c2060746accdf65432b6f5f0e Mon Sep 17 00:00:00 2001 From: Utsav bhattarai <95236817+utsavdotdev@users.noreply.github.com> Date: Mon, 14 Oct 2024 03:52:39 +0545 Subject: [PATCH 110/113] feat: add issue template form (#634) Fix #620 This is enhance the user experience to report issues. ---- > [!IMPORTANT] > Adds new issue templates for bug reports, documentation improvements, and feature requests, enhancing user interaction and issue management. > > - **New Templates**: > - Adds `bug_report.yml` for bug reporting with fields for description, reproduction steps, expected and actual behavior, OS, browsers, and more. > - Adds `docs_improvement.yml` for documentation suggestions with fields for current section, improvement suggestion, and additional context. > - Adds `feature_request.yml` for feature proposals with fields for feature description, pitch, solution, and alternatives. > - **Configuration**: > - Adds `config.yml` to disable blank issues and provide a Discord contact link. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for bf0bb0c4437611ac48963763f740e53ca6b86ad6. It will automatically update as commits are pushed. --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 119 ++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/docs_improvement.yml | 52 +++++++++ .github/ISSUE_TEMPLATE/feature_request.yml | 62 ++++++++++ 4 files changed, 238 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/docs_improvement.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..95731b302 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,119 @@ +name: "🐛 Bug Report" +description: "Submit a bug report to help us improve" +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: We value your time and your efforts to submit this bug report is appreciated. 🙏 + + - type: textarea + id: description + validations: + required: true + attributes: + label: "📜 Description" + description: "A clear and concise description of what the bug is." + placeholder: "It bugs out when ..." + + - type: textarea + id: steps-to-reproduce + validations: + required: true + attributes: + label: "👟 Reproduction steps" + description: "How do you trigger this bug? Please walk us through it step by step." + placeholder: "1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error" + + - type: textarea + id: expected-behavior + validations: + required: true + attributes: + label: "👍 Expected behavior" + description: "What did you think should happen?" + placeholder: "It should ..." + + - type: textarea + id: actual-behavior + validations: + required: true + attributes: + label: "👎 Actual Behavior with Screenshots" + description: "What did actually happen? Add screenshots, if applicable." + placeholder: "It actually ..." + + - type: dropdown + id: operating-system + attributes: + label: "💻 Operating system" + description: "What OS is your app running on?" + options: + - Linux + - MacOS + - Windows + - Something else + validations: + required: true + + - type: dropdown + id: browsers + attributes: + label: What browsers are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge + - Something else + + - type: textarea + id: additional-context + validations: + required: false + attributes: + label: "📃 Provide any additional context for the Bug." + description: "Add any other context about the problem here." + placeholder: "It actually ..." + + - type: textarea + id: logs + validations: + required: false + attributes: + label: 📖 Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: shell + + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this bug has been raised before?" + options: + - label: "I checked and didn't find similar issue" + required: true + + - type: dropdown + id: willing-to-submit-pr + attributes: + label: 🔗 Are you willing to submit PR? + description: This is absolutely not required, but we are happy to guide you in the contribution process. + options: # Added options key + - "Yes, I am willing to submit a PR!" + - "No" + validations: + required: false + + + - type: checkboxes + id: terms + attributes: + label: 🧑‍⚖️ Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/julep-ai/julep/blob/dev/.github/CODE_OF_CONDUCT.md) + options: + - label: I agree to follow this project's Code of Conduct + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..4e472d981 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Have Question? + url: https://discord.com/invite/JTSBGRZrzj + about: Join Official Discord server \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/docs_improvement.yml b/.github/ISSUE_TEMPLATE/docs_improvement.yml new file mode 100644 index 000000000..1654e3345 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/docs_improvement.yml @@ -0,0 +1,52 @@ +name: "📝 Docs Improvement" +description: "Suggest improvements or additions to the documentation" +title: "[Docs]: " +labels: ["documentation"] +assignees: [] +body: + - type: markdown + attributes: + value: Thanks for taking the time to help improve our documentation! Please provide the following details + + - type: input + id: current_section + attributes: + label: "Current Section" + description: "Which section of the documentation needs improvement?" + placeholder: "e.g., Installation Guide" + + - type: textarea + id: improvement_suggestion + attributes: + label: "Improvement Suggestion" + description: "Describe the improvement or addition you are suggesting." + placeholder: "e.g., Add more details about setting up the environment." + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Any additional context or information that might be helpful." + placeholder: "e.g., Links to related documentation, screenshots, etc." + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this issue has been raised before?" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: dropdown + id: willing-to-submit-pr + attributes: + label: Are you willing to submit PR? + description: This is absolutely not required, but we are happy to guide you in the contribution process. + options: + - "Yes I am willing to submit a PR!" + - type: checkboxes + id: terms + attributes: + label: 🧑‍⚖️ Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/julep-ai/julep/blob/dev/.github/CODE_OF_CONDUCT.md) + options: + - label: I agree to follow this project's Code of Conduct + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 000000000..3d1286f78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,62 @@ +name: 🚀 Feature +description: "Submit a proposal for a new feature" +title: "[Feature]: " +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: We value your time and your efforts to submit this feature request is appreciated. 🙏 + - type: textarea + id: feature-description + validations: + required: true + attributes: + label: "🔖 Feature description" + description: "A clear and concise description of what the feature is." + placeholder: "You should add ..." + - type: textarea + id: pitch + validations: + required: true + attributes: + label: "🎤 Why is this feature needed ?" + description: "Please explain why this feature should be implemented and how it would be used. Add examples, if applicable." + placeholder: "In my use-case, ..." + - type: textarea + id: solution + validations: + required: true + attributes: + label: "✌️ How do you aim to achieve this?" + description: "A clear and concise description of what you want to happen." + placeholder: "I want this feature to, ..." + - type: textarea + id: alternative + validations: + required: false + attributes: + label: "🔄️ Additional Information" + description: "A clear and concise description of any alternative solutions or additional solutions you've considered." + placeholder: "I tried, ..." + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this feature request has been raised before?" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: dropdown + id: willing-to-submit-pr + attributes: + label: Are you willing to submit PR? + description: This is absolutely not required, but we are happy to guide you in the contribution process. + options: + - "Yes I am willing to submit a PR!" + - type: checkboxes + id: terms + attributes: + label: 🧑‍⚖️ Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/julep-ai/julep/blob/dev/.github/CODE_OF_CONDUCT.md) + options: + - label: I agree to follow this project's Code of Conduct + required: true \ No newline at end of file From fecdc816342d5be8c26879b5773aa70d0305fad6 Mon Sep 17 00:00:00 2001 From: Diwank Singh Tomer Date: Sun, 13 Oct 2024 18:08:11 -0400 Subject: [PATCH 111/113] fix(typespec): Misc fixes in typespec definitions (#638) Signed-off-by: Diwank Singh Tomer ---- > [!IMPORTANT] > Redefines `ChildStreamEndpoint`, updates dependencies, and removes `YieldStep` from task definitions in typespec files. > > - **Behavior**: > - Redefines `ChildStreamEndpoint` in `interfaces.tsp` to use `SSEStream>`. > - Removes `YieldStep` from task definitions in `endpoints.tsp` and `openapi-0.4.0.yaml`. > - **Models**: > - Adds `StreamEvent` union in `types.tsp`. > - **Dependencies**: > - Updates `package.json` dependencies to `@typespec/compiler@0.61.2`, `@typespec/events@0.61.0`, `@typespec/sse@0.61.0`, and others. > - **Misc**: > - Adds `TasksGetRoute` interface in `endpoints.tsp`. > - Enables `omit-unreachable-types` in `tspconfig.yaml`. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 2f2eafe947d32195d3b9653132daf7547cf5c626. It will automatically update as commits are pushed. Signed-off-by: Diwank Singh Tomer --- typespec/common/interfaces.tsp | 41 +++--- typespec/common/types.tsp | 9 +- typespec/main.tsp | 3 + typespec/package-lock.json | 136 ++++++++++++------ typespec/package.json | 14 +- typespec/tasks/endpoints.tsp | 2 + typespec/tasks/steps.tsp | 1 - .../@typespec/openapi3/openapi-0.4.0.yaml | 34 +++-- .../@typespec/openapi3/openapi-1.0.0.yaml | 34 +++-- typespec/tspconfig.yaml | 2 +- 10 files changed, 171 insertions(+), 105 deletions(-) diff --git a/typespec/common/interfaces.tsp b/typespec/common/interfaces.tsp index d9e4a9e2e..7b719418c 100644 --- a/typespec/common/interfaces.tsp +++ b/typespec/common/interfaces.tsp @@ -1,9 +1,11 @@ import "@typespec/http"; +import "@typespec/sse"; import "./scalars.tsp"; import "./types.tsp"; using TypeSpec.Http; +using TypeSpec.SSE; namespace Common; @@ -140,28 +142,6 @@ interface ChildLimitOffsetPagination< }; } -interface ChildStreamEndpoint< - T, - DocString extends valueof string = "Stream events emitted by the parent" -> { - @get - @doc(DocString) - stream( - @path - @doc("ID of parent") - id: uuid, - - @query - @doc("Next page token") - next_token: string | null = null, - ): { - @header contentType: eventStream; - - @body - @doc("Stream of events emitted by the parent") - body: T; - }; -} interface ChildCreateEndpoint< CreateType, @@ -274,3 +254,20 @@ interface ChildPatchEndpoint< body: ResourceUpdatedResponse; }; } + +interface ChildStreamEndpoint< + T, + DocString extends valueof string = "Stream events emitted by the parent" +> { + @get + @doc(DocString) + stream( + @path + @doc("ID of parent") + id: uuid, + + @query + @doc("Next page token") + next_token: string | null = null, + ): SSEStream>; +} \ No newline at end of file diff --git a/typespec/common/types.tsp b/typespec/common/types.tsp index dd331e98c..0cb4cd50d 100644 --- a/typespec/common/types.tsp +++ b/typespec/common/types.tsp @@ -1,6 +1,8 @@ +import "@typespec/events"; import "@typespec/http"; import "@typespec/openapi"; +using TypeSpec.Events; using TypeSpec.Http; using TypeSpec.OpenAPI; @@ -51,4 +53,9 @@ model PaginationOptions { /** Object to filter results by metadata */ @query metadata_filter: MetadataFilter, -} \ No newline at end of file +} + +@events +union StreamEvent { + T; +} diff --git a/typespec/main.tsp b/typespec/main.tsp index b3bb1278c..aefb8adfc 100644 --- a/typespec/main.tsp +++ b/typespec/main.tsp @@ -95,6 +95,9 @@ namespace Api { @route("/docs") interface IndividualDocsRoute extends Docs.IndividualDocEndpoints {} + @route("/tasks") + interface TasksGetRoute extends Tasks.GetEndpoints {} + @route("/agents/{id}/tasks") interface TasksRoute extends Tasks.Endpoints {} diff --git a/typespec/package-lock.json b/typespec/package-lock.json index 0ddfdb155..80ad055ad 100644 --- a/typespec/package-lock.json +++ b/typespec/package-lock.json @@ -8,12 +8,14 @@ "name": "julep-typespec", "version": "0.4.0", "dependencies": { - "@typespec/compiler": "^0.60.1", - "@typespec/http": "^0.60.0", - "@typespec/openapi": "^0.60.0", - "@typespec/openapi3": "^0.60.0", - "@typespec/rest": "^0.60.0", - "@typespec/versioning": "^0.60.1" + "@typespec/compiler": "^0.61.2", + "@typespec/events": "^0.61.0", + "@typespec/http": "^0.61.0", + "@typespec/openapi": "^0.61.0", + "@typespec/openapi3": "^0.61.0", + "@typespec/rest": "^0.61.0", + "@typespec/sse": "^0.61.0", + "@typespec/versioning": "^0.61.0" } }, "node_modules/@apidevtools/swagger-methods": { @@ -274,9 +276,9 @@ "license": "MIT" }, "node_modules/@typespec/compiler": { - "version": "0.60.1", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.60.1.tgz", - "integrity": "sha512-I6Vcpvd7mBP7SI5vCBh9rZGXAtVy95BKhAd33Enw32psswiSzRpA7zdyZhOMekTOGVXNS/+E5l2PGGCzQddB4w==", + "version": "0.61.2", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.61.2.tgz", + "integrity": "sha512-6QxYJd09VWssd/BvY+8eBxTVv085s1UNK63FdPrgT2lgI+j8VMMcpNR9m5l1zWlgGDM7sniA/Or8VCdVA6jerg==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.24.7", @@ -284,14 +286,14 @@ "change-case": "~5.4.4", "globby": "~14.0.2", "mustache": "~4.2.0", - "picocolors": "~1.0.1", + "picocolors": "~1.1.0", "prettier": "~3.3.3", "prompts": "~2.4.2", "semver": "^7.6.3", "temporal-polyfill": "^0.2.5", "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "yaml": "~2.4.5", + "vscode-languageserver-textdocument": "~1.0.12", + "yaml": "~2.5.1", "yargs": "~17.7.2" }, "bin": { @@ -302,39 +304,57 @@ "node": ">=18.0.0" } }, + "node_modules/@typespec/events": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/events/-/events-0.61.0.tgz", + "integrity": "sha512-XUXy36qGo7v1ZBEK5WTD3TGXc4xr9rbL5U5f7aCabad4YHTi6r/2GMOVjuRJOiCJoMvEVeL1pWkhDZkBPbdd3A==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.61.0" + } + }, "node_modules/@typespec/http": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.60.0.tgz", - "integrity": "sha512-ktfS9vpHfltyeAaQLNAZdqrn6Per3vmB/HDH/iyudYLA5wWblT1siKvpFCMWq53CJorRO7yeOKv+Q/M26zwEtg==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.61.0.tgz", + "integrity": "sha512-7+AYHkzkc+p652GY9BcEbXY4OZa1fTr03MVmZeafvmbQbXfyzUU9eJld13M3v6NaUWqXWZ7nBNMISyKiXp/kSw==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.60.0" + "@typespec/compiler": "~0.61.0", + "@typespec/streams": "~0.61.0" + }, + "peerDependenciesMeta": { + "@typespec/streams": { + "optional": true + } } }, "node_modules/@typespec/openapi": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.60.0.tgz", - "integrity": "sha512-YVwLppgHY8r/MudHNSLSUXzdw+CIpjmb31gI2a0KDGnI6sWDwY7LSWfjGU4TY/ubt0+X0Tjoy330mTvw71YBTg==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.61.0.tgz", + "integrity": "sha512-3AF319Ae4yGVOscsCLQeedXUJJcL/NdGOR2/e/nFiL/AOVdgLfIRnpR0Ad9Zj9XAESh1fq9XSu4Mi7N1k4V7rw==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.60.0", - "@typespec/http": "~0.60.0" + "@typespec/compiler": "~0.61.0", + "@typespec/http": "~0.61.0" } }, "node_modules/@typespec/openapi3": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-0.60.0.tgz", - "integrity": "sha512-gvrTHZACdeQtV7GfhVOHqkyTgMFyM2nKAIiz2P83LIncMCDUc00bGKGmaBk+xpuwKtCJyxBeVpCbID31YAq96g==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-0.61.0.tgz", + "integrity": "sha512-ALLsTkK1UiJBzvygV1Zk/yZaym+lOWroGeEUhQNXYShsq+/GLZkK0rl8sd76Gigq+TVXKMOEwUUvgfws/LMUJw==", "license": "MIT", "dependencies": { "@readme/openapi-parser": "~2.6.0", - "yaml": "~2.4.5" + "yaml": "~2.5.1" }, "bin": { "tsp-openapi3": "cmd/tsp-openapi3.js" @@ -343,35 +363,63 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.60.0", - "@typespec/http": "~0.60.0", - "@typespec/openapi": "~0.60.0", - "@typespec/versioning": "~0.60.0" + "@typespec/compiler": "~0.61.0", + "@typespec/http": "~0.61.0", + "@typespec/openapi": "~0.61.0", + "@typespec/versioning": "~0.61.0" } }, "node_modules/@typespec/rest": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.60.0.tgz", - "integrity": "sha512-mHYubyuBvwdV2xkHrJfPwV7b/Ksyb9lA1Q/AQwpVFa7Qu1X075TBVALmH+hK3V0EdUG1CGJZ5Sw4BWgl8ZS0BA==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/rest/-/rest-0.61.0.tgz", + "integrity": "sha512-L9Oyor+l42p6S8GE+UvaZTi+dcu6WubGZKmaBRpX8mCZGsa69EgIK8DQoyxrfMcxAO4I5U0sfkzCKwCVFtRr9g==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.61.0", + "@typespec/http": "~0.61.0" + } + }, + "node_modules/@typespec/sse": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/sse/-/sse-0.61.0.tgz", + "integrity": "sha512-q9wqMTqRDQkgID51o9lXWkrF9Ndn67sZznzGvKpCS6pG7eDc0cigkTWFmV2Agag9HzoP2MdFMlvU/sJKECPtfg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.61.0", + "@typespec/events": "~0.61.0", + "@typespec/http": "~0.61.0", + "@typespec/streams": "~0.61.0" + } + }, + "node_modules/@typespec/streams": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/streams/-/streams-0.61.0.tgz", + "integrity": "sha512-MEFwYmYVibuTwVwJ6UKa9kgM3AP5bn/MWIhB/dTgYicXEgbUk+o9RHqg7JsySFyL0PO9XoqQBFiJhWM758f+pQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.60.0", - "@typespec/http": "~0.60.0" + "@typespec/compiler": "~0.61.0" } }, "node_modules/@typespec/versioning": { - "version": "0.60.1", - "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.60.1.tgz", - "integrity": "sha512-HogYL7P9uOPoSvkLLDjF22S6E9td6EY3c6TcIHhCzDTAQoi54csikD0gNrtcCkFG0UeQk29HgQymV397j+vp4g==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.61.0.tgz", + "integrity": "sha512-PIIug6eg3zc7E+BBHyNHHQD+OBq3FU465nhKrLEp35iVji/sYFuPc1ywnELDuwJVRWm6nvqNL1vtnc+4lEk+oA==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "@typespec/compiler": "~0.60.0" + "@typespec/compiler": "~0.61.0" } }, "node_modules/ajv": { @@ -799,9 +847,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/picomatch": { @@ -1131,9 +1179,9 @@ } }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/typespec/package.json b/typespec/package.json index d424d67dc..6d435a832 100644 --- a/typespec/package.json +++ b/typespec/package.json @@ -3,12 +3,14 @@ "version": "0.4.0", "type": "module", "dependencies": { - "@typespec/compiler": "^0.60.1", - "@typespec/http": "^0.60.0", - "@typespec/openapi": "^0.60.0", - "@typespec/openapi3": "^0.60.0", - "@typespec/rest": "^0.60.0", - "@typespec/versioning": "^0.60.1" + "@typespec/compiler": "^0.61.2", + "@typespec/events": "^0.61.0", + "@typespec/http": "^0.61.0", + "@typespec/openapi": "^0.61.0", + "@typespec/openapi3": "^0.61.0", + "@typespec/rest": "^0.61.0", + "@typespec/sse": "^0.61.0", + "@typespec/versioning": "^0.61.0" }, "private": true } diff --git a/typespec/tasks/endpoints.tsp b/typespec/tasks/endpoints.tsp index 2d9ec422b..850eacdf3 100644 --- a/typespec/tasks/endpoints.tsp +++ b/typespec/tasks/endpoints.tsp @@ -15,6 +15,8 @@ namespace Tasks; // TASK ENDPOINTS // +interface GetEndpoints extends GetEndpoint {} + interface CreateOrUpdateEndpoints { @post @doc("Create or update a task") diff --git a/typespec/tasks/steps.tsp b/typespec/tasks/steps.tsp index 4b14ef6ae..ea4d84d79 100644 --- a/typespec/tasks/steps.tsp +++ b/typespec/tasks/steps.tsp @@ -59,7 +59,6 @@ alias NonConditionalWorkflowStep = | ReturnStep | SleepStep | ErrorWorkflowStep - | YieldStep | WaitForInputStep; alias ConditionalStep = IfElseWorkflowStep | SwitchStep; diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml index 61d89edaa..cebe19ffc 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-0.4.0.yaml @@ -752,7 +752,7 @@ paths: content: text/event-stream: schema: - $ref: '#/components/schemas/Executions.TransitionEvent' + type: string /jobs/{id}: get: operationId: JobRoute_get @@ -979,6 +979,24 @@ paths: application/json: schema: $ref: '#/components/schemas/Entries.History' + /tasks/{id}: + get: + operationId: TasksGetRoute_get + description: Get a task by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Tasks.Task' /tasks/{id}/executions: post: operationId: TaskExecutionsRoute_create @@ -3875,7 +3893,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true Tasks.CaseThenUpdateItem: @@ -3903,7 +3920,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true Tasks.CreateTaskRequest: @@ -3935,7 +3951,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -4031,7 +4046,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -4306,7 +4320,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true else: @@ -4321,7 +4334,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' nullable: true description: The steps to run if the condition is false @@ -4363,7 +4375,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true else: @@ -4378,7 +4389,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' nullable: true description: The steps to run if the condition is false @@ -4508,7 +4518,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' @@ -4592,7 +4601,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' @@ -5118,7 +5126,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -5228,7 +5235,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -5396,7 +5402,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -5492,7 +5497,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' diff --git a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml index 36fbc0147..95d50b77a 100644 --- a/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml +++ b/typespec/tsp-output/@typespec/openapi3/openapi-1.0.0.yaml @@ -752,7 +752,7 @@ paths: content: text/event-stream: schema: - $ref: '#/components/schemas/Executions.TransitionEvent' + type: string /jobs/{id}: get: operationId: JobRoute_get @@ -979,6 +979,24 @@ paths: application/json: schema: $ref: '#/components/schemas/Entries.History' + /tasks/{id}: + get: + operationId: TasksGetRoute_get + description: Get a task by id + parameters: + - name: id + in: path + required: true + description: ID of the resource + schema: + $ref: '#/components/schemas/Common.uuid' + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Tasks.Task' /tasks/{id}/executions: post: operationId: TaskExecutionsRoute_create @@ -3875,7 +3893,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true Tasks.CaseThenUpdateItem: @@ -3903,7 +3920,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true Tasks.CreateTaskRequest: @@ -3935,7 +3951,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -4031,7 +4046,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -4306,7 +4320,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true else: @@ -4321,7 +4334,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' nullable: true description: The steps to run if the condition is false @@ -4363,7 +4375,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' description: The steps to run if the condition is true else: @@ -4378,7 +4389,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' nullable: true description: The steps to run if the condition is false @@ -4508,7 +4518,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' @@ -4592,7 +4601,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStepUpdateItem' - $ref: '#/components/schemas/Tasks.SwitchStepUpdateItem' @@ -5118,7 +5126,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -5228,7 +5235,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -5396,7 +5402,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' @@ -5492,7 +5497,6 @@ components: - $ref: '#/components/schemas/Tasks.ReturnStep' - $ref: '#/components/schemas/Tasks.SleepStep' - $ref: '#/components/schemas/Tasks.ErrorWorkflowStep' - - $ref: '#/components/schemas/Tasks.YieldStep' - $ref: '#/components/schemas/Tasks.WaitForInputStep' - $ref: '#/components/schemas/Tasks.IfElseWorkflowStep' - $ref: '#/components/schemas/Tasks.SwitchStep' diff --git a/typespec/tspconfig.yaml b/typespec/tspconfig.yaml index c5b3491f6..7bd4e8d1e 100644 --- a/typespec/tspconfig.yaml +++ b/typespec/tspconfig.yaml @@ -6,4 +6,4 @@ options: file-type: yaml output-file: "openapi-{version}.yaml" new-line: lf - # omit-unreachable-types: true + omit-unreachable-types: true From 7d7f76a3c69bbf77fded9238bfcdf816f652cd6c Mon Sep 17 00:00:00 2001 From: Sudhanshu Tripathi <97780892+sudhanshu-77@users.noreply.github.com> Date: Mon, 14 Oct 2024 03:39:28 +0530 Subject: [PATCH 112/113] Allow to Add a Move to Top button to enhance the ease of navigation for README readers. (#636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a Move to Top button to enhance the ease of navigation for README readers. because of readme file length. Hi 👋 @creatorrr, Please review my PR and accept my small contribution and if need any changes please let me know. Thank you ---- > [!IMPORTANT] > Add 'Move to Top' button to README.md for easier navigation. > > - **README.md**: > - Adds a 'Move to Top' button at the end of the file for easier navigation. > > This description was created by [Ellipsis](https://www.ellipsis.dev?ref=julep-ai%2Fjulep&utm_source=github&utm_medium=referral) for 809e5cf04d4a96ff3ea71dcd30c28962ae1cb901. It will automatically update as commits are pushed. --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 2b9e69dc5..11896ca79 100644 --- a/README.md +++ b/README.md @@ -1076,3 +1076,11 @@ Explore our comprehensive API documentation to learn more about agents, tasks, a - [Agents API](https://api.julep.ai/api/docs#tag/agents) - [Tasks API](https://api.julep.ai/api/docs#tag/tasks) - [Executions API](https://api.julep.ai/api/docs#tag/executions) + + + + From ec490715f70b954a2a24437d9486421c772785d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 13 Oct 2024 22:10:23 +0000 Subject: [PATCH 113/113] chore(readme): translate README.md --- README-CN.md | 95 +++++++++++++++++++++++++++-------------------- README-FR.md | 99 +++++++++++++++++++++++++------------------------ README-JA.md | 102 +++++++++++++++++++++++++++------------------------ 3 files changed, 163 insertions(+), 133 deletions(-) diff --git a/README-CN.md b/README-CN.md index b765f4af9..c47b56a6b 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,4 +1,4 @@ -English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) +[English](README.md) | [中文翻译](README-CN.md) | [日本語翻訳](README-JA.md) | [French](README-FR.md)
julep @@ -30,6 +30,8 @@ > [!注意] > 👨‍💻 来参加 devfest.ai 活动了吗?加入我们的 [Discord](https://discord.com/invite/JTSBGRZrzj) 并查看以下详细信息。 +> +> 从 [此处](https://dashboard-dev.julep.ai) 获取您的 API 密钥。
🌟 贡献者和 DevFest.AI 参与者(点击展开) @@ -55,11 +57,6 @@ > [!提示] > 准备好加入这场有趣的活动了吗?**[发推文表示你正在参与](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** 让我们开始编码吧!🖥️ -> [!注意] -> 从 [此处](https://dashboard-dev.julep.ai) 获取您的 API 密钥。 -> -> 虽然我们处于测试阶段,但您也可以通过 [Discord](https://discord.com/invite/JTSBGRZrzj) 联系,以解除 API 密钥的速率限制。 - ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
@@ -67,38 +64,50 @@
-

📖 Table of Contents

- -- [为什么选择 Julep 而不是 LangChain?](#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9-julep-%E8%80%8C%E4%B8%8D%E6%98%AF-langchain) - - [不同的用例](#%E4%B8%8D%E5%90%8C%E7%9A%84%E7%94%A8%E4%BE%8B) - - [不同的外形尺寸](#%E4%B8%8D%E5%90%8C%E7%9A%84%E5%A4%96%E5%BD%A2%E5%B0%BA%E5%AF%B8) -- [Python 快速入门🐍](#python-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8) - - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86) - - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1) - - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1) - - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9) -- [Node.js 快速入门 🟩](#nodejs-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8-) - - [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86-1) - - [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1-1) - - [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1-1) - - [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9-1) - - [心智模型](#%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B) -- [概念](#%E6%A6%82%E5%BF%B5) -- [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1) - - [工作流步骤的类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%9A%84%E7%B1%BB%E5%9E%8B) -- [工具类型](#%E5%B7%A5%E5%85%B7%E7%B1%BB%E5%9E%8B) - - [用户定义的函数](#%E7%94%A8%E6%88%B7%E5%AE%9A%E4%B9%89%E7%9A%84%E5%87%BD%E6%95%B0) - - [`系统` 工具](#%E7%B3%BB%E7%BB%9F-%E5%B7%A5%E5%85%B7) - - [内置“集成”](#%E5%86%85%E7%BD%AE%E9%9B%86%E6%88%90) - - [直接 `api_call`](#%E7%9B%B4%E6%8E%A5-api_call) -- [集成](#%E9%9B%86%E6%88%90) - - [勇敢搜索](#%E5%8B%87%E6%95%A2%E6%90%9C%E7%B4%A2) - - [浏览器基础](#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9F%BA%E7%A1%80) - - [向代理添加工具](#%E5%90%91%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7) - - [管理会话和用户](#%E7%AE%A1%E7%90%86%E4%BC%9A%E8%AF%9D%E5%92%8C%E7%94%A8%E6%88%B7) - - [文档集成与搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E4%B8%8E%E6%90%9C%E7%B4%A2) -- [本地快速启动](#%E6%9C%AC%E5%9C%B0%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8) -- [SDK 参考](#sdk-%E5%8F%82%E8%80%83) +

📖 目录

+ +- [简介](#introduction) +- [快速示例](#quick-example) +- [主要特点](#key-features) +- [为什么选择 Julep 而不是 LangChain?](#why-julep-vs-langchain) +- [不同用例](#different-use-cases) +- [不同的外形尺寸](#different-form-factor) +- [总结](#in-summary) +- [安装](#安装) +- [Python 快速入门 🐍](#python-quick-start-) +- [步骤 1:创建代理](#step-1-create-an-agent) +- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip) +- [步骤 3:执行任务](#step-3-execute-the-task) +- [步骤 4:与代理聊天](#step-4-chat-with-the-agent) +- [Node.js 快速入门🟩](#nodejs-quick-start-) +- [步骤 1:创建代理](#step-1-create-an-agent-1) +- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) +- [步骤 3:执行任务](#step-3-execute-the-task-1) +- [步骤 4:与代理聊天](#step-4-chat-with-the-agent-1) +- [组件](#components) +- [心智模型](#mental-model) +- [概念](#concepts) +- [理解任务](#understanding-tasks) +- [工作流步骤的类型](#types-of-workflow-steps) +- [工具类型](#tool-types) +- [用户定义的函数](#user-defined-functions) +- [`系统` 工具](#system-tools) +- [内置集成](#built-in-integrations) +- [直接 `api_call`](#direct-api_calls) +- [集成](#integrations) +- [勇敢搜索](#brave-search) +- [BrowserBase](#browserbase) +- [电子邮件](#email) +- [蜘蛛](#蜘蛛) +- [天气](#天气) +- [维基百科](#wikipedia) +- [其他功能](#other-features) +- [向代理添加工具](#adding-tools-to-agents) +- [管理会话和用户](#managing-sessions-and-users) +- [文档集成与搜索](#document-integration-and-search) +- [本地快速启动](#local-quickstart) +- [SDK 参考](#sdk-reference) +- [API 参考](#api-reference)
@@ -845,7 +854,7 @@ Julep 带有许多内置集成(如下节所述)。`集成` 工具直接在 j julep 后端附带来自以下提供商的集成第三方工具: - [composio](https://composio.dev) \*\* -- [匿名](https://anon.com)\*\* +- [匿名](https://anon.com) \*\* - [langchain 工具包](https://python.langchain.com/v0.2/docs/integrations/toolkits/)。计划支持 _Github、Gitlab、Gmail、Jira、MultiOn、Slack_ 工具包。 \*\* 由于 _composio_ 和 _anon_ 是第三方提供商,因此他们的工具需要设置帐户链接。 @@ -1067,3 +1076,11 @@ API 参考 - [代理 API](https://api.julep.ai/api/docs#tag/agents) - [任务 API](https://api.julep.ai/api/docs#tag/tasks) - [执行 API](https://api.julep.ai/api/docs#tag/executions) + + + + diff --git a/README-FR.md b/README-FR.md index 9708f992e..334db2ed7 100644 --- a/README-FR.md +++ b/README-FR.md @@ -1,4 +1,4 @@ -English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) +[English](README.md) | [中文翻译](README-CN.md) | [日本語翻訳](README-JA.md) | [French](README-FR.md)
julep @@ -30,6 +30,8 @@ > [!REMARQUE] > 👨‍💻 Vous êtes ici pour l'événement devfest.ai ? Rejoignez notre [Discord](https://discord.com/invite/JTSBGRZrzj) et consultez les détails ci-dessous. +> +> Obtenez votre clé API [ici](https://dashboard-dev.julep.ai).
🌟 Contributeurs et participants au DevFest.AI(Cliquez pour agrandir) @@ -55,11 +57,6 @@ Des nouvelles passionnantes ! Nous participons au DevFest.AI tout au long du moi > [!TIP] > Prêt à vous joindre à la fête ? **[Tweetez que vous participez](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** et commençons à coder ! 🖥️ -> [!REMARQUE] -> Obtenez votre clé API [ici](https://dashboard-dev.julep.ai). -> -> Pendant que nous sommes en version bêta, vous pouvez également nous contacter sur [Discord](https://discord.com/invite/JTSBGRZrzj) pour obtenir la levée des limites de débit sur votre clé API. - ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
@@ -67,50 +64,50 @@ Des nouvelles passionnantes ! Nous participons au DevFest.AI tout au long du moi
-

📖 Table of Contents

- -- [Introduction](#introduction) -- [Exemple rapide](#exemple-rapide) -- [Principales caractéristiques](#principales-caract%C3%A9ristiques) -- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain%C2%A0) - - [Différents cas d'utilisation](#diff%C3%A9rents-cas-dutilisation) - - [Facteur de forme différent](#facteur-de-forme-diff%C3%A9rent) - - [En résumé](#en-r%C3%A9sum%C3%A9) +

📖 Table des matières

+ +- [Présentation](#introduction) +- [Exemple rapide](#quick-example) +- [Caractéristiques principales](#key-features) +- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain) +- [Différents cas d'utilisation](#different-use-cases) +- [Facteur de forme différent](#different-form-factor) +- [En résumé](#en-resumé) - [Installation](#installation) -- [Démarrage rapide de Python 🐍](#d%C3%A9marrage-rapide-de-python-) - - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent) - - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e) - - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che) - - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent) -- [Démarrage rapide de Node.js 🟩](#d%C3%A9marrage-rapide-de-nodejs-) - - [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent-1) - - [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e-1) - - [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che-1) - - [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent-1) +- [Démarrage rapide de Python 🐍](#python-quick-start-) +- [Étape 1 : Créer un agent](#step-1-create-an-agent) +- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip) +- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task) +- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent) +- [Démarrage rapide de Node.js 🟩](#nodejs-quick-start-) +- [Étape 1 : Créer un agent](#step-1-create-an-agent-1) +- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) +- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task-1) +- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent-1) - [Composants](#composants) - - [Modèle mental](#mod%C3%A8le-mental) +- [Modèle mental](#mental-model) - [Concepts](#concepts) -- [Comprendre les tâches](#comprendre-les-t%C3%A2ches) - - [Types d'étapes de flux de travail](#types-d%C3%A9tapes-de-flux-de-travail) -- [Types d'outils](#types-doutils) - - [Fonctions définies par l'utilisateur](#fonctions-d%C3%A9finies-par-lutilisateur) - - [outils `système`](#outils-syst%C3%A8me) - - [Intégrations intégrées](#int%C3%A9grations-int%C3%A9gr%C3%A9es) - - [Appels directs `api_call`](#appels-directs-api_call) -- [Intégrations](#int%C3%A9grations) - - [Recherche courageuse](#recherche-courageuse) - - [Base de navigateur](#base-de-navigateur) - - [E-mail](#e-mail) - - [Araignée](#araign%C3%A9e) - - [Météo](#m%C3%A9t%C3%A9o) - - [Wikipédia](#wikip%C3%A9dia) -- [Autres fonctionnalités](#autres-fonctionnalit%C3%A9s) - - [Ajout d'outils aux agents](#ajout-doutils-aux-agents) - - [Gestion des sessions et des utilisateurs](#gestion-des-sessions-et-des-utilisateurs) - - [Intégration et recherche de documents](#int%C3%A9gration-et-recherche-de-documents) -- [Démarrage rapide local](#d%C3%A9marrage-rapide-local) -- [Référence du SDK](#r%C3%A9f%C3%A9rence-du-sdk) -- [Référence API](#r%C3%A9f%C3%A9rence-api) +- [Comprendre les tâches](#understanding-tasks) +- [Types d'étapes de flux de travail](#types-of-workflow-steps) +- [Types d'outils](#types-d'outils) +- [Fonctions définies par l'utilisateur](#user-defined-functions) +- [outils système](#outils-système) +- [Intégrations intégrées](#integrations-integrées) +- [Appels directs d'API](#appels directs d'API) +- [Intégrations](#intégrations) +- [Recherche courageuse](#brave-search) +- [Base du navigateur](#basedunavigateur) +- [Courriel](#courriel) +- [Araignée](#araignée) +- [Météo](#météo) +- [Wikipédia](#wikipédia) +- [Autres fonctionnalités](#other-features) +- [Ajout d'outils aux agents](#adding-tools-to-agents) +- [Gestion des sessions et des utilisateurs](#managing-sessions-and-users) +- [Intégration et recherche de documents](#document-integration-and-search) +- [Démarrage rapide local](#local-quickstart) +- [Référence SDK](#sdk-reference) +- [Référence API](#api-reference)
@@ -1079,3 +1076,11 @@ Explorez notre documentation API complète pour en savoir plus sur les agents, l - [API des agents](https://api.julep.ai/api/docs#tag/agents) - [API des tâches](https://api.julep.ai/api/docs#tag/tasks) - [API d'exécution](https://api.julep.ai/api/docs#tag/executions) + + + + diff --git a/README-JA.md b/README-JA.md index 5a65e7b7e..e31e512a7 100644 --- a/README-JA.md +++ b/README-JA.md @@ -1,4 +1,4 @@ -English | [中文翻译](https://github.com/julep-ai/julep/blob/dev/README-CN.md) | [日本語翻訳](https://github.com/julep-ai/julep/blob/dev/README-JP.md) +[English](README.md) | [中文翻译](README-CN.md) | [日本語翻訳](README-JA.md) | [French](README-FR.md)
julep @@ -30,6 +30,8 @@ > [!注意] > 👨‍💻 devfest.ai イベントに参加しませんか? [Discord](https://discord.com/invite/JTSBGRZrzj) に参加して、以下の詳細を確認してください。 +> +> API キーを [こちら](https://dashboard-dev.julep.ai) から取得します。
🌟 貢献者とDevFest.AI参加者(クリックして拡大) @@ -55,11 +57,6 @@ Julep プロジェクトに新しい貢献者を迎えられることを嬉し > [!ヒント] > 楽しみに参加する準備はできましたか? **[参加することをツイート](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)**して、コーディングを始めましょう! 🖥️ -> [!注意] -> API キーを [こちら](https://dashboard-dev.julep.ai) から取得します。 -> -> ベータ版では、[Discord](https://discord.com/invite/JTSBGRZrzj) に連絡して、API キーのレート制限を解除することもできます。 - ![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
@@ -67,47 +64,50 @@ Julep プロジェクトに新しい貢献者を迎えられることを嬉し
-

📖 Table of Contents

- -- [簡単な例](#%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BE%8B) -- [主な特徴](#%E4%B8%BB%E3%81%AA%E7%89%B9%E5%BE%B4) -- [Julep と LangChain を比較する理由](#julep-%E3%81%A8-langchain-%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1) - - [さまざまなユースケース](#%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9) - - [異なるフォームファクタ](#%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF) -- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) -- [Python クイックスタート 🐍](#python-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) - - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) - - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) - - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) - - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B) -- [Node.js クイックスタート 🟩](#nodejs-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-) - - [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) - - [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1) - - [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-1) - - [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-1) -- [コンポーネント](#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88) - - [メンタルモデル](#%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB) -- [コンセプト](#%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88) -- [タスクを理解する](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B) - - [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E) -- [ツールの種類](#%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E7%A8%AE%E9%A1%9E) - - [ユーザー定義の `function`](#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E3%81%AE-function) - - [`システム` ツール](#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%84%E3%83%BC%E3%83%AB) - - [組み込みの `integration`](#%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE-integration) - - [直接の `api_call`](#%E7%9B%B4%E6%8E%A5%E3%81%AE-api_call) -- [統合](#%E7%B5%B1%E5%90%88) - - [ブレイブサーチ](#%E3%83%96%E3%83%AC%E3%82%A4%E3%83%96%E3%82%B5%E3%83%BC%E3%83%81) - - [ブラウザベース](#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%99%E3%83%BC%E3%82%B9) - - [メール](#%E3%83%A1%E3%83%BC%E3%83%AB) - - [スパイダー](#%E3%82%B9%E3%83%91%E3%82%A4%E3%83%80%E3%83%BC) - - [ウィキペディア](#%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2) -- [その他の機能](#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E6%A9%9F%E8%83%BD) - - [エージェントへのツールの追加](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0) - - [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86) - - [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2) -- [ローカルクイックスタート](#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88) -- [SDK リファレンス](#sdk-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) -- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9) +

📖 目次

+ +- [はじめに](#introduction) +- [簡単な例](#quick-example) +- [主な機能](#key-features) +- [なぜ Julep と LangChain を比較するのか?](#why-julep-vs-langchain) +- [さまざまなユースケース](#different-use-cases) +- [異なるフォームファクター](#different-form-factor) +- [要約](#in-summary) +- [インストール](#installation) +- [Python クイックスタート 🐍](#python-quick-start-) +- [ステップ 1: エージェントを作成する](#step-1-create-an-agent) +- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip) +- [ステップ 3: タスクを実行する](#step-3-execute-the-task) +- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent) +- [Node.js クイック スタート 🟩](#nodejs-quick-start-) +- [ステップ 1: エージェントを作成する](#step-1-create-an-agent-1) +- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1) +- [ステップ 3: タスクを実行する](#step-3-execute-the-task-1) +- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent-1) +- [コンポーネント](#components) +- [メンタルモデル](#mental-model) +- [コンセプト](#concepts) +- [タスクの理解](#understanding-tasks) +- [ワークフロー ステップの種類](#types-of-workflow-steps) +- [ツールの種類](#tool-types) +- [ユーザー定義の `function`](#user-defined-functions) +- [`システム` ツール](#system-tools) +- [組み込みの `integration`s](#built-in-integrations) +- [直接の `api_call`](#direct-api_calls) +- [統合](#integrations) +- [勇敢な検索](#brave-search) +- [ブラウザベース](#browserbase) +- [メールアドレス](#email) +- [スパイダー](#spider) +- [天気](#weather) +- [ウィキペディア](#wikipedia) +- [その他の機能](#other-features) +- [エージェントへのツールの追加](#adding-tools-to-agents) +- [セッションとユーザーの管理](#managing-sessions-and-users) +- [ドキュメントの統合と検索](#document-integration-and-search) +- [ローカルクイックスタート](#local-quickstart) +- [SDKリファレンス](#sdk-reference) +- [API リファレンス](#api-reference)
@@ -1076,3 +1076,11 @@ results = client.agents.docs.search( - [エージェント API](https://api.julep.ai/api/docs#tag/agents) - [タスク API](https://api.julep.ai/api/docs#tag/tasks) - [実行API](https://api.julep.ai/api/docs#tag/executions) + + + +

Vj%QG**^!(ImUQ%b9J9TOSmuRW@Jpfo}t0M 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[English](/) | 中文翻译 - -