diff --git a/README.md b/README.md index 781fa71..f8c09d6 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,16 @@ Aliases may appear anywhere in a chain (head, middle, tail), may reference other aliases, and expand inline and recursively; cycles are detected and returned as errors. +For tiers that live in a database or config system, register a **dynamic +resolver** — consulted after static aliases, output expanded with the same +recursion and cycle guards: + +```go +reg.RegisterResolver(majordomo.ResolverFunc(func(name string) (string, bool) { + return myConfigStore.LookupTier(name) // e.g. "agent-thinking" → a chain +})) +``` + ### Failover & health Chains are health-tracked per target: @@ -93,6 +103,9 @@ Chains are health-tracked per target: configurable via `WithChainConfig` / `WithHealthConfig`. - If every element fails, you get one joined error naming each target and why it failed. +- Ops surfaces: `reg.Health()` exposes `Bench`/`Unbench`/`Snapshot` for + manual control and dashboards; `ChainConfig.Observer` receives one event + per failover decision (failed attempt, bench, benched-skip) for logging. ## Providers @@ -188,6 +201,17 @@ resp, _ := m.Generate(ctx, req, majordomo.WithTools(weather)) // resp.ToolCalls → execute → append ToolResultsMessage → continue ``` +Or typed, with the schema derived from your argument struct: + +```go +weather := majordomo.DefineTool("get_weather", "Current weather for a city", + func(ctx context.Context, args struct { + City string `json:"city" description:"city name"` + }) (any, error) { + return lookup(args.City) + }) +``` + Each provider maps this one shape to its native function-calling format (OpenAI tools/tool_calls, Anthropic tool_use/tool_result, Ollama tools with object arguments). Tool-call ids are synthesized when a backend omits them; @@ -237,6 +261,13 @@ the model can react to; unknown tools likewise; duplicate tool names across toolboxes fail loudly. On `agent.ErrMaxSteps` (and on model errors) the partial result with the full transcript is still returned. +Supervision hooks for orchestrators: `WithMaxStepsFunc` (dynamic step +budget), `WithSteer` (inject messages into a running agent), +`WithCompactor` (transform the outbound transcript when context grows — +the canonical `Result.Messages` stays complete), and `WithToolErrorLimits` +(circuit breakers for all-error steps and identical repeated calls, +surfacing `agent.ErrToolLoop`). + ## Skills Skills are reusable instruction+tool bundles attachable to **any** agent,