AgentDTO — 19 customer-facing fields added to the GET /agent/{id} response schema

The GET /atoms/v1/agent/{id} response was already returning these 19 fields at runtime (via the platform’s response transformer), but the OpenAPI AgentDTO schema did not include them — so the auto-generated Python SDK couldn’t surface them as typed attributes, and customers had to fall through to .dict() / raw-dict access.

Each field below was cross-referenced against the canonical schema — types, defaults, min/max bounds, and nested-object shapes were verified against the live API response.

Fields added to AgentDTO

  • allowInboundCall (boolean, default true) — whether the agent accepts inbound calls.
  • phoneNumber (string array) — phone numbers attached to this agent (E.164 strings).
  • visibleToEveryone (boolean, default false) — whether the agent is visible to all members of the organization.
  • speechFormatting (boolean) — LLM-side speech formatting (e.g. expanding "$100""one hundred dollars").
  • muteUserUntilFirstBotResponse (boolean, default false).
  • interruptionBackoffTimer (number) — seconds to wait after an interruption before resuming.
  • enableStyleGuide (boolean, default true).
  • callDispositionConfig (string, default "") — free-form prompt used for call disposition classification.
  • voiceMailDetectionConfig (object) — { enabled, endText }.
  • smartTurnConfig (object) — { isEnabled, waitTimeInSecs }.
  • voiceDetectionConfig (object) — 4 bounded numerics for VAD tuning.
  • denoisingConfig (object) — { isEnabled }.
  • redactionConfig (object) — { isEnabled } PII/PCI redaction.
  • pronunciationDicts (array of { word, pronunciation }) — custom pronunciation dictionary.
  • llmIdleTimeoutConfig (object) — per-channel idle timeouts + maxRetries.
  • sessionTimeoutConfig (object) — { timeoutTimeInSecs }.
  • timezone (object) — { label, offset }.
  • postCallAnalyticsConfig — references the existing PostCallAnalyticsConfig schema.
  • widgetConfig (object, 24 sub-fields) — chat-widget rendering configuration (theme, copy, consent prompt).

Behavior change for SDK consumers

After the next regen lands, all 19 fields surface as typed attributes on agent responses. Existing code that read them through .dict() keeps working.

Endpoint shapes not changed

  • UpdateAgentRequest is intentionally restricted to name, description, avatarUrl, telephonyProductId, allowInboundCall, visibleToEveryone. Adding the other fields here would misrepresent what PATCH /agent/{id} accepts. To update versioned fields, callers continue to go through PATCH /agent/{id}/drafts/{draftId}/config.
  • CreateAgentRequest already accepted these fields.
  • _resolvedConfig already uses additionalProperties: true, so SDK clients can read these from the merged-config block as well.

Atoms API 5.1.0 completeness — 9 new endpoints + phone/KB SDK method names

Adds 9 customer-facing endpoints that the Atoms backend already serves but were not exposed in the OpenAPI spec, plus an x-fern-sdk-method-name cleanup pass on the phone-numbers and knowledge-base namespaces.

New endpoints

  • POST /agent/with-ai — create an agent from a natural-language brief.
  • GET /agent/{id}/call-logs — fetch conversation logs for an agent.
  • GET /agent/{id}/widget-config — read the chat-widget configuration for an agent.
  • PATCH /agent/{id}/widget-config — update the chat-widget configuration for an agent.
  • GET /agent/prompt-config — fetch prompt-config metadata (question definitions + labels) used by the agent builder.
  • GET /dnc — list DNC entries for the organization.
  • GET /account/get-account-details — get the authenticated user + organizations they belong to.
  • PATCH /account/update-org-name — update the organization’s display name.
  • GET /user/subscription — get the caller’s subscription, plan limits, and feature flags.
  • GET /campaign/{id}/logs/export — export a campaign’s call logs as a JSON file.

SDK method renames

x-fern-sdk-{group,method}-name annotations added across the phone_numbers and knowledge_base namespaces so the generated client uses canonical short names instead of summary-derived verbose ones.

Behavior change for SDK consumers

After the next regen, each of the 9 endpoints is callable via the auto-generated client (under client.atoms.agents.*, client.atoms.dnc.*, etc.). No changes to existing endpoint paths or request/response shapes.


Atoms API — agents, analytics, call actions, concurrency, integrations, and disposition templates

New agent endpoints (7). New endpoints for creating, configuring, and operating agents:

