OSS restructuring for open-core model: - Rename package from agentserver/ to xml_pipeline/ - Update all imports (44 Python files, 31 docs/configs) - Update pyproject.toml for OSS distribution (v0.3.0) - Move prompt_toolkit from core to optional [console] extra - Remove auth/server/lsp from core optional deps (-> Nextra) New console example in examples/console/: - Self-contained demo with handlers and config - Uses prompt_toolkit (optional, falls back to input()) - No password auth, no TUI, no LSP — just the basics - Shows how to use xml-pipeline as a library Import changes: - from agentserver.* -> from xml_pipeline.* - CLI entry points updated: xml_pipeline.cli:main Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
381 lines
14 KiB
Python
381 lines
14 KiB
Python
"""
|
|
JSON Schema for organism.yaml files.
|
|
|
|
This schema enables yaml-language-server to provide:
|
|
- Autocompletion for fields
|
|
- Validation of field types
|
|
- Documentation on hover
|
|
"""
|
|
|
|
ORGANISM_SCHEMA = {
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"$id": "https://xml-pipeline.org/schemas/organism.schema.json",
|
|
"title": "Organism Configuration",
|
|
"description": "Configuration for an xml-pipeline organism",
|
|
"type": "object",
|
|
"required": ["organism"],
|
|
"additionalProperties": False,
|
|
"properties": {
|
|
"organism": {
|
|
"type": "object",
|
|
"description": "Core organism settings",
|
|
"required": ["name"],
|
|
"additionalProperties": False,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Unique name for this organism",
|
|
"pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$",
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"description": "WebSocket server port",
|
|
"default": 8765,
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
},
|
|
"version": {
|
|
"type": "string",
|
|
"description": "Organism version (semver)",
|
|
"default": "0.1.0",
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Human-readable description",
|
|
},
|
|
"identity": {
|
|
"type": "string",
|
|
"description": "Path to Ed25519 private key for signing",
|
|
},
|
|
"thread_scheduling": {
|
|
"type": "string",
|
|
"description": "Thread execution policy",
|
|
"enum": ["breadth-first", "depth-first"],
|
|
"default": "breadth-first",
|
|
},
|
|
"max_concurrent_pipelines": {
|
|
"type": "integer",
|
|
"description": "Maximum concurrent pipeline executions",
|
|
"default": 100,
|
|
"minimum": 1,
|
|
},
|
|
"max_concurrent_handlers": {
|
|
"type": "integer",
|
|
"description": "Maximum concurrent handler executions",
|
|
"default": 50,
|
|
"minimum": 1,
|
|
},
|
|
"max_concurrent_per_agent": {
|
|
"type": "integer",
|
|
"description": "Maximum concurrent requests per agent",
|
|
"default": 5,
|
|
"minimum": 1,
|
|
},
|
|
},
|
|
},
|
|
"tls": {
|
|
"type": "object",
|
|
"description": "TLS configuration for WebSocket server",
|
|
"properties": {
|
|
"cert": {
|
|
"type": "string",
|
|
"description": "Path to certificate file (PEM)",
|
|
},
|
|
"key": {
|
|
"type": "string",
|
|
"description": "Path to private key file (PEM)",
|
|
},
|
|
},
|
|
},
|
|
"oob": {
|
|
"type": "object",
|
|
"description": "Out-of-band privileged channel configuration",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": True,
|
|
},
|
|
"bind": {
|
|
"type": "string",
|
|
"description": "Bind address (localhost only for security)",
|
|
"default": "127.0.0.1",
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"description": "OOB channel port",
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
},
|
|
"unix_socket": {
|
|
"type": "string",
|
|
"description": "Unix socket path (alternative to port)",
|
|
},
|
|
},
|
|
},
|
|
"meta": {
|
|
"type": "object",
|
|
"description": "Introspection settings",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": True,
|
|
},
|
|
"allow_list_capabilities": {
|
|
"type": "boolean",
|
|
"default": True,
|
|
},
|
|
"allow_schema_requests": {
|
|
"type": "string",
|
|
"enum": ["admin", "authenticated", "none"],
|
|
"default": "admin",
|
|
},
|
|
"allow_example_requests": {
|
|
"type": "string",
|
|
"enum": ["admin", "authenticated", "none"],
|
|
"default": "admin",
|
|
},
|
|
"allow_prompt_requests": {
|
|
"type": "string",
|
|
"enum": ["admin", "authenticated", "none"],
|
|
"default": "admin",
|
|
},
|
|
"allow_remote": {
|
|
"type": "boolean",
|
|
"description": "Allow federation peers to query meta",
|
|
"default": False,
|
|
},
|
|
},
|
|
},
|
|
"listeners": {
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"description": "Inline listener configurations (legacy format)",
|
|
"items": {
|
|
"$ref": "#/$defs/listener",
|
|
},
|
|
},
|
|
{
|
|
"type": "object",
|
|
"description": "Split listener configuration",
|
|
"properties": {
|
|
"directory": {
|
|
"type": "string",
|
|
"description": "Path to listeners directory",
|
|
"default": "~/.xml-pipeline/listeners",
|
|
},
|
|
"include": {
|
|
"type": "array",
|
|
"description": "Glob patterns to include",
|
|
"items": {"type": "string"},
|
|
"default": ["*.yaml"],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
"gateways": {
|
|
"type": "array",
|
|
"description": "Federation gateway configurations",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Gateway identifier",
|
|
},
|
|
"remote_url": {
|
|
"type": "string",
|
|
"description": "Remote organism WebSocket URL",
|
|
"format": "uri",
|
|
},
|
|
"trusted_identity": {
|
|
"type": "string",
|
|
"description": "Path to trusted public key",
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"llm": {
|
|
"type": "object",
|
|
"description": "LLM router configuration",
|
|
"properties": {
|
|
"strategy": {
|
|
"type": "string",
|
|
"description": "Backend selection strategy",
|
|
"enum": ["failover", "round-robin", "least-loaded"],
|
|
"default": "failover",
|
|
},
|
|
"retries": {
|
|
"type": "integer",
|
|
"description": "Max retry attempts per request",
|
|
"default": 3,
|
|
"minimum": 0,
|
|
},
|
|
"retry_base_delay": {
|
|
"type": "number",
|
|
"description": "Base delay for exponential backoff (seconds)",
|
|
"default": 1.0,
|
|
},
|
|
"retry_max_delay": {
|
|
"type": "number",
|
|
"description": "Maximum delay between retries (seconds)",
|
|
"default": 60.0,
|
|
},
|
|
"backends": {
|
|
"type": "array",
|
|
"description": "LLM backend configurations",
|
|
"items": {
|
|
"$ref": "#/$defs/llmBackend",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"server": {
|
|
"type": "object",
|
|
"description": "WebSocket server configuration",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": False,
|
|
},
|
|
"host": {
|
|
"type": "string",
|
|
"default": "127.0.0.1",
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"default": 8765,
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
},
|
|
},
|
|
},
|
|
"auth": {
|
|
"type": "object",
|
|
"description": "Authentication configuration",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": False,
|
|
},
|
|
"totp_secret_env": {
|
|
"type": "string",
|
|
"description": "Environment variable containing TOTP secret",
|
|
"default": "ORGANISM_TOTP_SECRET",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"$defs": {
|
|
"listener": {
|
|
"type": "object",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Unique listener name",
|
|
"pattern": "^[a-zA-Z][a-zA-Z0-9_.-]*$",
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Human-readable description (required for tool prompts)",
|
|
},
|
|
"agent": {
|
|
"type": "boolean",
|
|
"description": "LLM-powered agent (requires unique root tag)",
|
|
"default": False,
|
|
},
|
|
"tool": {
|
|
"type": "boolean",
|
|
"description": "Simple tool/function handler",
|
|
"default": False,
|
|
},
|
|
"gateway": {
|
|
"type": "boolean",
|
|
"description": "Federation gateway",
|
|
"default": False,
|
|
},
|
|
"broadcast": {
|
|
"type": "boolean",
|
|
"description": "Allow shared root tag with other listeners",
|
|
"default": False,
|
|
},
|
|
"handler": {
|
|
"type": "string",
|
|
"description": "Python import path to handler function",
|
|
},
|
|
"payload_class": {
|
|
"type": "string",
|
|
"description": "Python import path to @xmlify dataclass",
|
|
},
|
|
"prompt": {
|
|
"type": "string",
|
|
"description": "System prompt for LLM agent",
|
|
},
|
|
"model": {
|
|
"type": "string",
|
|
"description": "LLM model to use",
|
|
},
|
|
"peers": {
|
|
"type": "array",
|
|
"description": "Allowed message targets",
|
|
"items": {"type": "string"},
|
|
},
|
|
"allowed_tools": {
|
|
"type": "array",
|
|
"description": "Explicitly allowed tools",
|
|
"items": {"type": "string"},
|
|
},
|
|
"blocked_tools": {
|
|
"type": "array",
|
|
"description": "Explicitly blocked tools",
|
|
"items": {"type": "string"},
|
|
},
|
|
},
|
|
},
|
|
"llmBackend": {
|
|
"type": "object",
|
|
"required": ["provider"],
|
|
"properties": {
|
|
"provider": {
|
|
"type": "string",
|
|
"description": "LLM provider type",
|
|
"enum": ["xai", "anthropic", "openai", "ollama"],
|
|
},
|
|
"api_key_env": {
|
|
"type": "string",
|
|
"description": "Environment variable containing API key",
|
|
},
|
|
"priority": {
|
|
"type": "integer",
|
|
"description": "Priority for failover (lower = preferred)",
|
|
"default": 0,
|
|
},
|
|
"rate_limit_tpm": {
|
|
"type": "integer",
|
|
"description": "Tokens per minute limit",
|
|
},
|
|
"max_concurrent": {
|
|
"type": "integer",
|
|
"description": "Maximum concurrent requests",
|
|
"default": 20,
|
|
},
|
|
"base_url": {
|
|
"type": "string",
|
|
"description": "Override default API endpoint",
|
|
"format": "uri",
|
|
},
|
|
"supported_models": {
|
|
"type": "array",
|
|
"description": "Model names this backend handles (Ollama)",
|
|
"items": {"type": "string"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|