Skip to content

Polyant v1.2.0

Choose a tag to compare

@paolovalletta-exelab paolovalletta-exelab released this 12 Oct 14:48
· 13 commits to main since this release
720dccf

Polyant v1.2.0

Polyant v1.2.0 moves product behaviour to the scope that owns it: installation
policies are editable by platform admins, agent behaviour is configurable per
agent, and attachment storage uses each agent's bucket. It makes the core
runtime leaner by moving integration-heavy tool families into build-time
plugins, receives Telegram and Slack through webhooks, and runs on Node 24.
That cleanup is deliberately breaking: the environment variables that set
product behaviour are gone, extracted tools need their plugins installed and
take namespaced names, storing inbound attachments becomes a per-agent opt-in
with the agent's own access keys, and a new agent starts with its Web channel
off and requires its API key.

Read docs/UPGRADING.md before starting. Extracted
tools need their plugins, agents that should keep users' files need access
keys and Store attachments turned on, Telegram and Slack need a public
address, scripts that create agents must enable their Web channel, and
non-default values of the removed variables have to be entered in the panel.

Highlights

  • A guided first access. A new user gets a guided setup (provider and key,
    model, agent, a test chat in the Playground, channels and the agent key,
    optional knowledge) and then an interface tour; the first visit to an agent's
    page offers a tour of its sections. Each step can be skipped, the Help menu
    reopens them, and the state is stored per user so it follows the person
    across devices. Accounts that exist at the upgrade start with it dismissed.
  • Settings live at the right tier. Settings → General holds the
    installation's operational policies: analytics retention, the engine's public
    address, live-stream caps, rate limits, agent-to-agent and MCP timeouts, and
    scheduler deadlines. Each agent can set its timezone, locale, memory
    deduplication and message timing, and knowledge-document caps can vary by
    organization. The shipped defaults are unchanged.
  • A smaller core, with build-time plugins. GitHub, Render, HubSpot and
    Markdown-to-PDF tools moved to plugins, so the base image no longer carries
    their optional binaries and libraries. A plugin can declare its Alpine, global
    npm and environment requirements, and the Docker build installs their union.
    fileUpload follows them into the extra plugin. HubSpot lives in
    polyant-hubspot-plugin
    (v1.1.1), Markdown-to-PDF and fileUpload in
    polyant-extra-plugin
    (v1.1.0); no plugin is shipped for GitHub and Render. Manifests can also name the
    plugin and describe the parameters its tools ask for, and the panel shows
    them.
  • Telegram and Slack through webhooks. Both channels now arrive like
    WhatsApp, on /webhooks/*, and the Telegram webhook survives rolling
    deploys. A failed Telegram registration is retried instead of disabling the
    channel, redelivered updates and events are dropped, and each bot's webhooks
    are rate limited on their own. The CDK stack routes webhook and HTTP-channel
    traffic to the engine without the panel's sign-in.
  • Web chat context. chat/stream and /v1/chat/completions accept a
    context object projected onto the conversation state through a per-agent
    field mapping, so a web or voice front end can hand tools and hooks the
    caller's identity. An agent that maps a context field requires its key on
    every web turn. On both routes, a client that disconnects before the turn
    produced anything aborts it, and a turn that has produced output runs to its
    end and is saved.
  • A clearer agent page. Tools and hooks open in side sheets with the
    parameters they declare, conversations can be followed live on any channel,
    activity reads as a timeline and now includes tool calls, and the page says
    what a capability still needs before it works.
  • Secure defaults for new agents. Web is a channel: an agent's public HTTP
    endpoints answer only while its Web channel is on, and a new agent starts
    with it off and requires its API key. Existing agents keep their endpoint and
    their authentication setting. The panel's Playground has its own
    session-based route and the agent.playground:use permission, held by every
    built-in role, so it works with Web off and needs no key. A fresh install no
    longer seeds a demo-agent without authentication.
  • API keys from the panel. An organization Owner issues and revokes
    management API keys under API keys, so polyant-cli and scripts can call
    the management API of an OSS deployment with X-Polyant-Key. A key holds the
    Owner permission set, can expire, is shown once, and cannot issue or revoke
    keys itself.
  • Updated models and gateway. OpenAI gpt-6, Claude Opus 5, Opus 5.5,
    Sonnet 5.5, Haiku 5.5 and Fable 5.1, and new Nebius models are in the
    catalog, with corrected prices. Claude Haiku 5.5, GPT-5.4, GPT-5.6 and GPT-6
    are priced by prompt length, so a call with a long prompt is recorded at the
    provider's higher rates. Providers and embedders can be registered at boot,
    and switching thinking off now really switches it off.
  • Bedrock works without Anthropic approval. The default standard tier uses
    Amazon Nova Pro and the heavy tier uses OpenAI gpt-oss 120B. Nova retains
    system-prompt caching while avoiding unsupported cache markers on tool
    messages.
  • One bucket per agent, and attachments kept only by choice. Attachment
    persistence and extra:fileUpload share one per-agent S3 configuration,
    set on the agent's Advanced page and reached with the agent's own access
    keys. Each agent decides whether to keep the files its users send, and
    stored files are deleted with their conversation and with the agent.
    Filenames with URL-significant characters round-trip correctly.
  • Scheduled work recovers. Runs left behind by a dead process are recovered
    at startup; live runs that exceed their configured deadline are reaped
    without touching a newer claim of the same task, and a scheduler health
    endpoint exposes stuck-run and capacity counts.
  • Faster and cleaner on Node 24. Under load the platform's overhead per
    turn drops sharply on Node 24, and the engine now finishes shutting down
    while a panel holds an activity stream open, instead of waiting for the
    platform to kill it and losing the last buffered audit rows.
  • Faster lists and dashboards. Conversations carry their own message
    counters, so lists and analytics no longer count message history, and
    analytics reads run on a separate, smaller connection pool.
  • Recorded spend matches what the providers bill. An audit against live
    OpenAI, Anthropic and Bedrock calls found per-call tokens and prices exact
    and four places where billed spend went missing or was mispriced: Amazon
    Nova carried the US price instead of the eu-south-1 one, a turn preempted by
    a follow-up message left no row, embedding calls were never logged, and
    long-period totals lost precision in the sum. All four are fixed; Nova costs
    more than 1.1.x reported.

Breaking changes

  • The engine and the panel require Node 24. The published images carry it;
    source deployments and custom images must move.
  • Extracted tools are namespaced, and fileUpload is now extra:fileUpload in
    the extra plugin. Migrations 0087_rename_extracted_tools and
    0089_rename_extracted_tools_file_upload rename their rows in place, so
    agents keep them enabled and skills keep their links; install the relevant
    plugins before building (HubSpot from polyant-hubspot-plugin v1.1.1,
    Markdown-to-PDF and fileUpload from polyant-extra-plugin v1.1.0). GitHub
    and Render tools are removed and no replacement is shipped. verifyDocument has no replacement and is removed
    from agents at the first boot.
  • Telegram and Slack need a public HTTPS address with /webhooks/* routed to
    the engine. Each Slack app needs Socket Mode off and its Request URL set to
    the agent's webhook; the Slack app token is no longer used. Each Telegram
    channel gets its own random webhook secret, which the engine mints and
    registers when it first starts on 1.2.0; Telegram's updates arrive once it
    has.
  • A new agent starts with its Web channel off: /v1/chat/completions and
    chat/stream answer 404 until the channel is enabled, which needs the
    agent's API key unless authentication is turned off. Migration
    0091_web_channel switches Web on for every existing agent, and bundles move
    to format 1.3.
  • A new agent requires its API key: migration 0090_new_agents_require_auth
    makes auth_enabled default to true. Existing agents and imported bundles
    keep their setting.
  • Migration 0091_web_channel deletes the seeded demo-agent when it was never
    used. A demo-agent with conversations, memories, knowledge, scheduled tasks,
    secrets or edits stays.
  • AUTH_MODE, DEFAULT_INSTANCE_ID, deployment-wide AWS_REGION,
    PLATFORM_ADMIN_EMAIL, WORKSPACES_ROOT, DEBUG_LLM_PAYLOAD and the unused
    LANGSMITH_* variables are no longer product configuration.
  • The environment variables that set agent, organization or installation
    behaviour are read by nothing; the panel holds those values now. Their
    defaults are unchanged, and a deployment that set a different value must enter
    it in the panel before removing the variable. THROTTLE_ENABLED stays an
    environment variable.
  • Attachment storage no longer reads the four PLATFORM_S3_* variables. On
    each agent that needs persisted attachments, set the bucket, region and the
    agent's own aws_access_key_id and aws_secret_access_key on its Advanced
    page, and turn on its Store attachments switch: migration 0088 adds it
    off for every agent. Deleting stored files needs s3:DeleteObject on the
    attachments/ prefix. Files earlier versions stored in the platform bucket
    stay there.
  • Unpinned OpenAI agents move from gpt-4o-mini/gpt-4o to the gpt-6 tiers,
    and unpinned Bedrock agents to Nova Pro and gpt-oss 120B. The Anthropic
    fast tier moves from Claude Haiku 4.5 to Claude Haiku 5.5, so the background
    jobs of every Anthropic agent, pinned or not, change model and price.
  • The images run as the unprivileged node user (uid 1000). A volume mounted
    on the engine's /app/logs or /app/packages/engine/workspaces must be
    writable by that user.

Database migrations

The release migrations, 0078 to 0093, are:

  • 0078_scheduler_crash_safety: a per-task run deadline and the index the
    scheduler reaper scans.
  • 0079_org_knowledge_doc_cap: an organization's own cap on the knowledge
    documents one agent may hold.
  • 0080_env_vars_to_product and 0082_platform_settings_expand: per-agent
    behaviour and installation policy columns that replace deployment variables;
    an unset column keeps the shipped default.
  • 0081_drop_s3_endpoint_secret: removes a storage secret that only
    pre-release builds of 1.2.0 wrote; a 1.1.x database has none.
  • 0083_agent_capability_defaults: new agents start with memory off and speech
    transcription disabled until configured; existing agents keep their settings.
  • 0084_add_trace_cache_write_5m_tokens: records five-minute cache-write tokens
    on traces, so Anthropic cache writes are priced by TTL.
  • 0085_add_web_context_field_mapping: the per-agent web context field mapping.
  • 0086_conversation_message_counters: per-conversation message counters,
    backfilled from every conversation message.
  • 0087_rename_extracted_tools: renames the tools moved into plugins to their
    namespaced names, keeping agent enablement and skill links.
  • 0088_attachment_storage_opt_in: the per-agent Store attachments switch,
    off for every agent.
  • 0089_rename_extracted_tools_file_upload: renames fileUpload to
    extra:fileUpload, keeping agent enablement and skill links.
  • 0090_new_agents_require_auth: auth_enabled defaults to true for new
    agents; existing rows keep their value.
  • 0091_web_channel: deletes the seeded demo-agent when it was never used,
    and switches the Web channel on for every remaining agent.
  • 0092_playground_use: grants agent.playground:use to every built-in role.
  • 0093_user_onboarding: the per-user onboarding state, set to dismissed for
    accounts that already exist.

Operational notes

  • Telegram and Slack redelivery checks are kept in memory in each process. With
    several replicas, a retry that reaches another replica is answered again and
    the contact can get two replies. Run one replica, or accept the occasional
    duplicate.

Security

  • Plugin artifacts are limited to 10 MB each, 10 minutes of lifetime, 20
    handles or 25 MB per conversation, and 100 MB or 1,000 live handles per
    engine process. A handle is bound to its agent as well as its conversation.
  • Tenant scope is required and branded across the affected stores, closing
    cross-tenant keyword search and mutation paths and refusing unresolved request
    tenancy rather than dropping a predicate.
  • Disabled skills no longer resolve retained credential placeholders. MCP OAuth
    metadata uses the shared private-network denylist, rotating bearer strings no
    longer evade throttling indefinitely, and provider response bodies are not
    logged raw.
  • Management keys are verified against a SHA-256 digest instead of bcrypt,
    which held the event loop for about 250 ms on every authenticated request. A
    bcrypt key keeps working and is rewritten on first use, so a rollback to
    1.1.x needs the keys used on 1.2.0 issued again.
  • Changing an MCP server's address to another host no longer reuses its stored
    credential until the credential is entered again.
  • undici was updated to 8.11.2 and 7.30.0, and axios to 1.20.0, for their open
    security advisories.

Upgrading

  1. Back up PostgreSQL; migration 0091 deletes an unused seeded demo-agent,
    and migration 0086 reads every conversation message, so schedule it for a
    quiet moment or build its indexes beforehand as the upgrade guide shows.
  2. Move to Node 24 if you run from source or build your own images, and make
    any volume mounted on the engine's /app/logs or
    /app/packages/engine/workspaces writable by uid 1000.
  3. Add the plugins of the extracted tools your agents use to the image:
    polyant-hubspot-plugin
    v1.1.1 for HubSpot and
    polyant-extra-plugin
    v1.1.0 for extra:markdownToPdf and extra:fileUpload. Each README gives
    the install command. The GitHub and Render tools have no plugin.
  4. On each agent that should keep files, set its bucket, region and its own
    access keys on the Advanced page and turn on Store attachments.
  5. Copy any non-default value of a removed variable into the panel, then remove
    the obsolete environment variables listed in the upgrade guide.
  6. Route /webhooks/* to the engine, reconfigure Slack apps for webhooks, and
    start the new engine promptly so Telegram's webhook is registered.
  7. Review agents without a pinned model, and Anthropic agents' background jobs,
    which now run on Claude Haiku 5.5.
  8. Update scripts that create agents and then call them: save the agent's API
    key and enable its Web channel.
  9. Run npm ci, apply migrations, build, restart, then smoke-test sign-in, one
    affected plugin tool, attachment upload/read, a Telegram or Slack message if
    you use them, and a scheduled task.

Compatible clients

These clients are released alongside Polyant v1.2.0:

  • polyant-cli v0.9.0, the
    command-line client. Install it with
    npm install -g https://github.com/polyant-ai/polyant-cli/releases/download/v0.9.0/polyant-ai-cli-0.9.0.tgz.
    It authenticates with a management key issued from the panel's API keys
    page.
  • polyant-dev-kit v1.2.0.
  • Plugin SDK v1.9.0, the version
    this engine pins.

Links