yao/agent
Max fea1ac0708 Add user attachment handling in Claude executor
- Introduce functionality to resolve and manage user-uploaded files in the sandbox environment.
- Implement `prepareAttachments` method to convert attachment URLs to local file paths and handle duplicates.
- Update message processing to replace attachment content with text references, allowing Claude CLI to access files using Read and Bash tools.
- Enhance documentation to inform users about the new attachment handling capabilities.

This change improves the interaction with user-uploaded files, enabling better integration within the Claude CLI environment.
2026-02-08 11:49:51 +08:00
..
assistant Add secure proxy configuration with options and secrets support 2026-01-31 22:46:48 +08:00
caller Fix SystemPrompt passing and Claude CLI stream-json parsing 2026-01-31 15:07:40 +08:00
content Enhance PDF and Content Processing with New File Handling Features 2025-12-29 15:20:38 +08:00
context Add sandbox ID and VNC URL methods to sandbox executor 2026-02-05 21:46:07 +08:00
docs Enhance Sandbox API and Integration Tests 2026-01-30 17:56:57 +08:00
i18n Add secure proxy configuration with options and secrets support 2026-01-31 22:46:48 +08:00
llm Refactor Yao app initialization and enhance error handling 2026-02-04 19:04:23 +08:00
memory Enhance JSAPI and Context Management for Sub-Agent Calls 2026-01-26 10:48:00 +08:00
output Implement Agent-to-Agent Call Enhancements and Context Management 2026-01-26 18:14:34 +08:00
robot Add Execution Completion Callback to Worker Pool 2026-01-28 19:35:38 +08:00
sandbox Add user attachment handling in Claude executor 2026-02-08 11:49:51 +08:00
search Enhance PDF and Content Processing with New File Handling Features 2025-12-29 15:20:38 +08:00
store Add secure proxy configuration with options and secrets support 2026-01-31 22:46:48 +08:00
test Enhance Agent Documentation and Add Extract Command Functionality 2026-01-27 10:57:27 +08:00
testutils Update Dependencies and Enhance Agent Context with Forked Context Support 2026-01-25 20:32:02 +08:00
types Enhance Assistant Configuration with RobotPrompt Support 2026-01-22 18:55:30 +08:00
agent_test.go ⚠️ BREAKING: Removed the Studio package and renamed Neo to Agent. Configuration file path changed from neo/neo.yml to agent/agent.yml. 2025-11-06 18:13:54 +08:00
load.go Enhance Assistant Configuration with RobotPrompt Support 2026-01-22 18:55:30 +08:00
load_test.go Implement search configuration management and testing enhancements 2025-12-13 11:19:20 +08:00
README.md Enhance Agent Documentation and Add Extract Command Functionality 2026-01-27 10:57:27 +08:00

Yao Agent

A powerful AI assistant framework for building intelligent conversational agents with tool integration, knowledge base search, and multi-agent orchestration.

Quick Start

1. Create an Assistant

assistants/
└── my-assistant/
    ├── package.yao      # Configuration
    ├── prompts.yml      # System prompts
    └── locales/
        └── en-us.yml    # Translations

package.yao

{
  "name": "{{ name }}",
  "connector": "gpt-4o",
  "description": "{{ description }}",
  "placeholder": {
    "title": "{{ chat.title }}",
    "prompts": ["{{ chat.prompts.0 }}"]
  }
}

prompts.yml

- role: system
  content: |
    You are a helpful assistant.

locales/en-us.yml

name: My Assistant
description: A helpful AI assistant
chat:
  title: New Chat
  prompts:
    - How can I help you today?

2. Add Hooks (Optional)

Create src/index.ts for custom logic:

import { agent } from "@yao/runtime";

function Create(ctx: agent.Context, messages: agent.Message[]): agent.Create {
  // Preprocess messages before LLM call
  return { messages };
}

function Next(ctx: agent.Context, payload: agent.Payload): agent.Next {
  // Post-process LLM response
  return null;
}

3. Test (Optional)

# Run tests
yao agent test -i "Hello, how are you?"

# Run tests from JSONL file
yao agent test -i tests/inputs.jsonl -v

# Extract results for review
yao agent extract output-*.jsonl

4. Run

yao start

Access via API: POST /v1/chat/completions

Examples

Hook: Route to Specialist

// src/index.ts
function Create(ctx: agent.Context, messages: agent.Message[]): agent.Create {
  const last = messages[messages.length - 1]?.content || "";
  if (last.includes("refund")) {
    return { delegate: { agent_id: "refund-specialist", messages } };
  }
  return null;
}

Database Query

// package.yao - Enable auto DB search
{ "db": { "models": ["orders", "products"] } }
# Test: Agent auto-generates QueryDSL and searches database
yao agent test -i "Find orders over $1000 from last month"

MCP Tools (Process Transport)

// mcps/tools.mcp.yao - Define MCP server with Yao Processes
{
  "label": "Tools",
  "transport": "process",
  "tools": {
    "search_orders": "models.order.Paginate",
    "create_order": "models.order.Create"
  }
}
// mcps/mapping/tools/schemes/search_orders.in.yao - Input schema
{
  "type": "object",
  "properties": {
    "keyword": { "type": "string" },
    "page": { "type": "integer" }
  },
  "x-process-args": [":arguments"]
}
// package.yao
{ "mcp": { "servers": [{ "server_id": "tools" }] } }

Sidebar Page (Display Data)

Pages render in the right sidebar during conversation to display structured data:

<!-- pages/result/result.html - Display query results -->
<div class="result-panel">
  <h3>{{ title }}</h3>
  <table s:if="{{ rows.length > 0 }}">
    <tr s:for="{{ rows }}" s:for-item="row">
      <td>{{ row.name }}</td>
      <td>{{ row.value }}</td>
    </tr>
  </table>
</div>
yao sui build agent    # Build pages
// In hook: send action to open page in sidebar
ctx.Send({
  type: "action",
  props: {
    name: "navigate",
    payload: {
      route: "/agents/my-assistant/result",
      title: "Query Results",
      query: { id: "123" }, // Passed as $query in page
    },
  },
});

Documentation

Architecture

flowchart LR
    subgraph Request
        A[User Request]
    end

    subgraph Create["Create Hook"]
        B1[Preprocess Messages]
        B2[Configure LLM]
        B3[Delegate to Agent]
    end

    subgraph LLM["LLM Call"]
        C1[Load Prompts]
        C2[Generate Response]
    end

    subgraph Tools["Tool Execution"]
        D1[MCP Tools]
        D2[Search]
        D3[Memory]
    end

    subgraph Next["Next Hook"]
        E1[Process Results]
        E2[Transform Output]
        E3[Delegate to Agent]
    end

    subgraph Response
        F[Stream Response]
    end

    A --> Create
    Create --> LLM
    LLM --> Tools
    Tools --> Next
    Next --> Response
    Next -.->|Continue| LLM

API Endpoints

OpenAPI endpoints (base URL: /v1):

Endpoint Method Description
/v1/chat/completions POST Chat with assistant
/v1/chat/sessions GET List chat sessions
/v1/chat/sessions/:chat_id GET Get chat session
/v1/chat/sessions/:chat_id/messages GET Get messages
/v1/agent/assistants GET List assistants
/v1/agent/assistants/:id GET Get assistant details
/v1/file/:uploaderID POST Upload files
/v1/file/:uploaderID/:fileID GET Get file info
/v1/file/:uploaderID/:fileID/content GET Download file

License

This project is part of the Yao App Engine and follows the Yao Open Source License.