diff --git a/agent-os/studio/agents.mdx b/agent-os/studio/agents.mdx new file mode 100644 index 000000000..5bc1246f1 --- /dev/null +++ b/agent-os/studio/agents.mdx @@ -0,0 +1,65 @@ +--- +title: "Agents" +description: "Build and configure agents visually in AgentOS Studio." +--- + +Build production-grade agents via AgentOS Studio’s visual canvas. Wire up models, tools, +and structured I/O into complex agentic workflows. Deploy instantly. No-code required. + +## Creating Agents + +Create a new agent by selecting components from your [Registry](/agent-os/studio/registry) and configuring them in the properties panel: + +| Setting | Description | +|---------|-------------| +| **Model** | Select from registered models | +| **Tools** | Attach registered tools and toolkits | +| **Instructions** | System-level instructions for the agent | +| **Input/Output Schema** | Structured I/O using registered Pydantic schemas | +| **Memory** | Enable memory for multi-turn conversations | +| **Knowledge** | Attach knowledge bases for RAG | + + +Switch to the advanced JSON config editor for fine-grained control over agent settings. + + +## Using Agents + +Use Studio-built Agents in multiple ways: + +- **Chat directly** with the agent via the Chat page +- **Add to Teams** for multi-agent collaboration +- **Use in Workflows** as step executors for automation pipelines + +## Save and Run + +Once your agent is configured: + +1. **Save** your agent to persist it to the registry +2. Navigate to the **Chat page** to interact with your agent +3. Send messages and receive responses in real-time +4. View tool calls, reasoning, and outputs as the agent works + +## Code Equivalent + +Agents built in Studio are native instances of the 'Agent' class in the SDK. + +```python +from agno.agent import Agent +from agno.models.openai import OpenAIChat +from agno.tools.websearch import WebSearchTools + +agent = Agent( + name="Research Agent", + model=OpenAIChat(id="gpt-5-mini"), + tools=[WebSearchTools()], + instructions="Research topics thoroughly using web search.", + markdown=True, +) +``` + +## Developer Resources + +- [Agent reference](/reference/agents/agent) +- [Building agents](/agents/building-agents) +- [Studio Registry](/agent-os/studio/registry) diff --git a/agent-os/studio/cel-expressions.mdx b/agent-os/studio/cel-expressions.mdx new file mode 100644 index 000000000..7e627039a --- /dev/null +++ b/agent-os/studio/cel-expressions.mdx @@ -0,0 +1,271 @@ +--- +title: "CEL Expressions" +sidebarTitle: "CEL Expressions" +description: "Use CEL expressions as evaluators, end conditions, and selectors in workflow steps." +--- + +[CEL (Common Expression Language)](https://github.com/google/cel-spec) lets you write evaluators, +end conditions, and selectors as strings instead of Python functions. CEL expressions are fully serializable, +making them editable in Studio and storable in the database. + +```bash +pip install cel-python +``` + +## Overview + +Three step types accept CEL expressions: + +| Step Type | Parameter | Must Return | Description | +|-----------|-----------|-------------|-------------| +| `Condition` | `evaluator` | `bool` | `True` runs `steps`, `False` runs `else_steps` | +| `Loop` | `end_condition` | `bool` | `True` exits the loop | +| `Router` | `selector` | `string` | Name of the step to execute from `choices` | + +Each step type exposes different context variables to the expression: + +| Variable | Type | Condition | Router | Loop | +|----------|------|:---------:|:------:|:----:| +| `input` | `string` | ✓ | ✓ | | +| `previous_step_content` | `string` | ✓ | ✓ | | +| `previous_step_outputs` | `map` | ✓ | ✓ | | +| `additional_data` | `map` | ✓ | ✓ | | +| `session_state` | `map` | ✓ | ✓ | | +| `step_choices` | `list` | | ✓ | | +| `current_iteration` | `int` | | | ✓ | +| `max_iterations` | `int` | | | ✓ | +| `all_success` | `bool` | | | ✓ | +| `last_step_content` | `string` | | | ✓ | +| `step_outputs` | `map` | | | ✓ | + +## Conditions + +Condition evaluators receive step input context and must return a boolean. `True` runs `steps`, `False` runs `else_steps`. + +### Route on input content + +```python +from agno.agent import Agent +from agno.models.openai import OpenAIChat +from agno.workflow import Condition, Step, Workflow + +urgent_handler = Agent( + name="Urgent Handler", + model=OpenAIChat(id="gpt-4o-mini"), + instructions="Handle urgent requests with high priority.", +) + +normal_handler = Agent( + name="Normal Handler", + model=OpenAIChat(id="gpt-4o-mini"), + instructions="Handle normal requests thoroughly.", +) + +workflow = Workflow( + name="CEL Input Routing", + steps=[ + Condition( + name="Urgent Check", + evaluator='input.contains("urgent")', + steps=[Step(name="Handle Urgent", agent=urgent_handler)], + else_steps=[Step(name="Handle Normal", agent=normal_handler)], + ), + ], +) + +workflow.print_response("This is an urgent request - please help immediately!") +``` + +### Branch on previous step output + +Run a classifier first, then route based on its output: + +```python +classifier = Agent( + name="Classifier", + model=OpenAIChat(id="gpt-4o-mini"), + instructions="Classify the request as TECHNICAL or GENERAL. Respond with one word.", +) + +workflow = Workflow( + name="Classify and Route", + steps=[ + Step(name="Classify", agent=classifier), + Condition( + name="Route by Classification", + evaluator='previous_step_content.contains("TECHNICAL")', + steps=[Step(name="Technical Help", agent=technical_agent)], + else_steps=[Step(name="General Help", agent=general_agent)], + ), + ], +) +``` + +### Branch on additional data + +```python +workflow = Workflow( + name="Priority Routing", + steps=[ + Condition( + name="Priority Gate", + evaluator="additional_data.priority > 5", + steps=[Step(name="High Priority", agent=high_priority_agent)], + else_steps=[Step(name="Low Priority", agent=low_priority_agent)], + ), + ], +) + +workflow.print_response("Review this report.", additional_data={"priority": 8}) +``` + +### Branch on session state + +```python +workflow = Workflow( + name="Retry Logic", + steps=[ + Step(name="Increment", executor=increment_retry), + Condition( + name="Retry Check", + evaluator="session_state.retry_count <= 3", + steps=[Step(name="Attempt", agent=retry_agent)], + else_steps=[Step(name="Give Up", agent=fallback_agent)], + ), + ], + session_state={"retry_count": 0}, +) +``` + +## Loops + +Loop end conditions receive loop output context and must return a boolean. `True` exits the loop. + +### Exit after N iterations + +```python +from agno.workflow import Loop, Step, Workflow + +workflow = Workflow( + name="Iteration Limit", + steps=[ + Loop( + name="Writing Loop", + max_iterations=10, + end_condition="current_iteration >= 2", + steps=[Step(name="Write", agent=writer)], + ), + ], +) +``` + +### Exit on output keyword + +```python +editor = Agent( + name="Editor", + model=OpenAIChat(id="gpt-4o-mini"), + instructions="Edit the text. When polished, include the word DONE at the end.", +) + +workflow = Workflow( + name="Content Keyword Loop", + steps=[ + Loop( + name="Editing Loop", + max_iterations=5, + end_condition='last_step_content.contains("DONE")', + steps=[Step(name="Edit", agent=editor)], + ), + ], +) +``` + +### Compound exit condition + +```python +workflow = Workflow( + name="Compound Exit", + steps=[ + Loop( + name="Research Loop", + max_iterations=5, + end_condition="all_success && current_iteration >= 2", + steps=[ + Step(name="Research", agent=researcher), + Step(name="Review", agent=reviewer), + ], + ), + ], +) +``` + +## Routers + +Router selectors receive step input context and must return a string matching a step name from `choices`. + +### Route on session state + +```python +from agno.workflow import Step, Workflow +from agno.workflow.router import Router + +workflow = Workflow( + name="Style Router", + steps=[ + Router( + name="Analysis Style", + selector="session_state.preferred_handler", + choices=[ + Step(name="Detailed Analyst", agent=detailed_agent), + Step(name="Brief Analyst", agent=brief_agent), + ], + ), + ], + session_state={"preferred_handler": "Brief Analyst"}, +) +``` + +### Ternary routing on input + +```python +workflow = Workflow( + name="Media Router", + steps=[ + Router( + name="Media Router", + selector='input.contains("video") ? "Video Handler" : "Image Handler"', + choices=[ + Step(name="Video Handler", agent=video_agent), + Step(name="Image Handler", agent=image_agent), + ], + ), + ], +) +``` + +### Route using step_choices index + +Reference steps by position instead of hardcoding names: + +```python +workflow = Workflow( + name="Index Router", + steps=[ + Router( + name="Analysis Router", + selector='input.contains("quick") ? step_choices[0] : step_choices[1]', + choices=[ + Step(name="Quick Analysis", agent=quick_analyzer), + Step(name="Detailed Analysis", agent=detailed_analyzer), + ], + ), + ], +) +``` + +## Developer Resources + +- [CEL specification](https://github.com/google/cel-spec) +- [Workflow reference](/reference/workflows/workflow) +- [Studio Workflows](/agent-os/studio/workflows) diff --git a/agent-os/studio/introduction.mdx b/agent-os/studio/introduction.mdx new file mode 100644 index 000000000..631c29265 --- /dev/null +++ b/agent-os/studio/introduction.mdx @@ -0,0 +1,97 @@ +--- +title: "Overview" +description: "A visual editor in AgentOS to build Agents, Teams, and Workflows." +--- + +Drag, drop, and orchestrate Agents, Teams, and Workflows on a live canvas to deploy production-ready agentic systems with AgentOS Studio. + +## Concepts + +| Concept | Description | +| --------------------------------------- | ----------------------------------------------------------------------------------- | +| [Agents](/agent-os/studio/agents) | Build and configure agents with models, tools, and instructions | +| [Teams](/agent-os/studio/teams) | Compose multi-agent teams with coordination modes | +| [Workflows](/agent-os/studio/workflows) | Design step-based workflows with conditions, loops, routers, and parallel execution | +| [Registry](/agent-os/studio/registry) | Browse and manage registered tools, models, databases, and schemas | + +## How It Works + +Studio connects to your running AgentOS instance and uses a Registry to populate available components. +Build visually, test interactively, and publish when ready. + +1. Register your components in a `Registry` +2. Pass the registry to `AgentOS` +3. Open Studio in the control plane to start building + +```python +from agno.os import AgentOS +from agno.registry import Registry +from agno.models.openai import OpenAIChat +from agno.tools.websearch import WebSearchTools + +registry = Registry( + name="My Registry", + tools=[WebSearchTools()], + models=[OpenAIChat(id="gpt-5-mini")], +) + +agent_os = AgentOS( + id="my-app", + registry=registry, +) + +app = agent_os.get_app() +``` + +## Development Lifecycle + +Studio manages the full development lifecycle from building to deploying complex agentic systems with AgentOS components. + +### 1. Build + +Create your agent, team, or workflow using the visual builder. Drag components from the Registry, configure properties, and wire everything together. + +### 2. Save Draft + +Save your work as a draft version. Drafts are not accessible via the API but can be tested, restored, and published later. You can save multiple draft versions to checkpoint your progress. + +### 3. Test + +Once saved, test your draft in the AgentOS Control Plane: + +- **Chat Page**: Interact with your agent, team, or workflow in real-time +- **View Traces**: Inspect tool calls, model responses, and reasoning for each run +- **Debug Mode**: Enable verbose logging to troubleshoot issues + + + Before publishing, test and make sure your agent handles edge cases and + unexpected inputs gracefully. + + +### 4. Publish + +Move from draft to production with one click. Publish the visual blueprint of your agentic system after verification. +Manage multiple versions of your system blueprint. Every published version is immediately +accessible via a unique API endpoint. Set any version as _Current_ to make it the default for your production API. + +### 5. Manage Versions + +Access the full version history for any agent, team, or workflow: + +- **Restore**: Load any previous version into the editor +- **Set Current**: Choose which published version is used by default when running via the API +- **Delete**: Remove old versions you no longer need + + + Use descriptive version labels like `v1.2-improved-instructions` or + `before-refactor` to make it easy to identify versions later. + + +## Next Steps + +| Task | Guide | +| ------------------- | ---------------------------------------------- | +| Build an agent | [Studio Agents](/agent-os/studio/agents) | +| Create a workflow | [Studio Workflows](/agent-os/studio/workflows) | +| Compose a team | [Studio Teams](/agent-os/studio/teams) | +| Set up the registry | [Studio Registry](/agent-os/studio/registry) | diff --git a/agent-os/studio/registry.mdx b/agent-os/studio/registry.mdx new file mode 100644 index 000000000..efc41f7d7 --- /dev/null +++ b/agent-os/studio/registry.mdx @@ -0,0 +1,84 @@ +--- +title: "Registry" +sidebarTitle: "Registry" +description: "Register tools, models, databases, and schemas for use in AgentOS Studio." +--- + +**The Registry manages non-serializable components (tools, models, databases, schemas, functions) that Studio depends on.** + +```python +from agno.db.postgres import PostgresDb +from agno.models.openai import OpenAIChat +from agno.models.anthropic import Claude +from agno.os import AgentOS +from agno.registry import Registry +from agno.tools.calculator import CalculatorTools +from agno.tools.websearch import WebSearchTools +from agno.vectordb.pgvector import PgVector +from pydantic import BaseModel + +class InputSchema(BaseModel): + input: str + description: str + +def custom_evaluator(input: str) -> bool: + return "urgent" in input.lower() + +db = PostgresDb(db_url="postgresql+psycopg://ai:ai@localhost:5532/ai", id="postgres_db") + +registry = Registry( + name="My Registry", + tools=[CalculatorTools(), WebSearchTools()], + models=[OpenAIChat(id="gpt-5-mini"), Claude(id="claude-sonnet-4-5")], + dbs=[db], + vector_dbs=[PgVector(db_url="postgresql+psycopg://ai:ai@localhost:5532/ai", table_name="embeddings")], + schemas=[InputSchema], + functions=[custom_evaluator], +) + +agent_os = AgentOS(id="my-app", registry=registry, db=db) +app = agent_os.get_app() +``` + +## Component Types + +| Type | Field | Description | +|------|-------|-------------| +| Tools | `tools` | `Toolkit` instances, `Function` objects, or plain callables | +| Models | `models` | Model provider instances (OpenAI, Anthropic, etc.) | +| Databases | `dbs` | `BaseDb` instances for storage | +| Vector DBs | `vector_dbs` | `VectorDb` instances for knowledge bases | +| Schemas | `schemas` | Pydantic `BaseModel` subclasses for structured I/O | +| Functions | `functions` | Python callables used as workflow evaluators, selectors, or executors | + +## Registry API + +The registry exposes a `GET /registry` endpoint through AgentOS with filtering and pagination. + +### Query Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `component_type` | `string` | `None` | Filter by type: `TOOL`, `MODEL`, `DB`, `VECTOR_DB`, `SCHEMA`, `FUNCTION` | +| `name` | `string` | `None` | Partial name match (case-insensitive) | +| `page` | `int` | `1` | Page number | +| `limit` | `int` | `20` | Items per page (1-100) | + +### Response Metadata + +Each component in the response includes type-specific metadata: + +| Component Type | Metadata Fields | +|---------------|-----------------| +| Tool | `class_path`, `parameters`, `signature`, toolkit `functions` | +| Model | `provider`, `model_id` | +| Database | `db_id` | +| Vector DB | `collection`, `table_name` | +| Schema | JSON schema definition | +| Function | `signature`, `parameters` | + +## Developer Resources + +- [Registry reference](/reference/agent-os/agent-os) +- [Studio overview](/agent-os/studio/introduction) +- [Workflow serialization](/agent-os/studio/workflows) diff --git a/agent-os/studio/teams.mdx b/agent-os/studio/teams.mdx new file mode 100644 index 000000000..a21d611ce --- /dev/null +++ b/agent-os/studio/teams.mdx @@ -0,0 +1,78 @@ +--- +title: "Teams" +sidebarTitle: "Teams" +description: "Compose multi-agent teams visually in AgentOS Studio." +--- + +Studio provides a **visual Team Builder** for composing multi-agent teams with coordination modes. +No code required. Drag agents onto the canvas, configure coordination, and run teams. + +## Creating Teams + +Create a new team by dragging agents from your [Registry](/agent-os/studio/registry) and configuring the team settings: + +| Setting | Description | +|---------|-------------| +| **Members** | Drag and drop agents to include in the team | +| **Mode** | Coordination mode: `coordinate`, `route`, or `collaborate` | +| **Instructions** | Team-level instructions for the leader agent | +| **Success Criteria** | Define when the team's task is complete | + + +Agents can be created directly in Studio or registered via code—both are available for team composition. + + +## Using Teams + +Teams built in Studio can be used in multiple ways: + +- **Chat directly** with the team via the Chat page +- **Use in Workflows** as step executors for complex automation + +## Save and Run + +Once your team is configured: + +1. **Save** your team to persist it to the registry +2. Navigate to the **Chat page** to interact with your team +3. Send tasks and watch agents collaborate in real-time +4. View individual agent contributions and coordination flow + +## Code Equivalent + +A team instance created in Studio directly maps to the SDK `Team` class: + +```python +from agno.agent import Agent +from agno.models.openai import OpenAIChat +from agno.team import Team +from agno.tools.hackernews import HackerNewsTools +from agno.tools.websearch import WebSearchTools + +researcher = Agent( + name="Researcher", + model=OpenAIChat(id="gpt-5-mini"), + tools=[WebSearchTools()], + instructions="Research topics thoroughly.", +) + +hn_analyst = Agent( + name="HN Analyst", + model=OpenAIChat(id="gpt-5-mini"), + tools=[HackerNewsTools()], + instructions="Find relevant HackerNews discussions.", +) + +team = Team( + name="Research Team", + mode="coordinate", + members=[researcher, hn_analyst], + instructions="Coordinate research across web and HackerNews.", +) +``` + +## Developer Resources + +- [Team reference](/reference/teams/team) +- [Building teams](/teams/building-teams) +- [Studio Agents](/agent-os/studio/agents) diff --git a/agent-os/studio/workflows.mdx b/agent-os/studio/workflows.mdx new file mode 100644 index 000000000..4a6a17a42 --- /dev/null +++ b/agent-os/studio/workflows.mdx @@ -0,0 +1,79 @@ +--- +title: "Overview" +description: "Design step-based workflows visually in AgentOS Studio." +--- + +Studio provides a **drag-and-drop Workflow Builder** for designing multi-step workflows visually. Create complex automation pipelines without writing code by dragging components onto the canvas and connecting them together. + +## Creating Steps + +Drag a step onto the canvas and configure its executor type in the properties panel. Each step can use one of the following executors: + +| Executor Type | Description | +|---------------|-------------| +| **Agent** | Execute the step using a registered agent from your OS | +| **Team** | Delegate the step to a multi-agent team for collaborative execution | +| **Custom Executor** | Use a custom function or script for specialized logic | + +## Step Types + +Beyond basic steps, you can build complex workflows using these step types: + +| Step Type | Description | +|-----------|-------------| +| `Step` | Single agent, team, or custom executor execution | +| `Steps` | Group of steps executed sequentially | +| `Condition` | Branch based on an evaluator function or CEL expression | +| `Loop` | Repeat steps until an end condition is met | +| `Router` | Select a step based on a selector function or CEL expression | +| `Parallel` | Execute multiple steps concurrently | + +These step types can be nested and composed together to build sophisticated automation pipelines while maintaining visual clarity. + +### Configuring Complex Steps + +Step types like `Condition`, `Router`, and `Loop` require logic to control their behavior—either a Python function or a CEL expression. For example, you can use a CEL expression to evaluate if the input contains the word "apple": + +```python +from agno.workflow import Condition, Step, Workflow + +condition = Condition( + name="apple_condition", + evaluator="input.contains('apple')", +) +``` + +Alternatively, you can use a function to evaluate the condition. +```python +from agno.workflow import Condition, Step, Workflow + +def is_apple(step_input) -> bool: + return "apple" in step_input.input + +condition = Condition( + name="apple_condition", + evaluator=is_apple, +) +``` + +## CEL Expressions + +Workflow steps support [CEL (Common Expression Language)](https://github.com/google/cel-spec) as an alternative to Python functions for evaluators, end conditions, and selectors. CEL expressions are strings that can be serialized and edited directly in Studio without code. + +See [CEL Expressions](/agent-os/studio/cel-expressions) for full usage, context variables, and examples. + +## Save and Run + +Once your workflow is designed: + +1. **Save** your workflow to persist it to the registry +2. Navigate to the **Chat page** to run your workflow interactively +3. Provide input and watch the workflow execute step-by-step +4. View results and logs for each step in real-time + +## Developer Resources + +- [Workflow reference](/reference/workflows/workflow) +- [Building workflows](/workflows/building-workflows) +- [Workflow patterns](/workflows/workflow-patterns/overview) +- [Studio Registry](/agent-os/studio/registry) diff --git a/agno-docs-style/styles/config/vocabularies/AgnoStyle/accept.txt b/agno-docs-style/styles/config/vocabularies/AgnoStyle/accept.txt index 1e99cbfbc..ca43d3ab7 100644 --- a/agno-docs-style/styles/config/vocabularies/AgnoStyle/accept.txt +++ b/agno-docs-style/styles/config/vocabularies/AgnoStyle/accept.txt @@ -444,6 +444,7 @@ search_query search_session_history searchscraper Searxng +serializable Serpapi serverless Serverless @@ -474,6 +475,7 @@ step_name step_started steps_execution_completed steps_execution_started +storable store_events store_member_responses stream_events diff --git a/docs.json b/docs.json index 8b965f986..de144e689 100644 --- a/docs.json +++ b/docs.json @@ -2784,6 +2784,22 @@ "agent-os/knowledge/filter-knowledge" ] }, + { + "group": "Studio", + "pages": [ + "agent-os/studio/introduction", + "agent-os/studio/agents", + "agent-os/studio/teams", + { + "group": "Workflows", + "pages": [ + "agent-os/studio/workflows", + "agent-os/studio/cel-expressions" + ] + }, + "agent-os/studio/registry" + ] + }, "agent-os/config", "agent-os/background-tasks/overview", "agent-os/lifespan", @@ -3536,6 +3552,29 @@ "reference-api/schema/knowledge/delete-content-by-id" ] }, + { + "group": "Components", + "pages": [ + "reference-api/schema/components/list-components", + "reference-api/schema/components/create-component", + "reference-api/schema/components/get-component", + "reference-api/schema/components/update-component", + "reference-api/schema/components/delete-component", + "reference-api/schema/components/list-configs", + "reference-api/schema/components/create-config", + "reference-api/schema/components/get-current-config", + "reference-api/schema/components/get-config-version", + "reference-api/schema/components/update-config", + "reference-api/schema/components/delete-config-version", + "reference-api/schema/components/set-current-config" + ] + }, + { + "group": "Registry", + "pages": [ + "reference-api/schema/registry/list-registry" + ] + }, { "group": "Metrics", "pages": [ diff --git a/reference-api/schema/components/create-component.mdx b/reference-api/schema/components/create-component.mdx new file mode 100644 index 000000000..67ed3931d --- /dev/null +++ b/reference-api/schema/components/create-component.mdx @@ -0,0 +1,39 @@ +--- +title: "Create Component" +sidebarTitle: "Create Component" +description: "Create a new component (agent, team, or workflow)." +api: "POST /components" +--- + +## Request Body + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `name` | `string` | Yes | Display name for the component | +| `component_id` | `string` | No | Unique ID (auto-generated from name if omitted) | +| `component_type` | `string` | Yes | One of: `agent`, `team`, `workflow` | +| `description` | `string` | No | Description of the component | +| `metadata` | `dict` | No | Additional metadata | +| `config` | `dict` | No | Initial configuration | +| `label` | `string` | No | Version label | +| `stage` | `string` | No | Version stage (default: `draft`) | +| `notes` | `string` | No | Version notes | +| `set_current` | `bool` | No | Set this version as current | + +```json +{ + "name": "Research Agent", + "component_type": "agent", + "description": "An agent that researches topics", + "config": { + "model": "gpt-5-mini", + "tools": ["WebSearchTools"], + "instructions": "Research topics thoroughly." + }, + "stage": "draft" +} +``` + +## Response `201` + +Returns a `ComponentResponse` with the created component. diff --git a/reference-api/schema/components/create-config.mdx b/reference-api/schema/components/create-config.mdx new file mode 100644 index 000000000..1e609c5cc --- /dev/null +++ b/reference-api/schema/components/create-config.mdx @@ -0,0 +1,28 @@ +--- +title: "Create Config Version" +sidebarTitle: "Create Config Version" +description: "Create a new config version for a component." +api: "POST /components/{component_id}/configs" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | + +## Request Body + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `config` | `dict` | Yes | The configuration data | +| `version` | `int` | No | Version number (auto-incremented if omitted) | +| `label` | `string` | No | Version label (e.g., `v1.0`, `beta`) | +| `stage` | `string` | No | Version stage (default: `draft`) | +| `notes` | `string` | No | Version notes | +| `links` | `list` | No | Links to child components | +| `set_current` | `bool` | No | Set this version as current | + +## Response `201` + +Returns a `ComponentConfigResponse` with the created config version. diff --git a/reference-api/schema/components/delete-component.mdx b/reference-api/schema/components/delete-component.mdx new file mode 100644 index 000000000..2667f594b --- /dev/null +++ b/reference-api/schema/components/delete-component.mdx @@ -0,0 +1,16 @@ +--- +title: "Delete Component" +sidebarTitle: "Delete Component" +description: "Delete a component and all its config versions." +api: "DELETE /components/{component_id}" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | + +## Response `204` + +No content. The component and all its config versions are deleted. diff --git a/reference-api/schema/components/delete-config-version.mdx b/reference-api/schema/components/delete-config-version.mdx new file mode 100644 index 000000000..b6f3801c1 --- /dev/null +++ b/reference-api/schema/components/delete-config-version.mdx @@ -0,0 +1,17 @@ +--- +title: "Delete Config Version" +sidebarTitle: "Delete Config Version" +description: "Delete a specific config version." +api: "DELETE /components/{component_id}/configs/{version}" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | +| `version` | `int` | The version number | + +## Response `204` + +No content. The config version is deleted. diff --git a/reference-api/schema/components/get-component.mdx b/reference-api/schema/components/get-component.mdx new file mode 100644 index 000000000..10f0cba44 --- /dev/null +++ b/reference-api/schema/components/get-component.mdx @@ -0,0 +1,29 @@ +--- +title: "Get Component" +sidebarTitle: "Get Component" +description: "Get details of a specific component by ID." +api: "GET /components/{component_id}" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | + +## Response `200` + +Returns a `ComponentResponse`. + +```json +{ + "component_id": "my-research-agent", + "component_type": "agent", + "name": "Research Agent", + "description": "An agent that researches topics", + "current_version": 3, + "metadata": {}, + "created_at": "2025-01-15T10:30:00Z", + "updated_at": "2025-01-16T14:20:00Z" +} +``` diff --git a/reference-api/schema/components/get-config-version.mdx b/reference-api/schema/components/get-config-version.mdx new file mode 100644 index 000000000..ad417cbd2 --- /dev/null +++ b/reference-api/schema/components/get-config-version.mdx @@ -0,0 +1,17 @@ +--- +title: "Get Config Version" +sidebarTitle: "Get Config Version" +description: "Get a specific config version for a component." +api: "GET /components/{component_id}/configs/{version}" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | +| `version` | `int` | The version number | + +## Response `200` + +Returns the `ComponentConfigResponse` for the specified version. diff --git a/reference-api/schema/components/get-current-config.mdx b/reference-api/schema/components/get-current-config.mdx new file mode 100644 index 000000000..cfeadc1d1 --- /dev/null +++ b/reference-api/schema/components/get-current-config.mdx @@ -0,0 +1,33 @@ +--- +title: "Get Current Config" +sidebarTitle: "Get Current Config" +description: "Get the current (active) config version for a component." +api: "GET /components/{component_id}/configs/current" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | + +## Response `200` + +Returns the `ComponentConfigResponse` for the current active version. + +```json +{ + "component_id": "my-research-agent", + "version": 3, + "label": "v1.2", + "stage": "published", + "config": { + "model": "gpt-5-mini", + "tools": ["WebSearchTools"], + "instructions": "Research topics thoroughly using web search." + }, + "notes": "Improved instructions", + "created_at": "2025-01-16T14:20:00Z", + "updated_at": "2025-01-16T14:20:00Z" +} +``` diff --git a/reference-api/schema/components/list-components.mdx b/reference-api/schema/components/list-components.mdx new file mode 100644 index 000000000..3c744cd70 --- /dev/null +++ b/reference-api/schema/components/list-components.mdx @@ -0,0 +1,42 @@ +--- +title: "List Components" +sidebarTitle: "List Components" +description: "List all components with optional filtering and pagination." +api: "GET /components" +--- + +## Query Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `component_type` | `string` | `None` | Filter by type: `agent`, `team`, `workflow` | +| `page` | `int` | `1` | Page number (≥ 1) | +| `limit` | `int` | `20` | Items per page (1-100) | + +## Response `200` + +Returns a `PaginatedResponse[ComponentResponse]`. + +```json +{ + "data": [ + { + "component_id": "my-research-agent", + "component_type": "agent", + "name": "Research Agent", + "description": "An agent that researches topics", + "current_version": 3, + "metadata": {}, + "created_at": "2025-01-15T10:30:00Z", + "updated_at": "2025-01-16T14:20:00Z" + } + ], + "meta": { + "page": 1, + "limit": 20, + "total_pages": 1, + "total_count": 1, + "search_time_ms": 5 + } +} +``` diff --git a/reference-api/schema/components/list-configs.mdx b/reference-api/schema/components/list-configs.mdx new file mode 100644 index 000000000..95e978826 --- /dev/null +++ b/reference-api/schema/components/list-configs.mdx @@ -0,0 +1,47 @@ +--- +title: "List Config Versions" +sidebarTitle: "List Config Versions" +description: "List all config versions for a component." +api: "GET /components/{component_id}/configs" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | + +## Query Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `include_config` | `bool` | `true` | Include the full config dict in the response | + +## Response `200` + +Returns a `List[ComponentConfigResponse]`. + +```json +[ + { + "component_id": "my-research-agent", + "version": 1, + "label": "v1.0", + "stage": "published", + "config": { ... }, + "notes": "Initial version", + "created_at": "2025-01-15T10:30:00Z", + "updated_at": "2025-01-15T10:30:00Z" + }, + { + "component_id": "my-research-agent", + "version": 2, + "label": "v1.1-improved-instructions", + "stage": "draft", + "config": { ... }, + "notes": "Updated instructions", + "created_at": "2025-01-16T14:20:00Z", + "updated_at": "2025-01-16T14:20:00Z" + } +] +``` diff --git a/reference-api/schema/components/set-current-config.mdx b/reference-api/schema/components/set-current-config.mdx new file mode 100644 index 000000000..fcf104bff --- /dev/null +++ b/reference-api/schema/components/set-current-config.mdx @@ -0,0 +1,17 @@ +--- +title: "Set Current Config" +sidebarTitle: "Set Current Config" +description: "Set a specific config version as the current active version." +api: "POST /components/{component_id}/configs/{version}/set-current" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | +| `version` | `int` | The version number to set as current | + +## Response `200` + +Returns the updated `ComponentResponse` with the new `current_version`. diff --git a/reference-api/schema/components/update-component.mdx b/reference-api/schema/components/update-component.mdx new file mode 100644 index 000000000..791db4f9d --- /dev/null +++ b/reference-api/schema/components/update-component.mdx @@ -0,0 +1,28 @@ +--- +title: "Update Component" +sidebarTitle: "Update Component" +description: "Update a component's metadata." +api: "PATCH /components/{component_id}" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | + +## Request Body + +All fields are optional. + +| Field | Type | Description | +|-------|------|-------------| +| `name` | `string` | Updated display name | +| `description` | `string` | Updated description | +| `component_type` | `string` | Updated type | +| `metadata` | `dict` | Updated metadata | +| `current_version` | `int` | Set the current version number | + +## Response `200` + +Returns the updated `ComponentResponse`. diff --git a/reference-api/schema/components/update-config.mdx b/reference-api/schema/components/update-config.mdx new file mode 100644 index 000000000..f2a751883 --- /dev/null +++ b/reference-api/schema/components/update-config.mdx @@ -0,0 +1,29 @@ +--- +title: "Update Config Version" +sidebarTitle: "Update Config Version" +description: "Update a specific config version." +api: "PATCH /components/{component_id}/configs/{version}" +--- + +## Path Parameters + +| Parameter | Type | Description | +|-----------|------|-------------| +| `component_id` | `string` | The component ID | +| `version` | `int` | The version number | + +## Request Body + +All fields are optional. + +| Field | Type | Description | +|-------|------|-------------| +| `config` | `dict` | Updated configuration data | +| `label` | `string` | Updated version label | +| `stage` | `string` | Updated stage (`draft`, `published`) | +| `notes` | `string` | Updated notes | +| `links` | `list` | Updated child component links | + +## Response `200` + +Returns the updated `ComponentConfigResponse`. diff --git a/reference-api/schema/registry/list-registry.mdx b/reference-api/schema/registry/list-registry.mdx new file mode 100644 index 000000000..bfd46a383 --- /dev/null +++ b/reference-api/schema/registry/list-registry.mdx @@ -0,0 +1,73 @@ +--- +title: "List Registry" +sidebarTitle: "List Registry" +description: "List all registered components (tools, models, databases, schemas, functions) with filtering and pagination." +api: "GET /registry" +--- + +## Query Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `component_type` | `string` | `None` | Filter by registry item type: `tool`, `model`, `db`, `vector_db`, `schema`, `function` | +| `name` | `string` | `None` | Partial name match (case-insensitive) | +| `page` | `int` | `1` | Page number (≥ 1) | +| `limit` | `int` | `20` | Items per page (1-100) | + +## Response `200` + +Returns a `PaginatedResponse[RegistryContentResponse]`. + +Each item includes type-specific metadata: + +| Component Type | Metadata Fields | +|---------------|-----------------| +| `tool` | `class_path`, `parameters`, `signature`, toolkit `functions` | +| `model` | `class_path`, `provider`, `model_id` | +| `db` | `class_path`, `db_id` | +| `vector_db` | `class_path`, `collection`, `table_name` | +| `schema` | `json_schema` | +| `function` | `name`, `signature`, `parameters` | + +```json +{ + "data": [ + { + "name": "WebSearchTools", + "type": "tool", + "description": "Tools for searching the web", + "metadata": { + "class_path": "agno.tools.websearch.WebSearchTools", + "has_entrypoint": true, + "parameters": {}, + "functions": [ + { + "name": "web_search", + "description": "Search the web for a query", + "parameters": { + "query": {"type": "string"} + } + } + ] + } + }, + { + "name": "OpenAIChat", + "type": "model", + "description": null, + "metadata": { + "class_path": "agno.models.openai.OpenAIChat", + "provider": "OpenAI", + "model_id": "gpt-5-mini" + } + } + ], + "meta": { + "page": 1, + "limit": 20, + "total_pages": 1, + "total_count": 2, + "search_time_ms": 3 + } +} +```