Repository navigation
feat(bundles): add Famulor voice agent extension bundle #16069
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| --- | ||
| title: Famulor | ||
| slug: /bundles-famulor | ||
| --- | ||
|
|
||
| import Icon from "@site/src/components/icon"; | ||
| import { GraduatedBundleInstall } from '@site/docs/_partial-bundle-graduated-install.mdx'; | ||
|
|
||
| <GraduatedBundleInstall packageName="famulor" /> | ||
|
|
||
| <Icon name="Blocks" aria-hidden="true" /> [**Bundles**](/components-bundle-components) contain custom components that support specific third-party integrations with Langflow. | ||
|
|
||
| This page describes the components that are available in the **Famulor** bundle. | ||
|
|
||
| [Famulor](https://www.famulor.io) is an AI voice and phone platform. These components call the public REST API at `https://app.famulor.io/api/v1` with a workspace API key (`fam_...`). | ||
|
|
||
| Create the key under **Settings, API & MCP**. For the request and response shapes, see the [Famulor API reference](https://docs.famulor.io/api-reference/introduction). | ||
|
|
||
| If a request fails, for example because the API key is missing or the destination is not allowed, the component returns a single result whose `error` field describes the problem. | ||
|
|
||
| ## Famulor Make Call | ||
|
|
||
| This component starts an outbound AI phone call. The assistant must be active and have an outbound-capable phone number. The API returns the created call immediately, usually with status `queued`. | ||
|
|
||
| It sends `POST /calls` with `assistant_id`, `to_number`, and any variables you set. | ||
|
|
||
| It outputs the call as [`Data`](/data-types#json). The `text` is a short status line. The **Message** output repeats that text for a chat connection. | ||
|
|
||
| In [tool mode](/agents-tools), the component exposes a single tool named `famulor_make_call`. The API key stays on the component. | ||
|
|
||
| ### Famulor Make Call parameters | ||
|
|
||
| | Name | Type | Description | | ||
| |------|------|-------------| | ||
| | Famulor API Key (`famulor_api_key`) | SecretString | Input parameter. Your Famulor workspace API key. | | ||
| | Assistant ID (`assistant_id`) | String | Input parameter. UUID of the active assistant that places the call. | | ||
| | Phone Number (`phone_number`) | String | Input parameter. Destination in E.164 format, for example `+4930123456`. | | ||
| | Variables (`call_variables`) | Object | Input parameter. Optional per-call values sent as `variables`. Each entry must be a string, number, or boolean. | | ||
| | Caller ID (`phone_number_id`) | String | Input parameter. Optional phone-number UUID to use as the caller ID. Leave empty to use the assistant's number. | | ||
|
|
||
| ## Famulor Get Call | ||
|
|
||
| This component reads one call, including its status, AI summary, and transcript. | ||
|
|
||
| It sends `GET /calls/{id}`. | ||
|
|
||
| It outputs the call as [`Data`](/data-types#json). The `text` includes the status, the summary when one exists, and the spoken transcript. The **Message** output carries the same text. | ||
|
|
||
| In tool mode, the component exposes a single tool named `famulor_get_call`. | ||
|
|
||
| ### Famulor Get Call parameters | ||
|
|
||
| | Name | Type | Description | | ||
| |------|------|-------------| | ||
| | Famulor API Key (`famulor_api_key`) | SecretString | Input parameter. Your Famulor workspace API key. | | ||
| | Call ID (`call_id`) | String | Input parameter. UUID of the call returned by **Famulor Make Call**. | | ||
|
|
||
| ## Famulor List Assistants | ||
|
|
||
| This component lists assistants in the workspace, newest first. | ||
|
|
||
| It sends `GET /assistants` with `limit` and `offset`. | ||
|
|
||
| It outputs a page as [`Data`](/data-types#json) with `items`, `limit`, `offset`, and `total`. Each item includes `id`, `name`, `mode`, `is_active`, `stt_language`, `greeting_mode`, and `updated_at`. The **Table** output is one row per assistant. The **Message** output is a one-line count. | ||
|
|
||
| In tool mode, the component exposes a single tool named `famulor_list_assistants`. | ||
|
|
||
| ### Famulor List Assistants parameters | ||
|
|
||
| | Name | Type | Description | | ||
| |------|------|-------------| | ||
| | Famulor API Key (`famulor_api_key`) | SecretString | Input parameter. Your Famulor workspace API key. | | ||
| | Limit (`limit`) | Integer | Input parameter. Page size, from `1` to `200`. Default: `50`. | | ||
| | Offset (`offset`) | Integer | Input parameter. Number of assistants to skip. Default: `0`. | | ||
|
|
||
| ## Famulor List Campaigns | ||
|
|
||
| This component lists campaigns, optionally filtered by status. | ||
|
|
||
| It sends `GET /campaigns` with `limit`, `offset`, and `status` when a status other than **all** is selected. | ||
|
|
||
| It outputs a page as [`Data`](/data-types#json) with `items`, `limit`, `offset`, `total`, and `status`. Each item includes `id`, `name`, `status`, `channel`, `assistant_id`, `timezone`, and `updated_at`. The **Table** output is one row per campaign. | ||
|
|
||
| In tool mode, the component exposes a single tool named `famulor_list_campaigns`. | ||
|
|
||
| ### Famulor List Campaigns parameters | ||
|
|
||
| | Name | Type | Description | | ||
| |------|------|-------------| | ||
| | Famulor API Key (`famulor_api_key`) | SecretString | Input parameter. Your Famulor workspace API key. | | ||
| | Status (`campaign_status`) | String | Input parameter. One of `all`, `draft`, `running`, `paused`, `completed`, or `archived`. Default: `all`. Sent as the `status` query parameter. | | ||
| | Limit (`limit`) | Integer | Input parameter. Page size, from `1` to `200`. Default: `50`. | | ||
| | Offset (`offset`) | Integer | Input parameter. Number of campaigns to skip. Default: `0`. | |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| # lfx-famulor | ||
|
|
||
| Famulor voice-agent components as a standalone Langflow Extension Bundle. | ||
|
|
||
| The bundle ships four components that call the public [Famulor REST API](https://docs.famulor.io/api-reference/introduction) at `https://app.famulor.io/api/v1`: | ||
|
|
||
| - `FamulorMakeCallComponent` starts an outbound AI call. | ||
| - `FamulorGetCallComponent` reads a call's status, summary, and transcript. | ||
| - `FamulorListAssistantsComponent` lists workspace assistants. | ||
| - `FamulorListCampaignsComponent` lists campaigns. | ||
|
|
||
| Each component sends `Authorization: Bearer <api key>` with `httpx` and needs only a user-supplied API key, so the bundle carries no vendor SDK dependency. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Document the API Access requirement. A key alone is not sufficient. Famulor also requires API Access through the workspace plan or an add-on; otherwise requests return
|
||
|
|
||
| ## Install | ||
|
|
||
| ```bash | ||
| pip install lfx-famulor | ||
| ``` | ||
|
|
||
| The bundle is registered automatically via the `langflow.extensions` entry-point. After install, restart your Langflow server. The components appear in the palette's **Bundles** section under **Famulor**. | ||
|
|
||
| The bundle is not part of the default `pip install langflow` install. It is included in `pip install "langflow[bundles]"`. | ||
|
|
||
| ## Configure | ||
|
|
||
| Set **Famulor API Key** to a workspace key (`fam_...`) from **Settings, API & MCP** at [app.famulor.io](https://app.famulor.io). The components do nothing until a key is supplied. | ||
|
|
||
| In tool mode, each component exposes one tool: `famulor_make_call`, `famulor_get_call`, `famulor_list_assistants`, or `famulor_list_campaigns`. The API key stays on the component and is not a tool argument. | ||
|
|
||
| ## Develop | ||
|
|
||
| ```bash | ||
| cd src/bundles/famulor | ||
| pip install -e . | ||
| lfx extension validate src/lfx_famulor | ||
| ``` | ||
|
|
||
| ## Manifest | ||
|
|
||
| The extension manifest is shipped at `src/lfx_famulor/extension.json` and points at the bundle at `components/famulor`. Components register under canonical namespaced IDs such as `ext:famulor:FamulorMakeCallComponent@official`. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| [project] | ||
| name = "lfx-famulor" | ||
| version = "0.1.0" | ||
| description = "Famulor voice-agent components as a standalone Langflow Extension Bundle." | ||
| readme = "README.md" | ||
| requires-python = ">=3.10,<3.15" | ||
| license = { text = "MIT" } | ||
| authors = [ | ||
| { name = "Langflow", email = "contact@langflow.org" }, | ||
| ] | ||
| keywords = ["langflow", "lfx", "extension", "bundle", "famulor", "voice", "calls"] | ||
|
|
||
| # Runtime deps: lfx (the BUNDLE_API surface) plus httpx, which the components | ||
| # use to call the public Famulor REST API directly. Famulor ships no Python | ||
| # SDK on this path, so httpx is the only third-party runtime dependency; it is | ||
| # already an lfx dependency and is listed here as a direct runtime dep because | ||
| # the components import it, keeping the bundle buildable if lfx drops it later. | ||
| # lfx is floored at the current major.minor line and capped below the next lfx | ||
| # major; the floor is read from src/lfx/pyproject.toml at port time and | ||
| # re-synced on ``make patch`` via scripts/ci/sync_bundle_lfx_pin.py. | ||
| # Fine-grained BUNDLE_API compatibility is enforced via extension.json's | ||
| # lfx.compat list against BUNDLE_API_VERSION. | ||
| dependencies = [ | ||
| "lfx>=1.13.0.dev0,<2.0.0", | ||
| "httpx>=0.24.0,<1.0.0", | ||
| ] | ||
|
|
||
| [project.urls] | ||
| Homepage = "https://github.com/langflow-ai/langflow" | ||
| Documentation = "https://docs.langflow.org/bundles-famulor" | ||
| Repository = "https://github.com/langflow-ai/langflow" | ||
|
|
||
| # Manifest-shipping distributions are discovered via the | ||
| # ``langflow.extensions`` entry-point. Editable installs whose | ||
| # ``dist.files`` only surfaces dist-info entries fall back to this | ||
| # entry-point to find the manifest. | ||
| [project.entry-points."langflow.extensions"] | ||
| lfx-famulor = "lfx_famulor" | ||
|
|
||
| [build-system] | ||
| requires = ["hatchling==1.31.0"] | ||
| build-backend = "hatchling.build" | ||
|
|
||
| [tool.hatch.build.targets.wheel] | ||
| # extension.json + components live inside the lfx_famulor package so | ||
| # ``importlib.metadata.files(dist)`` finds them and the loader resolves | ||
| # bundles[].path relative to the manifest's directory. | ||
| packages = ["src/lfx_famulor"] | ||
| include = ["src/lfx_famulor/extension.json", "src/lfx_famulor/components/**/*.py"] | ||
|
|
||
| [tool.hatch.build.targets.sdist] | ||
| include = [ | ||
| "src/lfx_famulor", | ||
| "extension.json", | ||
| "README.md", | ||
| "pyproject.toml", | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| """lfx-famulor: Famulor voice-agent bundle. | ||
|
|
||
| This package is the distribution unit ``lfx-famulor``. At runtime | ||
| Langflow's loader discovers ``extension.json`` shipped alongside this | ||
| ``__init__.py`` and registers the Famulor components under namespaced IDs | ||
| such as ``ext:famulor:FamulorMakeCallComponent@official``. | ||
|
|
||
| Famulor (https://www.famulor.io) is an AI voice and phone platform. The | ||
| components call the public REST API at ``https://app.famulor.io/api/v1`` | ||
| with ``httpx`` and a user-supplied API key, so the bundle carries no vendor | ||
| SDK dependency. | ||
| """ | ||
|
|
||
| from lfx_famulor.components.famulor.famulor_get_call import FamulorGetCallComponent | ||
| from lfx_famulor.components.famulor.famulor_list_assistants import FamulorListAssistantsComponent | ||
| from lfx_famulor.components.famulor.famulor_list_campaigns import FamulorListCampaignsComponent | ||
| from lfx_famulor.components.famulor.famulor_make_call import FamulorMakeCallComponent | ||
|
|
||
| __all__ = [ | ||
| "FamulorGetCallComponent", | ||
| "FamulorListAssistantsComponent", | ||
| "FamulorListCampaignsComponent", | ||
| "FamulorMakeCallComponent", | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| """Famulor component package.""" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| from .famulor_get_call import FamulorGetCallComponent | ||
| from .famulor_list_assistants import FamulorListAssistantsComponent | ||
| from .famulor_list_campaigns import FamulorListCampaignsComponent | ||
| from .famulor_make_call import FamulorMakeCallComponent | ||
|
|
||
| __all__ = [ | ||
| "FamulorGetCallComponent", | ||
| "FamulorListAssistantsComponent", | ||
| "FamulorListCampaignsComponent", | ||
| "FamulorMakeCallComponent", | ||
| ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Identify Famulor as a standalone package.
The list says the displayed identifiers are extra names, but
lfx-bundleshas nofamulorextra. Installinglfx-bundles[famulor]will not install this bundle. Mark Famulor as standalone and direct readers tolfx-famulor. (raw.githubusercontent.com)As per coding guidelines: “Accuracy: Verify all code examples work.”
Source: Coding guidelines