EndpointDescription
POST /agentCreate a new agent by name. Versioning is enabled by default; use the drafts flow to set prompt, firstMessage, tools, or runtime config before going live. The legacy PATCH /workflow/{workflowId} path bypasses the version lifecycle and should be avoided.
POST /agent/with-aiGenerate an agent from either a free-text description or a structured questions[] array (mutually exclusive). Voice fields (emotiveToggle, voiceId, voiceModel) must all be present or all absent; emotiveToggle: true requires voiceModel: GPT_REALTIME. Returns 503 if the security-check service is unavailable.
GET /agent/prompt-configReturns the questionnaire for the Create-with-AI flow — questions[], exampleLabels[], and defaultLabel.
GET /agent/{id}/widget-configReturns the full web widget config: position, size, theme, colors, consent settings, public key, and allowlist.
PATCH /agent/{id}/widget-configPartial update of any widget config field, including display strings (ctaTitle, ctaSubtitle, chatPlaceholder, voiceEmptyMessage, etc.). Changing avatarUrl automatically removes the old CDN asset from S3.
POST /agent/{id}/avatar/presigned-urlReturns a pre-signed S3 PUT URL for avatar upload. Requires fileName, contentType (must start with image/), and fileSize (max 2 MB). URL expires after 300 seconds; response includes presignedUrl, cdnUrl, and key.
GET /agent/{id}/call-logsPaginated call logs for a specific agent. Query params: page (default 1), offset (default 10). Each entry includes callId, callStatus, callType, fromNumber, toNumber, createdAt, and callDuration (ms).

Agent duplicate endpoint restructured. POST /agent/{id}/duplicate is now clearly documented at its own path. Logic is unchanged — pass targetOrganizationId (24-char hex ObjectId) to copy an agent into another org. Returns 403 if the caller is not a member of the target org, 404 if the agent or org is not found.

Draft diff response typed. The data field on GET /agent/{id}/drafts/{draftId}/diff is now typed with explicit fields: sections (keyed by section name, each with before, after, and changed) and hasChanges: boolean.

New analytics endpoints (18). A full analytics surface is now documented under the /analytics prefix:

EndpointDescription
GET /analytics/dashboardBatched — runs 6 sub-queries in parallel; returns summary, timeseries, pickup rates, hourly performance, and duration stats
GET /analytics/summaryKPI summary with trend metrics (totalCalls, pickupRate, avgDurationMs, totalCost, etc.) using the new AnalyticsTrendMetric schema
GET /analytics/call-counts-logPaginated call records filterable by agentId, campaignId, callType, and date range
GET /analytics/call-counts-by-dayDaily call counts for bar charts
GET /analytics/conversation-details/{callId}Full transcript and events for a single call (ClickHouse-sourced)
GET /analytics/usage/timeseriesDaily credit usage with dayWiseCredits[] and totalCredits
GET /analytics/call-volume-timeseriesDaily breakdown by answered, no-answer, failed, and cancelled calls
GET /analytics/call-outcomes-timeseriesDaily outcomes with period-level totals
GET /analytics/pickup-rate-by-numberPer-phone-number pickup rate with lastActiveDate
GET /analytics/phone-number-trendsDaily timeseries per phone number for volume and pickup rate
GET /analytics/hourly-performanceAggregated by hour (0–23) — calls, pickup rate, and duration
GET /analytics/duration-statsPercentiles: avg, median, p90, p95, plus shortCallsPercent and longCallsPercent
GET /analytics/weekly-trendsPer-week duration and pickup metrics
GET /analytics/agent-performancePer-agent metrics; accepts sortBy, sortOrder, limit
GET /analytics/concurrencyMinute-by-minute concurrent calls for a given date; optional includeAgents=true for per-agent breakdown
GET /analytics/call-start-distributionMinute-level call start buckets for a given date
GET /analytics/daily-call-summaryAggregate for a specific date including live inProgressCalls and inQueueCalls
GET /analytics/attempt-cohortCohort analysis of call attempts: pickupRate, cumulativeRate, marginalGain per attempt number

New call actions endpoints (full CRUD). Call actions are automated behaviors fired at call lifecycle events. The action body includes a config.conditions[] array using the new CallActionCondition schema (field, operator, value):

EndpointDescription
POST /call-actionsCreate a call action. Set category to trigger (fires during the call) or post-call.
GET /call-actionsList call actions. Requires agentId; optional category and provider filters. Paginated.
GET /call-actions/{id}Get a single call action by ID.
PUT /call-actions/{id}Update a call action — all fields optional.
DELETE /call-actions/{id}Permanently delete a call action.

New concurrency endpoints.

EndpointDescription
GET /concurrencyReturns orgLimit, totalReserved, unreservedPool, and a per-agent slot breakdown (webcall, outbound, inbound, chat).
PUT /concurrency/reservationsUpdate slot reservations for one or more agents in a single request. Requires Admin role.

New integrations endpoints. Both endpoints return a direct JSON body rather than the standard { success, data } envelope:

