Actualizar asistente
curl --request PUT \
--url https://app.famulor.de/api/user/assistant/{id} \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"voice_id": 123,
"language_id": 123,
"type": "<string>",
"mode": "<string>",
"timezone": "<string>",
"initial_message": "<string>",
"system_prompt": "<string>",
"llm_model_id": 123,
"multimodal_model_id": 123,
"chat_llm_fallback_id": 123,
"turn_detection_threshold": 123,
"secondary_language_ids": [
123
],
"knowledgebase_id": 123,
"knowledgebase_mode": "<string>",
"folder_id": 123,
"label_ids": [
123
],
"phone_number_id": 123,
"tool_ids": [
123
],
"tools": [
{}
],
"tts_emotion_enabled": true,
"voice_stability": 123,
"voice_similarity": 123,
"speech_speed": 123,
"llm_temperature": 123,
"synthesizer_provider_id": 123,
"transcriber_provider_id": 123,
"allow_interruptions": true,
"fillers": true,
"filler_config": {},
"record": true,
"enable_noise_cancellation": true,
"wait_for_customer": true,
"max_duration": 123,
"max_silence_duration": 123,
"max_initial_silence_duration": 123,
"ringing_time": 123,
"reengagement_interval": 123,
"reengagement_prompt": "<string>",
"end_call_on_voicemail": true,
"voice_mail_message": "<string>",
"endpoint_type": "<string>",
"endpoint_sensitivity": 123,
"interrupt_sensitivity": 123,
"min_interrupt_words": 123,
"ambient_sound": "<string>",
"ambient_sound_volume": 123,
"is_webhook_active": true,
"webhook_url": "<string>",
"send_webhook_only_on_completed": true,
"include_recording_in_webhook": true,
"post_call_evaluation": true,
"post_call_schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>"
}
],
"variables": {}
}
'import requests
url = "https://app.famulor.de/api/user/assistant/{id}"
payload = {
"name": "<string>",
"voice_id": 123,
"language_id": 123,
"type": "<string>",
"mode": "<string>",
"timezone": "<string>",
"initial_message": "<string>",
"system_prompt": "<string>",
"llm_model_id": 123,
"multimodal_model_id": 123,
"chat_llm_fallback_id": 123,
"turn_detection_threshold": 123,
"secondary_language_ids": [123],
"knowledgebase_id": 123,
"knowledgebase_mode": "<string>",
"folder_id": 123,
"label_ids": [123],
"phone_number_id": 123,
"tool_ids": [123],
"tools": [{}],
"tts_emotion_enabled": True,
"voice_stability": 123,
"voice_similarity": 123,
"speech_speed": 123,
"llm_temperature": 123,
"synthesizer_provider_id": 123,
"transcriber_provider_id": 123,
"allow_interruptions": True,
"fillers": True,
"filler_config": {},
"record": True,
"enable_noise_cancellation": True,
"wait_for_customer": True,
"max_duration": 123,
"max_silence_duration": 123,
"max_initial_silence_duration": 123,
"ringing_time": 123,
"reengagement_interval": 123,
"reengagement_prompt": "<string>",
"end_call_on_voicemail": True,
"voice_mail_message": "<string>",
"endpoint_type": "<string>",
"endpoint_sensitivity": 123,
"interrupt_sensitivity": 123,
"min_interrupt_words": 123,
"ambient_sound": "<string>",
"ambient_sound_volume": 123,
"is_webhook_active": True,
"webhook_url": "<string>",
"send_webhook_only_on_completed": True,
"include_recording_in_webhook": True,
"post_call_evaluation": True,
"post_call_schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>"
}
],
"variables": {}
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
voice_id: 123,
language_id: 123,
type: '<string>',
mode: '<string>',
timezone: '<string>',
initial_message: '<string>',
system_prompt: '<string>',
llm_model_id: 123,
multimodal_model_id: 123,
chat_llm_fallback_id: 123,
turn_detection_threshold: 123,
secondary_language_ids: [123],
knowledgebase_id: 123,
knowledgebase_mode: '<string>',
folder_id: 123,
label_ids: [123],
phone_number_id: 123,
tool_ids: [123],
tools: [{}],
tts_emotion_enabled: true,
voice_stability: 123,
voice_similarity: 123,
speech_speed: 123,
llm_temperature: 123,
synthesizer_provider_id: 123,
transcriber_provider_id: 123,
allow_interruptions: true,
fillers: true,
filler_config: {},
record: true,
enable_noise_cancellation: true,
wait_for_customer: true,
max_duration: 123,
max_silence_duration: 123,
max_initial_silence_duration: 123,
ringing_time: 123,
reengagement_interval: 123,
reengagement_prompt: '<string>',
end_call_on_voicemail: true,
voice_mail_message: '<string>',
endpoint_type: '<string>',
endpoint_sensitivity: 123,
interrupt_sensitivity: 123,
min_interrupt_words: 123,
ambient_sound: '<string>',
ambient_sound_volume: 123,
is_webhook_active: true,
webhook_url: '<string>',
send_webhook_only_on_completed: true,
include_recording_in_webhook: true,
post_call_evaluation: true,
post_call_schema: [{name: '<string>', type: '<string>', description: '<string>'}],
variables: {}
})
};
fetch('https://app.famulor.de/api/user/assistant/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/assistant/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'voice_id' => 123,
'language_id' => 123,
'type' => '<string>',
'mode' => '<string>',
'timezone' => '<string>',
'initial_message' => '<string>',
'system_prompt' => '<string>',
'llm_model_id' => 123,
'multimodal_model_id' => 123,
'chat_llm_fallback_id' => 123,
'turn_detection_threshold' => 123,
'secondary_language_ids' => [
123
],
'knowledgebase_id' => 123,
'knowledgebase_mode' => '<string>',
'folder_id' => 123,
'label_ids' => [
123
],
'phone_number_id' => 123,
'tool_ids' => [
123
],
'tools' => [
[
]
],
'tts_emotion_enabled' => true,
'voice_stability' => 123,
'voice_similarity' => 123,
'speech_speed' => 123,
'llm_temperature' => 123,
'synthesizer_provider_id' => 123,
'transcriber_provider_id' => 123,
'allow_interruptions' => true,
'fillers' => true,
'filler_config' => [
],
'record' => true,
'enable_noise_cancellation' => true,
'wait_for_customer' => true,
'max_duration' => 123,
'max_silence_duration' => 123,
'max_initial_silence_duration' => 123,
'ringing_time' => 123,
'reengagement_interval' => 123,
'reengagement_prompt' => '<string>',
'end_call_on_voicemail' => true,
'voice_mail_message' => '<string>',
'endpoint_type' => '<string>',
'endpoint_sensitivity' => 123,
'interrupt_sensitivity' => 123,
'min_interrupt_words' => 123,
'ambient_sound' => '<string>',
'ambient_sound_volume' => 123,
'is_webhook_active' => true,
'webhook_url' => '<string>',
'send_webhook_only_on_completed' => true,
'include_recording_in_webhook' => true,
'post_call_evaluation' => true,
'post_call_schema' => [
[
'name' => '<string>',
'type' => '<string>',
'description' => '<string>'
]
],
'variables' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.de/api/user/assistant/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"voice_id\": 123,\n \"language_id\": 123,\n \"type\": \"<string>\",\n \"mode\": \"<string>\",\n \"timezone\": \"<string>\",\n \"initial_message\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"llm_model_id\": 123,\n \"multimodal_model_id\": 123,\n \"chat_llm_fallback_id\": 123,\n \"turn_detection_threshold\": 123,\n \"secondary_language_ids\": [\n 123\n ],\n \"knowledgebase_id\": 123,\n \"knowledgebase_mode\": \"<string>\",\n \"folder_id\": 123,\n \"label_ids\": [\n 123\n ],\n \"phone_number_id\": 123,\n \"tool_ids\": [\n 123\n ],\n \"tools\": [\n {}\n ],\n \"tts_emotion_enabled\": true,\n \"voice_stability\": 123,\n \"voice_similarity\": 123,\n \"speech_speed\": 123,\n \"llm_temperature\": 123,\n \"synthesizer_provider_id\": 123,\n \"transcriber_provider_id\": 123,\n \"allow_interruptions\": true,\n \"fillers\": true,\n \"filler_config\": {},\n \"record\": true,\n \"enable_noise_cancellation\": true,\n \"wait_for_customer\": true,\n \"max_duration\": 123,\n \"max_silence_duration\": 123,\n \"max_initial_silence_duration\": 123,\n \"ringing_time\": 123,\n \"reengagement_interval\": 123,\n \"reengagement_prompt\": \"<string>\",\n \"end_call_on_voicemail\": true,\n \"voice_mail_message\": \"<string>\",\n \"endpoint_type\": \"<string>\",\n \"endpoint_sensitivity\": 123,\n \"interrupt_sensitivity\": 123,\n \"min_interrupt_words\": 123,\n \"ambient_sound\": \"<string>\",\n \"ambient_sound_volume\": 123,\n \"is_webhook_active\": true,\n \"webhook_url\": \"<string>\",\n \"send_webhook_only_on_completed\": true,\n \"include_recording_in_webhook\": true,\n \"post_call_evaluation\": true,\n \"post_call_schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\"\n }\n ],\n \"variables\": {}\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.famulor.de/api/user/assistant/{id}")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"voice_id\": 123,\n \"language_id\": 123,\n \"type\": \"<string>\",\n \"mode\": \"<string>\",\n \"timezone\": \"<string>\",\n \"initial_message\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"llm_model_id\": 123,\n \"multimodal_model_id\": 123,\n \"chat_llm_fallback_id\": 123,\n \"turn_detection_threshold\": 123,\n \"secondary_language_ids\": [\n 123\n ],\n \"knowledgebase_id\": 123,\n \"knowledgebase_mode\": \"<string>\",\n \"folder_id\": 123,\n \"label_ids\": [\n 123\n ],\n \"phone_number_id\": 123,\n \"tool_ids\": [\n 123\n ],\n \"tools\": [\n {}\n ],\n \"tts_emotion_enabled\": true,\n \"voice_stability\": 123,\n \"voice_similarity\": 123,\n \"speech_speed\": 123,\n \"llm_temperature\": 123,\n \"synthesizer_provider_id\": 123,\n \"transcriber_provider_id\": 123,\n \"allow_interruptions\": true,\n \"fillers\": true,\n \"filler_config\": {},\n \"record\": true,\n \"enable_noise_cancellation\": true,\n \"wait_for_customer\": true,\n \"max_duration\": 123,\n \"max_silence_duration\": 123,\n \"max_initial_silence_duration\": 123,\n \"ringing_time\": 123,\n \"reengagement_interval\": 123,\n \"reengagement_prompt\": \"<string>\",\n \"end_call_on_voicemail\": true,\n \"voice_mail_message\": \"<string>\",\n \"endpoint_type\": \"<string>\",\n \"endpoint_sensitivity\": 123,\n \"interrupt_sensitivity\": 123,\n \"min_interrupt_words\": 123,\n \"ambient_sound\": \"<string>\",\n \"ambient_sound_volume\": 123,\n \"is_webhook_active\": true,\n \"webhook_url\": \"<string>\",\n \"send_webhook_only_on_completed\": true,\n \"include_recording_in_webhook\": true,\n \"post_call_evaluation\": true,\n \"post_call_schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\"\n }\n ],\n \"variables\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/assistant/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"voice_id\": 123,\n \"language_id\": 123,\n \"type\": \"<string>\",\n \"mode\": \"<string>\",\n \"timezone\": \"<string>\",\n \"initial_message\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"llm_model_id\": 123,\n \"multimodal_model_id\": 123,\n \"chat_llm_fallback_id\": 123,\n \"turn_detection_threshold\": 123,\n \"secondary_language_ids\": [\n 123\n ],\n \"knowledgebase_id\": 123,\n \"knowledgebase_mode\": \"<string>\",\n \"folder_id\": 123,\n \"label_ids\": [\n 123\n ],\n \"phone_number_id\": 123,\n \"tool_ids\": [\n 123\n ],\n \"tools\": [\n {}\n ],\n \"tts_emotion_enabled\": true,\n \"voice_stability\": 123,\n \"voice_similarity\": 123,\n \"speech_speed\": 123,\n \"llm_temperature\": 123,\n \"synthesizer_provider_id\": 123,\n \"transcriber_provider_id\": 123,\n \"allow_interruptions\": true,\n \"fillers\": true,\n \"filler_config\": {},\n \"record\": true,\n \"enable_noise_cancellation\": true,\n \"wait_for_customer\": true,\n \"max_duration\": 123,\n \"max_silence_duration\": 123,\n \"max_initial_silence_duration\": 123,\n \"ringing_time\": 123,\n \"reengagement_interval\": 123,\n \"reengagement_prompt\": \"<string>\",\n \"end_call_on_voicemail\": true,\n \"voice_mail_message\": \"<string>\",\n \"endpoint_type\": \"<string>\",\n \"endpoint_sensitivity\": 123,\n \"interrupt_sensitivity\": 123,\n \"min_interrupt_words\": 123,\n \"ambient_sound\": \"<string>\",\n \"ambient_sound_volume\": 123,\n \"is_webhook_active\": true,\n \"webhook_url\": \"<string>\",\n \"send_webhook_only_on_completed\": true,\n \"include_recording_in_webhook\": true,\n \"post_call_evaluation\": true,\n \"post_call_schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\"\n }\n ],\n \"variables\": {}\n}"
response = http.request(request)
puts response.read_body{
"message": "Assistant updated successfully",
"data": {
"id": 789,
"name": "Updated Sales Assistant",
"status": "active",
"type": "outbound",
"mode": "pipeline"
}
}
{
"message": "Assistant not found"
}
{
"message": "Validation failed",
"errors": {
"speech_speed": ["Speech speed must be between 0.7 and 1.2."],
"voice_id": ["The selected voice is not compatible with the selected engine type."],
"allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
}
}
Asistentes de IA
Actualizar asistente
Actualiza la configuración de un asistente de IA existente
PUT
/
api
/
user
/
assistant
/
{id}
Actualizar asistente
curl --request PUT \
--url https://app.famulor.de/api/user/assistant/{id} \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"voice_id": 123,
"language_id": 123,
"type": "<string>",
"mode": "<string>",
"timezone": "<string>",
"initial_message": "<string>",
"system_prompt": "<string>",
"llm_model_id": 123,
"multimodal_model_id": 123,
"chat_llm_fallback_id": 123,
"turn_detection_threshold": 123,
"secondary_language_ids": [
123
],
"knowledgebase_id": 123,
"knowledgebase_mode": "<string>",
"folder_id": 123,
"label_ids": [
123
],
"phone_number_id": 123,
"tool_ids": [
123
],
"tools": [
{}
],
"tts_emotion_enabled": true,
"voice_stability": 123,
"voice_similarity": 123,
"speech_speed": 123,
"llm_temperature": 123,
"synthesizer_provider_id": 123,
"transcriber_provider_id": 123,
"allow_interruptions": true,
"fillers": true,
"filler_config": {},
"record": true,
"enable_noise_cancellation": true,
"wait_for_customer": true,
"max_duration": 123,
"max_silence_duration": 123,
"max_initial_silence_duration": 123,
"ringing_time": 123,
"reengagement_interval": 123,
"reengagement_prompt": "<string>",
"end_call_on_voicemail": true,
"voice_mail_message": "<string>",
"endpoint_type": "<string>",
"endpoint_sensitivity": 123,
"interrupt_sensitivity": 123,
"min_interrupt_words": 123,
"ambient_sound": "<string>",
"ambient_sound_volume": 123,
"is_webhook_active": true,
"webhook_url": "<string>",
"send_webhook_only_on_completed": true,
"include_recording_in_webhook": true,
"post_call_evaluation": true,
"post_call_schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>"
}
],
"variables": {}
}
'import requests
url = "https://app.famulor.de/api/user/assistant/{id}"
payload = {
"name": "<string>",
"voice_id": 123,
"language_id": 123,
"type": "<string>",
"mode": "<string>",
"timezone": "<string>",
"initial_message": "<string>",
"system_prompt": "<string>",
"llm_model_id": 123,
"multimodal_model_id": 123,
"chat_llm_fallback_id": 123,
"turn_detection_threshold": 123,
"secondary_language_ids": [123],
"knowledgebase_id": 123,
"knowledgebase_mode": "<string>",
"folder_id": 123,
"label_ids": [123],
"phone_number_id": 123,
"tool_ids": [123],
"tools": [{}],
"tts_emotion_enabled": True,
"voice_stability": 123,
"voice_similarity": 123,
"speech_speed": 123,
"llm_temperature": 123,
"synthesizer_provider_id": 123,
"transcriber_provider_id": 123,
"allow_interruptions": True,
"fillers": True,
"filler_config": {},
"record": True,
"enable_noise_cancellation": True,
"wait_for_customer": True,
"max_duration": 123,
"max_silence_duration": 123,
"max_initial_silence_duration": 123,
"ringing_time": 123,
"reengagement_interval": 123,
"reengagement_prompt": "<string>",
"end_call_on_voicemail": True,
"voice_mail_message": "<string>",
"endpoint_type": "<string>",
"endpoint_sensitivity": 123,
"interrupt_sensitivity": 123,
"min_interrupt_words": 123,
"ambient_sound": "<string>",
"ambient_sound_volume": 123,
"is_webhook_active": True,
"webhook_url": "<string>",
"send_webhook_only_on_completed": True,
"include_recording_in_webhook": True,
"post_call_evaluation": True,
"post_call_schema": [
{
"name": "<string>",
"type": "<string>",
"description": "<string>"
}
],
"variables": {}
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
voice_id: 123,
language_id: 123,
type: '<string>',
mode: '<string>',
timezone: '<string>',
initial_message: '<string>',
system_prompt: '<string>',
llm_model_id: 123,
multimodal_model_id: 123,
chat_llm_fallback_id: 123,
turn_detection_threshold: 123,
secondary_language_ids: [123],
knowledgebase_id: 123,
knowledgebase_mode: '<string>',
folder_id: 123,
label_ids: [123],
phone_number_id: 123,
tool_ids: [123],
tools: [{}],
tts_emotion_enabled: true,
voice_stability: 123,
voice_similarity: 123,
speech_speed: 123,
llm_temperature: 123,
synthesizer_provider_id: 123,
transcriber_provider_id: 123,
allow_interruptions: true,
fillers: true,
filler_config: {},
record: true,
enable_noise_cancellation: true,
wait_for_customer: true,
max_duration: 123,
max_silence_duration: 123,
max_initial_silence_duration: 123,
ringing_time: 123,
reengagement_interval: 123,
reengagement_prompt: '<string>',
end_call_on_voicemail: true,
voice_mail_message: '<string>',
endpoint_type: '<string>',
endpoint_sensitivity: 123,
interrupt_sensitivity: 123,
min_interrupt_words: 123,
ambient_sound: '<string>',
ambient_sound_volume: 123,
is_webhook_active: true,
webhook_url: '<string>',
send_webhook_only_on_completed: true,
include_recording_in_webhook: true,
post_call_evaluation: true,
post_call_schema: [{name: '<string>', type: '<string>', description: '<string>'}],
variables: {}
})
};
fetch('https://app.famulor.de/api/user/assistant/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/assistant/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'voice_id' => 123,
'language_id' => 123,
'type' => '<string>',
'mode' => '<string>',
'timezone' => '<string>',
'initial_message' => '<string>',
'system_prompt' => '<string>',
'llm_model_id' => 123,
'multimodal_model_id' => 123,
'chat_llm_fallback_id' => 123,
'turn_detection_threshold' => 123,
'secondary_language_ids' => [
123
],
'knowledgebase_id' => 123,
'knowledgebase_mode' => '<string>',
'folder_id' => 123,
'label_ids' => [
123
],
'phone_number_id' => 123,
'tool_ids' => [
123
],
'tools' => [
[
]
],
'tts_emotion_enabled' => true,
'voice_stability' => 123,
'voice_similarity' => 123,
'speech_speed' => 123,
'llm_temperature' => 123,
'synthesizer_provider_id' => 123,
'transcriber_provider_id' => 123,
'allow_interruptions' => true,
'fillers' => true,
'filler_config' => [
],
'record' => true,
'enable_noise_cancellation' => true,
'wait_for_customer' => true,
'max_duration' => 123,
'max_silence_duration' => 123,
'max_initial_silence_duration' => 123,
'ringing_time' => 123,
'reengagement_interval' => 123,
'reengagement_prompt' => '<string>',
'end_call_on_voicemail' => true,
'voice_mail_message' => '<string>',
'endpoint_type' => '<string>',
'endpoint_sensitivity' => 123,
'interrupt_sensitivity' => 123,
'min_interrupt_words' => 123,
'ambient_sound' => '<string>',
'ambient_sound_volume' => 123,
'is_webhook_active' => true,
'webhook_url' => '<string>',
'send_webhook_only_on_completed' => true,
'include_recording_in_webhook' => true,
'post_call_evaluation' => true,
'post_call_schema' => [
[
'name' => '<string>',
'type' => '<string>',
'description' => '<string>'
]
],
'variables' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.famulor.de/api/user/assistant/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"voice_id\": 123,\n \"language_id\": 123,\n \"type\": \"<string>\",\n \"mode\": \"<string>\",\n \"timezone\": \"<string>\",\n \"initial_message\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"llm_model_id\": 123,\n \"multimodal_model_id\": 123,\n \"chat_llm_fallback_id\": 123,\n \"turn_detection_threshold\": 123,\n \"secondary_language_ids\": [\n 123\n ],\n \"knowledgebase_id\": 123,\n \"knowledgebase_mode\": \"<string>\",\n \"folder_id\": 123,\n \"label_ids\": [\n 123\n ],\n \"phone_number_id\": 123,\n \"tool_ids\": [\n 123\n ],\n \"tools\": [\n {}\n ],\n \"tts_emotion_enabled\": true,\n \"voice_stability\": 123,\n \"voice_similarity\": 123,\n \"speech_speed\": 123,\n \"llm_temperature\": 123,\n \"synthesizer_provider_id\": 123,\n \"transcriber_provider_id\": 123,\n \"allow_interruptions\": true,\n \"fillers\": true,\n \"filler_config\": {},\n \"record\": true,\n \"enable_noise_cancellation\": true,\n \"wait_for_customer\": true,\n \"max_duration\": 123,\n \"max_silence_duration\": 123,\n \"max_initial_silence_duration\": 123,\n \"ringing_time\": 123,\n \"reengagement_interval\": 123,\n \"reengagement_prompt\": \"<string>\",\n \"end_call_on_voicemail\": true,\n \"voice_mail_message\": \"<string>\",\n \"endpoint_type\": \"<string>\",\n \"endpoint_sensitivity\": 123,\n \"interrupt_sensitivity\": 123,\n \"min_interrupt_words\": 123,\n \"ambient_sound\": \"<string>\",\n \"ambient_sound_volume\": 123,\n \"is_webhook_active\": true,\n \"webhook_url\": \"<string>\",\n \"send_webhook_only_on_completed\": true,\n \"include_recording_in_webhook\": true,\n \"post_call_evaluation\": true,\n \"post_call_schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\"\n }\n ],\n \"variables\": {}\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.famulor.de/api/user/assistant/{id}")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"voice_id\": 123,\n \"language_id\": 123,\n \"type\": \"<string>\",\n \"mode\": \"<string>\",\n \"timezone\": \"<string>\",\n \"initial_message\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"llm_model_id\": 123,\n \"multimodal_model_id\": 123,\n \"chat_llm_fallback_id\": 123,\n \"turn_detection_threshold\": 123,\n \"secondary_language_ids\": [\n 123\n ],\n \"knowledgebase_id\": 123,\n \"knowledgebase_mode\": \"<string>\",\n \"folder_id\": 123,\n \"label_ids\": [\n 123\n ],\n \"phone_number_id\": 123,\n \"tool_ids\": [\n 123\n ],\n \"tools\": [\n {}\n ],\n \"tts_emotion_enabled\": true,\n \"voice_stability\": 123,\n \"voice_similarity\": 123,\n \"speech_speed\": 123,\n \"llm_temperature\": 123,\n \"synthesizer_provider_id\": 123,\n \"transcriber_provider_id\": 123,\n \"allow_interruptions\": true,\n \"fillers\": true,\n \"filler_config\": {},\n \"record\": true,\n \"enable_noise_cancellation\": true,\n \"wait_for_customer\": true,\n \"max_duration\": 123,\n \"max_silence_duration\": 123,\n \"max_initial_silence_duration\": 123,\n \"ringing_time\": 123,\n \"reengagement_interval\": 123,\n \"reengagement_prompt\": \"<string>\",\n \"end_call_on_voicemail\": true,\n \"voice_mail_message\": \"<string>\",\n \"endpoint_type\": \"<string>\",\n \"endpoint_sensitivity\": 123,\n \"interrupt_sensitivity\": 123,\n \"min_interrupt_words\": 123,\n \"ambient_sound\": \"<string>\",\n \"ambient_sound_volume\": 123,\n \"is_webhook_active\": true,\n \"webhook_url\": \"<string>\",\n \"send_webhook_only_on_completed\": true,\n \"include_recording_in_webhook\": true,\n \"post_call_evaluation\": true,\n \"post_call_schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\"\n }\n ],\n \"variables\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.de/api/user/assistant/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"voice_id\": 123,\n \"language_id\": 123,\n \"type\": \"<string>\",\n \"mode\": \"<string>\",\n \"timezone\": \"<string>\",\n \"initial_message\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"llm_model_id\": 123,\n \"multimodal_model_id\": 123,\n \"chat_llm_fallback_id\": 123,\n \"turn_detection_threshold\": 123,\n \"secondary_language_ids\": [\n 123\n ],\n \"knowledgebase_id\": 123,\n \"knowledgebase_mode\": \"<string>\",\n \"folder_id\": 123,\n \"label_ids\": [\n 123\n ],\n \"phone_number_id\": 123,\n \"tool_ids\": [\n 123\n ],\n \"tools\": [\n {}\n ],\n \"tts_emotion_enabled\": true,\n \"voice_stability\": 123,\n \"voice_similarity\": 123,\n \"speech_speed\": 123,\n \"llm_temperature\": 123,\n \"synthesizer_provider_id\": 123,\n \"transcriber_provider_id\": 123,\n \"allow_interruptions\": true,\n \"fillers\": true,\n \"filler_config\": {},\n \"record\": true,\n \"enable_noise_cancellation\": true,\n \"wait_for_customer\": true,\n \"max_duration\": 123,\n \"max_silence_duration\": 123,\n \"max_initial_silence_duration\": 123,\n \"ringing_time\": 123,\n \"reengagement_interval\": 123,\n \"reengagement_prompt\": \"<string>\",\n \"end_call_on_voicemail\": true,\n \"voice_mail_message\": \"<string>\",\n \"endpoint_type\": \"<string>\",\n \"endpoint_sensitivity\": 123,\n \"interrupt_sensitivity\": 123,\n \"min_interrupt_words\": 123,\n \"ambient_sound\": \"<string>\",\n \"ambient_sound_volume\": 123,\n \"is_webhook_active\": true,\n \"webhook_url\": \"<string>\",\n \"send_webhook_only_on_completed\": true,\n \"include_recording_in_webhook\": true,\n \"post_call_evaluation\": true,\n \"post_call_schema\": [\n {\n \"name\": \"<string>\",\n \"type\": \"<string>\",\n \"description\": \"<string>\"\n }\n ],\n \"variables\": {}\n}"
response = http.request(request)
puts response.read_body{
"message": "Assistant updated successfully",
"data": {
"id": 789,
"name": "Updated Sales Assistant",
"status": "active",
"type": "outbound",
"mode": "pipeline"
}
}
{
"message": "Assistant not found"
}
{
"message": "Validation failed",
"errors": {
"speech_speed": ["Speech speed must be between 0.7 and 1.2."],
"voice_id": ["The selected voice is not compatible with the selected engine type."],
"allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
}
}
API de Famulor 1.0 (legado). Esta página se aplica únicamente a Famulor 1.0 (
app.famulor.de) y se conserva por compatibilidad. Para la plataforma actual, usa la referencia de la API de Famulor 2.0.Parámetro de ruta
integer
requerido
El identificador único del asistente que se va a actualizar
Cuerpo de la solicitud
Campos principales
string
El nombre del asistente (máx. 255 caracteres)
integer
El ID de voz que usará el asistente. Usa el endpoint Obtener voces con el parámetro
mode para obtener voces compatibles con tu modo de motor.integer
El ID de idioma del asistente. Usa el endpoint Obtener idiomas para obtener los idiomas disponibles.
string
El tipo de asistente. Opciones:
inbound, outboundstring
El modo del motor. Opciones:
pipeline, multimodal, dualplexCambiar el modo restablece los ajustes específicos del modo a sus valores predeterminados para el nuevo modo.
string
La zona horaria del asistente (p. ej., “Europe/Berlin”, “America/New_York”)
string
El mensaje inicial que dirá el asistente al comienzo de la llamada (máx. 200 caracteres)
string
El prompt de sistema que define el comportamiento y la personalidad del asistente
Campos específicos del modo
integer
El ID del modelo LLM a usar. Solo aplicable en modo
pipeline.Usa el endpoint Obtener modelos para obtener los modelos disponibles.integer
El ID del modelo multimodal. Aplicable solo en los modos
multimodal y dualplex.Usa el endpoint Obtener modelos para obtener los modelos multimodales disponibles.integer
ID del modelo LLM de respaldo para llamadas a herramientas en los modos multimodal/dualplex. Se establece en
null para eliminarlo.number
Sensibilidad de la detección de turnos de habla para los modos multimodal/dualplex (0-1). Se establece en
null para automático.Idiomas secundarios
integer[]
Array de IDs de idiomas adicionales que el asistente puede hablar. Reemplaza los idiomas secundarios existentes. Pasa un array vacío
[] para eliminar todos los idiomas secundarios."secondary_language_ids": [2, 3, 4]
Ajustes de base de conocimiento
integer
El ID de la base de conocimiento a vincular. Se establece en
null para eliminarla.string
Cómo se usa la base de conocimiento. Opciones:
function_call- La IA llama a una función para buscar (obligatorio para multimodal/dualplex)prompt- El conocimiento se inyecta en el prompt (solo pipeline)
Organización
integer
ID de una carpeta a la que mover este asistente. Debe pertenecer a tu cuenta. Se establece en
null para dejarlo sin categorizar. Se omite para dejar la carpeta sin cambios.integer[]
Array de IDs de etiquetas para este asistente. Cada etiqueta debe pertenecer a tu cuenta. Si se proporciona, reemplaza las etiquetas actuales del asistente. Se omite para dejar las etiquetas sin cambios; se envía
[] para eliminarlas todas."label_ids": [3, 5]
Número de teléfono
integer
El ID de un número de teléfono a asignar. Se establece en
null para desasignarlo. Debe pertenecer a tu cuenta.Para los asistentes
inbound, el número de teléfono no puede ser de tipo identificador de llamadas y no debe estar ya asignado a otro asistente entrante.Herramientas personalizadas durante la llamada
integer[]
Array de IDs de herramientas personalizadas durante la llamada que se van a sincronizar. Reemplaza todas las asignaciones de herramientas existentes. Pasa un array vacío
[] para eliminar todas las herramientas. Cada herramienta debe pertenecer a tu cuenta."tool_ids": [1, 5, 12]
Herramientas integradas
array
Array de herramientas integradas. Reemplaza todas las herramientas integradas existentes. Pasa un array vacío
[] para eliminar todas las herramientas.Mostrar Tipos de herramienta
Mostrar Tipos de herramienta
call_transfer - Transferir la llamada a otro número de teléfono
phone_number(obligatorio): Número de teléfono al que transferirdescription: Cuándo transferir la llamadacustom: Si es true, la IA puede determinar el número de transferencia dinámicamentetimezone: Zona horaria para la disponibilidad de la transferenciawarm_transfer: Enviar un mensaje al cliente antes de transferir (predeterminado:false)warm_transfer_message: Prompt que indica a la IA qué decir antes de transferir (p. ej., “Dile al cliente que la llamada se está transfiriendo”).
supervisor_phone(obligatorio): Número de teléfono al que llamar para la transferencia asistida (p. ej., “+14155552001”). Sicustom_sipestá activado, esto es una dirección SIP o una extensión interna en su lugar.outbound_phone_id(obligatorio): ID del número de teléfono usado para llamar al supervisor. Consulta Obtener números de teléfono.description(obligatorio): Cuándo transferir — describe cuándo debe iniciar la IA la transferencia asistida (p. ej., “Transferir la llamada a un supervisor humano cuando el cliente pida hablar con una persona real”).custom_sip: Actívalo para introducir una dirección SIP o una extensión interna personalizadas en lugar de un número de teléfono (predeterminado:false)caller_id_mode: Qué número ve el supervisor al recibir la llamada. Opciones:outbound_number(predeterminado — muestra el número saliente),customer_number(muestra el número del interlocutor),custom(muestra un número personalizado)custom_caller_id: Número de teléfono personalizado mostrado al supervisor. Solo se usa cuandocaller_id_modeescustom.hold_music: Audio reproducido al interlocutor mientras espera. Opciones:hold_music(predeterminado — reproduce la música de espera predeterminada),none(silencio, sin música)hold_music_volume: Nivel de volumen de la música de espera, 0–100 (predeterminado:80)hold_message: Mensaje que se dice al interlocutor antes de ponerlo en espera (predeterminado: “Por favor, espere mientras le conecto con un supervisor”).summary_instructions: Instrucciones sobre cómo debe informar la IA al supervisor sobre la llamada (predeterminado: “Introduce la conversación desde tu perspectiva:\n- QUIÉN llama (nombre, empresa si se menciona)\n- POR QUÉ ha llamado (su objetivo o problema)\n- POR QUÉ se necesita a una persona en este punto\n\nSé breve (2-3 frases).”)briefing_initial_message: Primer mensaje opcional después de que el supervisor responde y habla primero. Si está vacío, las instrucciones de resumen determinan el inicio; solo se utiliza una introducción genérica localizada cuando estas también están vacías. Aceptar el resumen no autoriza la conexión.connected_message: Mensaje que se dice al interlocutor después de conectar con el supervisor (predeterminado: “Ya está conectado con un supervisor. Le dejo con él.”)
description: Cuándo debe finalizar la IA la llamada
tones: secuencia opcional que se enviará (0-9,*,#oA-D; 1–32 caracteres). Omítela para que el asistente elija los tonos durante la llamada.description: Cuándo usar la entrada DTMF (para navegación por IVR)
timeout: Tiempo total de recopilación en segundos, 5–120 (predeterminado:30)stop_key: tecla de envío:#(predeterminado) o*. El modo exacto requiere la cantidad fija;until_stopacepta la tecla tras el mínimo.digit_mode:exactpara una cantidad fija ountil_stoppara enviar tras el mínimo. Sin configuración se usauntil_stop; una cantidad guardada sin modo sigue siendo exacta.min_digits: mínimo en modountil_stop, 1–32 (predeterminado 1), sin superar el máximo.max_digits: cantidad exacta o máximo, 1–32. Predeterminado 16 conexactexplícito; 32 sin configuración.
calcom_api_key(obligatorio): Tu clave de API de Cal.comcalcom_event_slug(obligatorio): El slug del tipo de evento de Cal.comcalcom_team_slug: Slug del equipo si el evento pertenece a un equipo de Cal.comcalcom_endpoint: Región de la API de Cal.com. Opciones:us(predeterminado —https://api.cal.com),eu(https://api.cal.eu),custom(usacalcom_custom_endpoint)calcom_custom_endpoint: URL base personalizada de la API de Cal.com. Solo se usa cuandocalcom_endpointescustom(p. ej.,https://my-calcom-instance.com).calcom_booking_fields: Array de campos de reserva personalizados para el evento. Cada campo tiene:slug(obligatorio),type(obligatorio, p. ej. “text”, “email”, “phone”, “select”),label(obligatorio),required(predeterminado:false),options(array de opciones para campos de tipo select)description: Cuándo ofrecer la programación de citas
assistant_id(obligatorio): ID del asistente de destino. Debe pertenecer a tu cuenta y no puede ser el asistente que se está actualizando (no se permite la autotransferencia).description: Cuándo transferir (máx. 500 caracteres, predeterminado: “Transferir la conversación a este asistente cuando sea apropiado.”)message_before_transfer: Mensaje opcional que dice la IA antes de cambiar al asistente de destino (máx. 500 caracteres).speak_transfer_greeting: Si es true, el asistente de destino dice su mensaje inicial configurado después de completar la transferencia (predeterminado:true) Si false, el asistente de destino continúa la solicitud actual con el contexto transferido, sin repetir el saludo inicial.
"tools": [
{
"type": "dtmf_input",
"description": "Navegar por el IVR cuando sea necesario"
},
{
"type": "warm_call_transfer",
"supervisor_phone": "+1234567890",
"outbound_phone_id": 7,
"description": "Transfer the call to a human supervisor when the customer requests to speak with a real person.",
"custom_sip": false,
"caller_id_mode": "outbound_number",
"hold_music": "hold_music",
"hold_music_volume": 80,
"hold_message": "Please hold while I connect you with a supervisor.",
"summary_instructions": "Introduce the conversation from your perspective:\n- WHO is calling (name, company if mentioned)\n- WHY they called (their goal or problem)\n- WHY a human is needed at this point\n\nKeep it brief (2-3 sentences).",
"briefing_initial_message": "Hello! I have a caller on the line who needs your assistance. May I brief you on the situation?",
"connected_message": "You are now connected with a supervisor. I'll leave you to it."
},
{
"type": "collect_keypad",
"timeout": 5,
"stop_key": "#"
},
{
"type": "assistant_transfer",
"assistant_id": 14765,
"description": "Transfer to the Support Assistant when the customer needs technical help.",
"message_before_transfer": "Sure — let me transfer you to our support specialist.",
"speak_transfer_greeting": true
},
{
"type": "end_call",
"description": "End call when done"
}
]
Cuando listas asistentes, cada herramienta configurada se devuelve como
{ "type": "...", "data": { ... } }, con los mismos nombres de campo anidados bajo data (no en el nivel superior).Ajustes de voz y TTS
boolean
Si la síntesis de voz emocional está activada
number
Ajuste de estabilidad de voz (0-1). Más alto = voz más consistente
number
Ajuste de similitud de voz (0-1). Más alto = más cercano a la voz original
number
Multiplicador de velocidad de habla (0.7-1.2)
number
Ajuste de temperatura del LLM (0-1). Más bajo = más determinista
integer
ID de proveedor de TTS personalizado. Se establece en
null para usar la voz predeterminada del sistema. Consulta Obtener proveedores de síntesis de voz.integer
ID de proveedor de STT personalizado. Solo en modo pipeline. Se establece en
null para usar la voz predeterminada del sistema. Consulta Obtener proveedores de transcripción.Ajustes de comportamiento de la llamada
boolean
Si se permiten las interrupciones del interlocutor.
No se puede desactivar en los modos
multimodal y dualplex.boolean
Si se debe usar audio de relleno durante el procesamiento.
Disponible únicamente en modo
pipeline.object
Perfiles de relleno personalizados por categoría. Reemplaza la configuración de relleno existente. Cada categoría es un array de frases cortas.
positive: Rellenos para respuestas afirmativasnegative: Rellenos para respuestas negativas/neutrasquestion: Rellenos al procesar una preguntaneutral: Rellenos para confirmaciones neutras
"filler_config": {
"positive": ["Great!", "Perfect!"],
"negative": ["Hmm.", "Understood."],
"question": ["Good question.", "One moment."],
"neutral": ["Okay.", "Noted."]
}
boolean
Si la llamada debe grabarse
boolean
Si la cancelación de ruido debe estar activada
boolean
Si es true, el asistente espera a que el cliente hable primero
Ajustes de tiempos
integer
Duración máxima de la llamada en segundos (20-1200)
integer
Duración máxima de silencio antes de la reactivación, en segundos (1-360)
integer
Silencio máximo al inicio de la llamada antes de finalizarla (1-120 segundos). Se establece en
null para desactivarlo.integer
Tiempo máximo de timbrado antes de abortar (1-60 segundos)
Ajustes de reactivación
integer
Intervalo de reactivación en segundos (7-600)
string
Prompt personalizado para los mensajes de reactivación (máx. 1000 caracteres). Se establece en
null para usar el predeterminado.Ajustes de buzón de voz
boolean
Si la llamada debe finalizar cuando se detecta un buzón de voz
string
Mensaje que se deja en el buzón de voz antes de colgar (máx. 1000 caracteres). Se establece en
null para desactivarlo.Detección de fin de intervención
string
Tipo de detección de actividad de voz. Opciones:
vad, ainumber
Nivel de sensibilidad de fin de intervención (0-5)
number
Nivel de sensibilidad a las interrupciones (0-5)
integer
Número mínimo de palabras antes de permitir una interrupción (0-10). Se establece en
null para desactivarlo.Sonido ambiental
string
Sonido ambiental de fondo. Opciones:
off, office, city, forest, crowded_room, cafe, naturenumber
Volumen del sonido ambiental (0-1)
Configuración de webhook
boolean
Si las notificaciones por webhook están activadas
string
La URL del webhook para las notificaciones posteriores a la llamada. Se establece en
null para eliminarla.boolean
Si los webhooks deben enviarse solo para las llamadas completadas correctamente (no en caso de fallo/sin respuesta)
boolean
Si la URL de la grabación debe incluirse en el payload del webhook
Evaluación posterior a la llamada
boolean
Si la evaluación posterior a la llamada basada en IA está activada
array
Definición del esquema para extraer datos posteriores a la llamada. Reemplaza el esquema existente.
Variables
object
Pares clave-valor para variables personalizadas. Reemplaza todas las variables existentes.
"variables": {
"company_name": "Acme Corp",
"product": "Premium Widget"
}
Ejemplos de solicitudes
Actualizar ajustes básicos
{
"name": "Updated Assistant Name",
"initial_message": "Hello! How can I help you today?",
"max_duration": 900
}
Cambiar a modo multimodal
{
"mode": "multimodal",
"voice_id": 41,
"multimodal_model_id": 1,
"chat_llm_fallback_id": 2,
"knowledgebase_mode": "function_call"
}
Actualizar herramientas y base de conocimiento
{
"tool_ids": [1, 5, 12],
"knowledgebase_id": 3,
"knowledgebase_mode": "prompt"
}
Actualizar reactivación y buzón de voz
{
"reengagement_interval": 15,
"reengagement_prompt": "Are you still there? I'm here to help.",
"end_call_on_voicemail": true,
"voice_mail_message": "Hello, please call us back at your earliest convenience."
}
Eliminar ajustes opcionales
{
"phone_number_id": null,
"webhook_url": null,
"tool_ids": [],
"secondary_language_ids": []
}
Respuesta
string
Mensaje de éxito que confirma la actualización del asistente
object
{
"message": "Assistant updated successfully",
"data": {
"id": 789,
"name": "Updated Sales Assistant",
"status": "active",
"type": "outbound",
"mode": "pipeline"
}
}
{
"message": "Assistant not found"
}
{
"message": "Validation failed",
"errors": {
"speech_speed": ["Speech speed must be between 0.7 and 1.2."],
"voice_id": ["The selected voice is not compatible with the selected engine type."],
"allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
}
}
Notas
- Solo se actualizan los campos que proporciones en el cuerpo de la solicitud
- Para eliminar campos opcionales, establécelos explícitamente en
null - Para vaciar arrays (herramientas, idiomas secundarios), pasa un array vacío
[] - El asistente debe pertenecer al usuario autenticado
- Usa el endpoint Obtener voces con el parámetro
modepara obtener voces compatibles - Para los modos multimodal/dualplex,
knowledgebase_modedebe establecerse enfunction_call - En los modos multimodal/dualplex, las interrupciones (
allow_interruptions) no se pueden desactivar - Cambiar el modo restablece los ajustes específicos del modo (modelo LLM, modelo multimodal, proveedores)