{
  "agent_manifest_version": "1.2",
  "site": {
    "name": "QevosAgent",
    "url": "https://qevos.ai",
    "description": "Free, open-source local AI Agent supporting Qwen3, DeepSeek V4, Gemma 4, Claude and more. Persistent memory, tool calling, web dashboard.",
    "description_zh": "免费开源的本地AI Agent，支持Qwen3、DeepSeek V4、Gemma 4、Claude等模型。持久记忆、工具调用、Web Dashboard。",
    "languages": [
      "en",
      "zh"
    ],
    "primary_language": "en",
    "last_updated": "2026-05-18"
  },
  "agent_endpoints": {
    "discover": {
      "url": "/agent-manifest.json",
      "method": "GET",
      "description": "Structured site information - Agent first stop",
      "response_schema": {
        "type": "object",
        "required_fields": [
          "agent_manifest_version",
          "site",
          "agent_endpoints"
        ],
        "optional_fields": [
          "navigation",
          "rate_limit",
          "contact"
        ]
      }
    },
    "blog_index": {
      "url": "/api/agent/blog-index.json",
      "method": "GET",
      "description": "Full blog index with all posts metadata. Returns all posts in a single response.",
      "response_schema": {
        "type": "object",
        "required_fields": [
          "endpoint",
          "total_posts",
          "posts"
        ],
        "post_fields": {
          "required": [
            "slug",
            "title",
            "date",
            "summary",
            "tags",
            "language",
            "content_url",
            "html_url"
          ],
          "optional": [
            "title_zh",
            "summary_zh",
            "html_url_zh"
          ]
        }
      }
    },
    "search_index": {
      "url": "/api/agent/search.json",
      "method": "GET",
      "description": "Static search index for client-side filtering. Returns all posts with a 'search_index' field containing normalized text for keyword matching. Filter client-side by checking if keyword appears in search_index field.",
      "note": "This is a STATIC file. No query parameters are supported. Filter results client-side.",
      "response_schema": {
        "type": "object",
        "required_fields": [
          "endpoint",
          "total_posts",
          "posts"
        ],
        "post_fields": {
          "required": [
            "slug",
            "title",
            "date",
            "summary",
            "tags",
            "language",
            "search_index"
          ],
          "optional": [
            "title_zh",
            "summary_zh"
          ]
        }
      },
      "parameters": []
    },
    "content": {
      "url": "/api/agent/content/{slug}.json",
      "method": "GET",
      "description": "Get full article content in structured JSON format with sections parsed from Markdown headings.",
      "response_schema": {
        "type": "object",
        "required_fields": [
          "endpoint",
          "slug",
          "title",
          "date",
          "summary",
          "tags",
          "language",
          "sections"
        ],
        "optional_fields": [
          "title_zh",
          "summary_zh",
          "html_url_zh",
          "sections_zh"
        ],
        "section_fields": {
          "required": [
            "id",
            "heading",
            "content"
          ],
          "description": "Each section corresponds to a ## heading in the Markdown source"
        }
      },
      "errors": {
        "404": {
          "code": "NOT_FOUND",
          "message": "Article with this slug does not exist",
          "response": {
            "error": {
              "code": "NOT_FOUND",
              "slug": "..."
            }
          }
        }
      },
      "parameters": [
        {
          "name": "slug",
          "in": "path",
          "required": true,
          "type": "string",
          "description": "Article slug (from blog-index.json)"
        }
      ]
    }
  },
  "content_types": {
    "default": "application/json",
    "supported": [
      "application/json"
    ],
    "note": "All Agent API endpoints return application/json. Content negotiation is not implemented."
  },
  "navigation": {
    "home": {
      "en": "/",
      "zh": "/cn.html"
    },
    "blog": {
      "en": "/blog_en.html",
      "zh": "/blog_cn.html"
    },
    "quickstart": {
      "en": "/quickstart_en.html",
      "zh": "/quickstart_cn.html"
    },
    "github": "https://github.com/HongyunQiu/QevosAgent",
    "discord": "https://discord.gg/tX2BrQmeD7"
  },
  "rate_limit": {
    "requests_per_minute": 100,
    "requests_per_hour": 1000,
    "note": "Please identify yourself with User-Agent header"
  },
  "error_handling": {
    "404": {
      "description": "Resource not found. For /api/agent/content/{slug}.json, this means the slug does not exist.",
      "response_format": "HTML (standard Nginx 404 page). Note: JSON error bodies are not yet implemented for static hosting.",
      "action": "Verify the slug against /api/agent/blog-index.json"
    },
    "429": {
      "description": "Rate limit exceeded.",
      "response_format": "HTML (standard Nginx 429 page)",
      "action": "Wait before retrying. Limit: 100 requests/minute"
    },
    "500": {
      "description": "Server error.",
      "response_format": "HTML (standard Nginx 500 page)",
      "action": "Try again later"
    }
  },
  "update_frequency": "weekly",
  "contact": {
    "github_issues": "https://github.com/HongyunQiu/QevosAgent/issues",
    "discord": "https://discord.gg/tX2BrQmeD7"
  },
  "last_updated": "2026-06-04"
}