EndpointDescription
POST /integration/modify-webengage-integrationCreate or update a WebEngage integration. Request body: integrationSets[] with licenseCode, environment, and apiKey.
GET /integration/get-webengage-detailsReturns the current WebEngage integration config.

New endpoint: disposition metric templates.

EndpointDescription
GET /disposition-metric-templatesReturns all available templates for the post-call analytics metric picker. Each template exposes an identifier, dispositionMetricPrompt, and dispositionMetricType (STRING, BOOLEAN, INTEGER, ENUM, or DATETIME).

Atoms API reference


Python SDK 5.1.0 regen-prep — generator pin, spec field/type fixes, naming cleanup

Spec changes that prepare the next Python SDK regen so the auto-generated client (a) preserves the 4.4.7 sub-package import surface that customers still rely on and (b) picks up several missing or mistyped fields from the live API.

Generator pin

fern-python-sdk is pinned to 4.61.3 (the version 4.4.x was generated with). 5.12.12 combined with exclude_types_from_init_exports: true strips type exports from every package __init__, not just the top-level one — Fern’s own auto-generated wire tests do from smallestai.atoms.<ns> import <Type> and ImportError out. The pin is the proper fix until Fern ships a 5.x build that scopes the exclusion to top-level only.

Spec field/type fixes

  • listAgentTemplates_id vs id: the _id (ObjectId) and the human id slug are distinct. Fern was aliasing _idid and the two fields collided. Added x-fern-property-name: object_id on _id so the generated SDK exposes .object_id and .id as separate attributes. Same fix on singlePromptConfig._id.
  • Template tools[].type: added the missing enum (end_call | transfer_call | api_call | extract_dynamic_variables | knowledge_base_search).
  • live_transcripts.metrics: was typed object with additionalProperties: true; server actually sends an array of {processor, model, value} objects. The SDK was silently dropping 122 SSE metrics events in a 40-second call before this. Now typed as an array with the correct item shape.
  • calls.list / calls.searchturnLatencyMetrics: brought in line with calls.get by adding minLatency, maxLatency, transitions[], and processedAt.

Method-name cleanup

20 operations had verbose summary-derived method names; added explicit x-fern-sdk-group-name + x-fern-sdk-method-name annotations so the SDK surface stays readable. The worst offender — edit_draft_config_prompt_tools_post_call_metrics_voice_etc — is now agent_versioning_drafts.update_draft_config.

Renames cover: campaigns (list/create/get/delete/start_or_resume/pause), compliance (submit/resubmit), webhooks (create/delete), audience (list/get), agent_versioning_drafts (create_draft/rename_draft/discard_draft/publish_draft/update_draft_config), and agent_versioning_versions (compare_version_metrics/update_version_metadata/activate_version).

Synthesizer model enum

agent_dto.synthesizer.voiceConfig.model (and the template variant) now lists waves_lightning_v3_1 first and uses it as the default (was waves_lightning_large). The deprecated tokens (waves, waves_lightning_large, waves_lightning_large_voice_clone, waves_lightning_v2, waves_lightning_v3, waves_lightning_v2_http) remain in the enum for backwards compatibility — existing agents using them keep working — but the description flags them and notes removal once the new lineup tokens (Lightning v3.1 Pro, Pulse, Pulse Pro, Hydra) are confirmed and added.

Behavior change for SDK consumers

After the next regen lands:

  • agent.object_id returns the ObjectId for an agent template (previously colliding with the slug).
  • live_transcripts event handlers that read metrics need to iterate it as a list of objects, not look up keys on a dict.
  • The 4.4.x verbose method names on the operations listed above are gone — only the short names work.

No customer-facing endpoint paths or request shapes change.


Python SDK 5.1.0 — 10 new endpoints, verb-noun method renames, 19 typed agent fields

smallestai==5.1.0 adds 10 endpoints that were already serving traffic but missing from the SDK surface, cleans up auto-generated method names across the namespaces that still had verbose summary-derived names, and surfaces 19 customer-facing fields on the agent response that the auto-generated client previously couldn’t type. Constructor signature is unchanged from 5.0.0 — SmallestAI(api_key="...") keeps working.

Update your install

$pip install --upgrade smallestai
$# pinned: pip install smallestai==5.1.0

New endpoints

MethodWhat it does
client.atoms.agents.create_with_ai(...)Create an agent from a natural-language brief.
client.atoms.agents.list_call_logs(id=...)Fetch conversation logs for an agent.
client.atoms.agents.get_widget_config(id=...)Read the chat-widget configuration for an agent.
client.atoms.agents.update_widget_config(id=...)Update the chat-widget configuration for an agent.
client.atoms.agents.get_prompt_config(...)Fetch prompt-config metadata (question definitions + labels).
client.atoms.organization.get_account_details(...)Get the authenticated user + organizations they belong to.
client.atoms.organization.update_name(...)Update the organization display name.
client.atoms.user.get_subscription(...)Get the caller’s subscription, plan limits, and feature flags.
client.atoms.campaigns.export_logs(id=...)Export campaign call logs as JSON.
client.atoms.dnc.list(...)List DNC entries for the organization (new dnc namespace).

