Changelog
February 26, 2026 · View on GitHub
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased] — Canonical Terminology Refactor
(See below for details — this will ship in a future version.)
[0.3.1] - 2026-02-26
Added
- Bundled type stubs: 255 connector
.pyistubs ship in the wheel —pip install fastn-aigives full IDE autocomplete with zero extra setup - Concurrent tool-schema fetching:
fastn connector syncfetches tool schemas for all connectors in parallel (10 workers) __getattr__fallback stubs: Connectors without tool schemas get a fallback stub sofastn.<connector>.<anything>()still works at runtime.gitattributes: Generated stubs collapse in GitHub PR diffs
Changed
fastn connector syncis now the single command that does everything: fetch registry, fetch tool schemas, save snapshot, generate stubsfastn connector addnow described as "fetch full tool schemas" (stubs already bundled)- Removed
_install_stubs_to_package()— stubs ship in the wheel, no runtime copy needed - Removed
generator/fetch_and_generate.py— merged intofastn connector sync - Updated all docs and templates to use canonical
fastn connectorcommands
Breaking Changes — Terminology
The SDK now uses the canonical Fastn architecture terminology:
Connectors provide tools. Flows compose tools. Agents run flows and tools with reasoning.
| Concept | Old term (v0.3.0) | New term (canonical) |
|---|---|---|
| Service integration (Slack, Jira) | Tool | Connector |
| Callable function (send_message) | Action | Tool |
Renamed Classes
DynamicTool→DynamicConnectorAsyncDynamicTool→AsyncDynamicConnectorToolNotFoundError→ConnectorNotFoundError(connector not in registry)ActionNotFoundError→ToolNotFoundError(tool not found in connector)
Renamed Methods
fastn.tools.list()→fastn.connectors.list()fastn.tools.get(name)→fastn.connectors.get(name)fastn.get_actions(name)→fastn.get_tools(name)fastn.get_action(connector, tool)→fastn.get_tool(connector, tool)fastn.execute(action_id=...)→fastn.execute(tool=...)get_tools_for(..., tool=)→get_tools_for(..., connector=)
Renamed CLI Flags
--tool→--connector(scope to a connector)--action→--tool(scope to a tool)
Renamed Files
fastn/tool.py→fastn/connector.pytests/sdk/test_tool.py→tests/sdk/test_connector.py
Renamed Config Functions
add_tool_to_manifest()→add_connector_to_manifest()remove_tool_from_manifest()→remove_connector_from_manifest()get_installed_tools()→get_installed_connectors()
Migration Guide
# Before (v0.3.0)
from fastn import ToolNotFoundError, ActionNotFoundError
tools = client.tools.list()
actions = client.get_actions("slack")
result = client.execute(action_id="send_message", params={...})
tools = client.get_tools_for("message", tool="slack", format="openai")
# After (canonical)
from fastn import ConnectorNotFoundError, ToolNotFoundError
connectors = client.connectors.list()
tools = client.get_tools("slack")
result = client.execute(tool="send_message", params={...})
tools = client.get_tools_for("message", connector="slack", format="openai")
[0.3.0] - 2026-02-21
Breaking Changes
- Terminology refactor: "Connector" is now "Tool", "Tool" (action) is now "Action" throughout the SDK
- Namespace restructure:
fastn.admin.connectors.list()→fastn.tools.list()fastn.admin.connectors.get(name)→fastn.tools.get(name)fastn.get_tools(connector_name)→fastn.get_actions(tool_name)fastn.get_tool(connector_name, tool_name)→fastn.get_action(tool_name, action_name)fastn.connections.initiate()→fastn.auth.connect()fastn.connections.status()→fastn.auth.status()fastn.configure_custom_auth()→fastn.auth.configure_custom()get_tools_for(..., connector="slack")→get_tools_for(..., tool="slack")
- Exception renames:
ConnectorNotFoundError→ToolNotFoundError(with.tool_nameattribute)ToolNotFoundError→ActionNotFoundError(with.tool_nameand.action_nameattributes)
- File rename:
fastn/connector.py→fastn/tool.pyDynamicConnector→DynamicToolAsyncDynamicConnector→AsyncDynamicTool
- CLI option rename:
fastn agent --connector→fastn agent --tool
Added
fastn.auth.configure_custom(userinfo_url)— register custom auth provider via GraphQLupdateResolverStepmutation- Comprehensive documentation with terminology glossary, full feature examples (flows, auth, multi-tenant)
- Platform benefits documentation (performance, governance, security, observability)
Changed
auth.configure_custom()now uses GraphQLupdateResolverStepmutation instead of REST endpoint_ToolsAdmin.get()returns"actions"key instead of"tools"for consistency- All user-facing CLI strings updated to use "tool" and "action" terminology
- All examples and documentation updated to match new API surface
[0.2.3] - 2026-02-20
Added
get_tools_for()is now prompt-first: describe what you need in plain English and Fastn discovers the right toolsget_tools_for()acceptsconnector=for direct registry lookup (single or list of connectors)get_tools_for()has alimitparameter (default 5) to control how many tools are returned- "Platform Benefits" section in Python README documenting centralized gateway, monitoring, auth management
Changed
- Root README LLM section now shows complete working code with all variables defined
- Python README LLM section rewritten with prompt-first examples for all 4 LLM providers
- LLM agent example updated to use prompt-first tool discovery
[0.2.2] - 2026-02-20
Fixed
- Default
tenant_idchanged from"organization"to""(empty) — backend handles defaults - Updated tagline from "Pre-built tools" to accurate description of the integration platform
[0.2.1] - 2026-02-20
Changed
- Smart stub generation: only generates stubs for detected SDK languages (Python and/or TypeScript)
- Reorganized tests into
tests/sdk/andtests/cli/for selective test runs - Reorganized examples into
examples/sdk/andexamples/cli/ - Added pytest markers (
sdk,cli) and Makefile for development workflow - Updated documentation with AI-friendly API reference and LLM provider examples
[0.2.0] - 2026-02-19
Added
fastn agentcommand: AI-powered agentic tool execution with native function calling- OpenAI function-calling integration with automatic tool discovery
- Prompt-based tool routing via
getTools(prompt, limit)— sends only top-N tools to LLM - Configurable tool limit (
--max-tools, default 5) to reduce hallucination - Benchmark summary table with token counts, cost estimation ($), and timing
- Error recovery with consecutive error tracking (
--max-errors, default 2) - Evaluation mode (
--eval) — LLM judge assesses if agent called correct tools - Confirmation gates for tool calls (default on,
-yto skip) - LLM diagnosis on persistent failures with debug context dump
- Schema unwrapping for LLM consumption, re-wrapping for API execution
fastn connector runcommand for direct tool execution from CLI- Interactive parameter prompting when no args provided
- Inline parameters via
--key value - Tenant ID as positional argument:
fastn connector run slack send_message <tenant_id>
--tenantoption onfastn connector runandfastn agentfor multi-tenant testingfastn connector ls --activeto show only enabled tools in project and org- Generic error detection (
_detect_api_error) for diverse API response formats- Handles Slack, GitHub, Stripe, GraphQL, generic REST, HTTP status codes in body
- Preserves original error messages for LLM diagnosis
- Interactive LLM provider setup (OpenAI, Anthropic, Gemini) on first
fastn agentrun - Project selection during
fastn login - CLI split into
cli/package for maintainability
Changed
- Registry sync fetches from three scopes: project, organization, community
fastn connector lsgroups connectors by source category- Tenant header corrected to
x-fastn-space-tenantid - Tool schemas unwrapped for LLM (flat params) and re-wrapped for API execution
Fixed
- Version alignment between pyproject.toml and init.py
- Error value preservation in API responses (Slack
channel_not_foundno longer overwritten) - Agent summary table totals now include the final LLM response turn
[0.1.0] - 2025-02-19
Added
FastnClientandAsyncFastnClientfor sync and async workflows- Dynamic connector proxy with attribute-based tool access (
fastn.slack.send_message()) - Multi-connection support via
connect()and per-callconnection_id - LLM agent integration:
get_tools_for(connector, format)— returns tools in OpenAI, Anthropic, Gemini, Bedrock, or raw formatexecute(action_id, params)— execute tools by action ID with LLM-generated parameters
- AI-powered mode via
run(prompt)for natural language tool discovery - Control plane:
admin.connectors.list(),admin.connectors.get(),get_tools(),get_tool() - Schema-aware migrations with deprecation warnings for smooth upgrades
- OAuth device authorization flow (
fastn login) with automatic token refresh - CLI commands:
init,login,logout,whoami,sync,add,remove,list,schema,version - IDE autocomplete via generated
.pyitype stubs - Automatic retry with exponential backoff for transient failures
- Config file security (owner-only permissions)
- PEP 561
py.typedmarker for type checker support - 9 typed exceptions for granular error handling