Method renames

Verbose summary-derived method names → canonical short names. Applied across 20 operations:

NamespaceBeforeAfter
campaignsget_all_campaigns, start_or_resume_campaign, pause_campaignlist, start_or_resume, pause (plus create, get, delete)
compliancesubmit_a_compliance_application, resubmit_a_rejected_compliance_applicationsubmit, resubmit
webhookscreate_a_webhook, delete_a_webhookcreate, delete
audienceget_all_audiences, get_audience_by_idlist, get
agent_versioning_draftsedit_draft_config_prompt_tools_post_call_metrics_voice_etc (worst offender)update_draft_config (also create_draft, rename_draft, discard_draft, publish_draft)
agent_versioning_versionscompare_metrics_between_two_versions, update_version_metadata_label_description_pin_only, activate_a_versioncompare_version_metrics, update_version_metadata, activate_version

The 5.0.x verbose names are removed in 5.1.0 with no deprecation alias.

Newly-typed agent response fields

GET /agent/{id} was already returning these 19 fields at runtime, but the spec didn’t include them — so the 5.0.x client couldn’t surface them as typed attributes. Each field is now a typed attribute on the agent response:

allow_inbound_call, phone_number, visible_to_everyone, speech_formatting, mute_user_until_first_bot_response, interruption_backoff_timer, enable_style_guide, call_disposition_config, voice_mail_detection_config, smart_turn_config, voice_detection_config, denoising_config, redaction_config, pronunciation_dicts, llm_idle_timeout_config, session_timeout_config, timezone, post_call_analytics_config, widget_config.

Each shape is documented in the agent response schema.

Other spec corrections

  • agent_templates_id (stable identifier) and id (human-readable slug) are now distinct on the SDK side. _id surfaces as template.object_id; id stays as template.id. Previous releases aliased one over the other.
  • live_transcripts.metrics — typed as a list of {processor, model, value} items (was untyped). The 5.0.x client silently dropped these events on deserialization.
  • calls.list / calls.searchturn_latency_metrics now includes min_latency, max_latency, transitions, processed_at (parity with calls.get).

Migration

The rename pattern is mechanical. A single repo-wide sed:

$find . -name '*.py' -exec sed -i.bak \
> -e 's/get_all_campaigns/list_campaigns/g' \
> -e 's/start_or_resume_campaign/start_or_resume/g' \
> -e 's/pause_campaign/pause/g' \
> -e 's/submit_a_compliance_application/submit_compliance/g' \
> -e 's/resubmit_a_rejected_compliance_application/resubmit_compliance/g' \
> -e 's/create_a_webhook/create_webhook/g' \
> -e 's/delete_a_webhook/delete_webhook/g' \
> -e 's/get_all_audiences/list_audiences/g' \
> -e 's/get_audience_by_id/get_audience/g' \
> -e 's/edit_draft_config_prompt_tools_post_call_metrics_voice_etc/update_draft_config/g' \
> -e 's/compare_metrics_between_two_versions/compare_version_metrics/g' \
> -e 's/update_version_metadata_label_description_pin_only/update_version_metadata/g' \
> -e 's/activate_a_version/activate_version/g' \
> {} \;

Full release notes and the SDK-side migration write-up: MIGRATION.md on smallest-python-sdk.


Revert fern-python-sdk generator pin from 4.61.3 back to 5.12.12

PR #262 pinned the Python SDK generator from 5.12.12 down to 4.61.3 to address sub-package __init__ type-export stripping under exclude_types_from_init_exports: true. An empirical regen test against 4.61.3 showed that change was the wrong fix:

  • 4.61.3’s core/ is missing helpers (encode_path_param, _make_default_async_client) that our preserved / .fernignore’d files depend on — so the regen produces mypy failures it didn’t have on 5.12.12.
  • 4.61.3 also does not restore the sub-package type exports the downgrade was supposed to fix — the empty __init__ symptom reproduces on it.

The actual fix for preserving the sub-package import surface lives in the SDK repo itself (.fernignore the 3 sub-package __init__s with their hand-written type exports — waves is already done; webhooks and prompt_scoring will follow). That keeps the generator on a coherent 5.12.12 core/ with no version skew.

All other PR #262 / #263 spec changes (the 20 method-name renames, synthesizer enum cleanup, _id / object_id rename, live_transcripts.metrics array fix, calls turn-latency fields, 19 new AgentDTO fields) are generator-independent and stay as-is.