{"id":"44bf0d3e-358a-42d3-a47a-c95ca8b1fd5d","shortId":"F94bvm","kind":"skill","title":"telnyx-ai-inference-ruby","tagline":">-","description":"<!-- Auto-generated from Telnyx OpenAPI specs. Do not edit. -->\n\n# Telnyx Ai Inference - Ruby\n\n## Installation\n\n```bash\ngem install telnyx\n```\n\n## Setup\n\n```ruby\nrequire \"telnyx\"\n\nclient = Telnyx::Client.new(\n  api_key: ENV[\"TELNYX_API_KEY\"], # This is the default and can be omitted\n)\n```\n\nAll examples below assume `client` is already initialized as shown above.\n\n## Error Handling\n\nAll API calls can fail with network errors, rate limits (429), validation errors (422),\nor authentication errors (401). Always handle errors in production code:\n\n```ruby\nbegin\n  result = client.messages.send_(to: \"+13125550001\", from: \"+13125550002\", text: \"Hello\")\nrescue Telnyx::Errors::APIConnectionError\n  puts \"Network error — check connectivity and retry\"\nrescue Telnyx::Errors::RateLimitError\n  # 429: rate limited — wait and retry with exponential backoff\n  sleep(1) # Check Retry-After header for actual delay\nrescue Telnyx::Errors::APIStatusError => e\n  puts \"API error #{e.status}: #{e.message}\"\n  if e.status == 422\n    puts \"Validation error — check required fields and formats\"\n  end\nend\n```\n\nCommon error codes: `401` invalid API key, `403` insufficient permissions,\n`404` resource not found, `422` validation error (check field formats),\n`429` rate limited (retry with exponential backoff).\n\n## Important Notes\n\n- **Pagination:** Use `.auto_paging_each` for automatic iteration: `page.auto_paging_each { |item| puts item.id }`.\n\n## Transcribe speech to text\n\nTranscribe speech to text. This endpoint is consistent with the [OpenAI Transcription API](https://platform.openai.com/docs/api-reference/audio/createTranscription) and may be used with the OpenAI JS or Python SDK.\n\n`POST /ai/audio/transcriptions`\n\n```ruby\nresponse = client.ai.audio.transcribe(model: :\"distil-whisper/distil-large-v2\")\n\nputs(response)\n```\n\nReturns: `duration` (number), `segments` (array[object]), `text` (string)\n\n## Create a chat completion\n\nChat with a language model. This endpoint is consistent with the [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat) and may be used with the OpenAI JS or Python SDK.\n\n`POST /ai/chat/completions` — Required: `messages`\n\nOptional: `api_key_ref` (string), `best_of` (integer), `early_stopping` (boolean), `enable_thinking` (boolean), `frequency_penalty` (number), `guided_choice` (array[string]), `guided_json` (object), `guided_regex` (string), `length_penalty` (number), `logprobs` (boolean), `max_tokens` (integer), `min_p` (number), `model` (string), `n` (number), `presence_penalty` (number), `response_format` (object), `stream` (boolean), `temperature` (number), `tool_choice` (enum: none, auto, required), `tools` (array[object]), `top_logprobs` (integer), `top_p` (number), `use_beam_search` (boolean)\n\n```ruby\nresponse = client.ai.chat.create_completion(\n  messages: [{content: \"You are a friendly chatbot.\", role: :system}, {content: \"Hello, world!\", role: :user}]\n)\n\nputs(response)\n```\n\n## List conversations\n\nRetrieve a list of all AI conversations configured by the user. Supports [PostgREST-style query parameters](https://postgrest.org/en/stable/api.html#horizontal-filtering-rows) for filtering. Examples are included for the standard metadata fields, but you can filter on any field in the metadata JSON object.\n\n`GET /ai/conversations`\n\n```ruby\nconversations = client.ai.conversations.list\n\nputs(conversations)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `last_message_at` (date-time), `metadata` (object), `name` (string)\n\n## Create a conversation\n\nCreate a new AI Conversation.\n\n`POST /ai/conversations`\n\nOptional: `metadata` (object), `name` (string)\n\n```ruby\nconversation = client.ai.conversations.create\n\nputs(conversation)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `last_message_at` (date-time), `metadata` (object), `name` (string)\n\n## Get Insight Template Groups\n\nGet all insight groups\n\n`GET /ai/conversations/insight-groups`\n\n```ruby\npage = client.ai.conversations.insight_groups.retrieve_insight_groups\n\nputs(page)\n```\n\nReturns: `created_at` (date-time), `description` (string), `id` (uuid), `insights` (array[object]), `name` (string), `webhook` (string)\n\n## Create Insight Template Group\n\nCreate a new insight group\n\n`POST /ai/conversations/insight-groups` — Required: `name`\n\nOptional: `description` (string), `webhook` (string)\n\n```ruby\ninsight_template_group_detail = client.ai.conversations.insight_groups.insight_groups(name: \"my-resource\")\n\nputs(insight_template_group_detail)\n```\n\nReturns: `created_at` (date-time), `description` (string), `id` (uuid), `insights` (array[object]), `name` (string), `webhook` (string)\n\n## Get Insight Template Group\n\nGet insight group by ID\n\n`GET /ai/conversations/insight-groups/{group_id}`\n\n```ruby\ninsight_template_group_detail = client.ai.conversations.insight_groups.retrieve(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(insight_template_group_detail)\n```\n\nReturns: `created_at` (date-time), `description` (string), `id` (uuid), `insights` (array[object]), `name` (string), `webhook` (string)\n\n## Update Insight Template Group\n\nUpdate an insight template group\n\n`PUT /ai/conversations/insight-groups/{group_id}`\n\nOptional: `description` (string), `name` (string), `webhook` (string)\n\n```ruby\ninsight_template_group_detail = client.ai.conversations.insight_groups.update(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(insight_template_group_detail)\n```\n\nReturns: `created_at` (date-time), `description` (string), `id` (uuid), `insights` (array[object]), `name` (string), `webhook` (string)\n\n## Delete Insight Template Group\n\nDelete insight group by ID\n\n`DELETE /ai/conversations/insight-groups/{group_id}`\n\n```ruby\nresult = client.ai.conversations.insight_groups.delete(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(result)\n```\n\n## Assign Insight Template To Group\n\nAssign an insight to a group\n\n`POST /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/assign`\n\n```ruby\nresult = client.ai.conversations.insight_groups.insights.assign(\n  \"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n  group_id: \"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\"\n)\n\nputs(result)\n```\n\n## Unassign Insight Template From Group\n\nRemove an insight from a group\n\n`DELETE /ai/conversations/insight-groups/{group_id}/insights/{insight_id}/unassign`\n\n```ruby\nresult = client.ai.conversations.insight_groups.insights.delete_unassign(\n  \"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\",\n  group_id: \"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\"\n)\n\nputs(result)\n```\n\n## Get Insight Templates\n\nGet all insights\n\n`GET /ai/conversations/insights`\n\n```ruby\npage = client.ai.conversations.insights.list\n\nputs(page)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `insight_type` (enum: custom, default), `instructions` (string), `json_schema` (object), `name` (string), `webhook` (string)\n\n## Create Insight Template\n\nCreate a new insight\n\n`POST /ai/conversations/insights` — Required: `instructions`, `name`\n\nOptional: `json_schema` (object), `webhook` (string)\n\n```ruby\ninsight_template_detail = client.ai.conversations.insights.create(instructions: \"You are a helpful assistant.\", name: \"my-resource\")\n\nputs(insight_template_detail)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `insight_type` (enum: custom, default), `instructions` (string), `json_schema` (object), `name` (string), `webhook` (string)\n\n## Get Insight Template\n\nGet insight by ID\n\n`GET /ai/conversations/insights/{insight_id}`\n\n```ruby\ninsight_template_detail = client.ai.conversations.insights.retrieve(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(insight_template_detail)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `insight_type` (enum: custom, default), `instructions` (string), `json_schema` (object), `name` (string), `webhook` (string)\n\n## Update Insight Template\n\nUpdate an insight template\n\n`PUT /ai/conversations/insights/{insight_id}`\n\nOptional: `instructions` (string), `json_schema` (object), `name` (string), `webhook` (string)\n\n```ruby\ninsight_template_detail = client.ai.conversations.insights.update(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(insight_template_detail)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `insight_type` (enum: custom, default), `instructions` (string), `json_schema` (object), `name` (string), `webhook` (string)\n\n## Delete Insight Template\n\nDelete insight by ID\n\n`DELETE /ai/conversations/insights/{insight_id}`\n\n```ruby\nresult = client.ai.conversations.insights.delete(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(result)\n```\n\n## Get a conversation\n\nRetrieve a specific AI conversation by its ID.\n\n`GET /ai/conversations/{conversation_id}`\n\n```ruby\nconversation = client.ai.conversations.retrieve(\"550e8400-e29b-41d4-a716-446655440000\")\n\nputs(conversation)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `last_message_at` (date-time), `metadata` (object), `name` (string)\n\n## Update conversation metadata\n\nUpdate metadata for a specific conversation.\n\n`PUT /ai/conversations/{conversation_id}`\n\nOptional: `metadata` (object)\n\n```ruby\nconversation = client.ai.conversations.update(\"550e8400-e29b-41d4-a716-446655440000\")\n\nputs(conversation)\n```\n\nReturns: `created_at` (date-time), `id` (uuid), `last_message_at` (date-time), `metadata` (object), `name` (string)\n\n## Delete a conversation\n\nDelete a specific conversation by its ID.\n\n`DELETE /ai/conversations/{conversation_id}`\n\n```ruby\nresult = client.ai.conversations.delete(\"550e8400-e29b-41d4-a716-446655440000\")\n\nputs(result)\n```\n\n## Get insights for a conversation\n\nRetrieve insights for a specific conversation\n\n`GET /ai/conversations/{conversation_id}/conversations-insights`\n\n```ruby\nresponse = client.ai.conversations.retrieve_conversations_insights(\"550e8400-e29b-41d4-a716-446655440000\")\n\nputs(response)\n```\n\nReturns: `conversation_insights` (array[object]), `created_at` (date-time), `id` (string), `status` (enum: pending, in_progress, completed, failed)\n\n## Create Message\n\nAdd a new message to the conversation. Used to insert a new messages to a conversation manually ( without using chat endpoint )\n\n`POST /ai/conversations/{conversation_id}/message` — Required: `role`\n\nOptional: `content` (string), `metadata` (object), `name` (string), `sent_at` (date-time), `tool_call_id` (string), `tool_calls` (array[object]), `tool_choice` (object)\n\n```ruby\nresult = client.ai.conversations.add_message(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\", role: \"user\")\n\nputs(result)\n```\n\n## Get conversation messages\n\nRetrieve messages for a specific conversation, including tool calls made by the assistant.\n\n`GET /ai/conversations/{conversation_id}/messages`\n\n```ruby\nmessages = client.ai.conversations.messages.list(\"550e8400-e29b-41d4-a716-446655440000\")\n\nputs(messages)\n```\n\nReturns: `created_at` (date-time), `role` (enum: user, assistant, tool), `sent_at` (date-time), `text` (string), `tool_calls` (array[object])\n\n## Get Tasks by Status\n\nRetrieve tasks for the user that are either `queued`, `processing`, `failed`, `success` or `partial_success` based on the query string. Defaults to `queued` and `processing`.\n\n`GET /ai/embeddings`\n\n```ruby\nembeddings = client.ai.embeddings.list\n\nputs(embeddings)\n```\n\nReturns: `bucket` (string), `created_at` (date-time), `finished_at` (date-time), `status` (enum: queued, processing, success, failure, partial_success), `task_id` (string), `task_name` (string), `user_id` (string)\n\n## Embed documents\n\nPerform embedding on a Telnyx Storage Bucket using an embedding model. The current supported file types are:\n- PDF\n- HTML\n- txt/unstructured text files\n- json\n- csv\n- audio / video (mp3, mp4, mpeg, mpga, m4a, wav, or webm ) - Max of 100mb file size. Any files not matching the above types will be attempted to be embedded as unstructured text.\n\n`POST /ai/embeddings` — Required: `bucket_name`\n\nOptional: `document_chunk_overlap_size` (integer), `document_chunk_size` (integer), `embedding_model` (object), `loader` (object)\n\n```ruby\nembedding_response = client.ai.embeddings.create(bucket_name: \"my-bucket\")\n\nputs(embedding_response)\n```\n\nReturns: `created_at` (string), `finished_at` (string | null), `status` (string), `task_id` (uuid), `task_name` (string), `user_id` (uuid)\n\n## List embedded buckets\n\nGet all embedding buckets for a user.\n\n`GET /ai/embeddings/buckets`\n\n```ruby\nbuckets = client.ai.embeddings.buckets.list\n\nputs(buckets)\n```\n\nReturns: `buckets` (array[string])\n\n## Get file-level embedding statuses for a bucket\n\nGet all embedded files for a given user bucket, including their processing status.\n\n`GET /ai/embeddings/buckets/{bucket_name}`\n\n```ruby\nbucket = client.ai.embeddings.buckets.retrieve(\"bucket_name\")\n\nputs(bucket)\n```\n\nReturns: `created_at` (date-time), `error_reason` (string), `filename` (string), `last_embedded_at` (date-time), `status` (string), `updated_at` (date-time)\n\n## Disable AI for an Embedded Bucket\n\nDeletes an entire bucket's embeddings and disables the bucket for AI-use, returning it to normal storage pricing.\n\n`DELETE /ai/embeddings/buckets/{bucket_name}`\n\n```ruby\nresult = client.ai.embeddings.buckets.delete(\"bucket_name\")\n\nputs(result)\n```\n\n## Search for documents\n\nPerform a similarity search on a Telnyx Storage Bucket, returning the most similar `num_docs` document chunks to the query. Currently the only available distance metric is cosine similarity which will return a `distance` between 0 and 1. The lower the distance, the more similar the returned document chunks are to the query.\n\n`POST /ai/embeddings/similarity-search` — Required: `bucket_name`, `query`\n\nOptional: `num_of_docs` (integer)\n\n```ruby\nresponse = client.ai.embeddings.similarity_search(bucket_name: \"my-bucket\", query: \"What is Telnyx?\")\n\nputs(response)\n```\n\nReturns: `distance` (number), `document_chunk` (string), `metadata` (object)\n\n## Embed URL content\n\nEmbed website content from a specified URL, including child pages up to 5 levels deep within the same domain. The process crawls and loads content from the main URL and its linked pages into a Telnyx Cloud Storage bucket.\n\n`POST /ai/embeddings/url` — Required: `url`, `bucket_name`\n\n```ruby\nembedding_response = client.ai.embeddings.url(bucket_name: \"my-bucket\", url: \"https://example.com/resource\")\n\nputs(embedding_response)\n```\n\nReturns: `created_at` (string), `finished_at` (string | null), `status` (string), `task_id` (uuid), `task_name` (string), `user_id` (uuid)\n\n## Get an embedding task's status\n\nCheck the status of a current embedding task. Will be one of the following:\n- `queued` - Task is waiting to be picked up by a worker\n- `processing` - The embedding task is running\n- `success` - Task completed successfully and the bucket is embedded\n- `failure` - Task failed and no files were embedded successfully\n- `partial_success` - Some files were embedded successfully, but at least one failed\n\n`GET /ai/embeddings/{task_id}`\n\n```ruby\nembedding = client.ai.embeddings.retrieve(\"task_id\")\n\nputs(embedding)\n```\n\nReturns: `created_at` (string), `finished_at` (string), `status` (enum: queued, processing, success, failure, partial_success), `task_id` (uuid), `task_name` (string)\n\n## List fine tuning jobs\n\nRetrieve a list of all fine tuning jobs created by the user.\n\n`GET /ai/fine_tuning/jobs`\n\n```ruby\njobs = client.ai.fine_tuning.jobs.list\n\nputs(jobs)\n```\n\nReturns: `created_at` (integer), `finished_at` (integer | null), `hyperparameters` (object), `id` (string), `model` (string), `organization_id` (string), `status` (enum: queued, running, succeeded, failed, cancelled), `trained_tokens` (integer | null), `training_file` (string)\n\n## Create a fine tuning job\n\nCreate a new fine tuning job.\n\n`POST /ai/fine_tuning/jobs` — Required: `model`, `training_file`\n\nOptional: `hyperparameters` (object), `suffix` (string)\n\n```ruby\nfine_tuning_job = client.ai.fine_tuning.jobs.create(model: \"openai/gpt-4o\", training_file: \"training-data.jsonl\")\n\nputs(fine_tuning_job)\n```\n\nReturns: `created_at` (integer), `finished_at` (integer | null), `hyperparameters` (object), `id` (string), `model` (string), `organization_id` (string), `status` (enum: queued, running, succeeded, failed, cancelled), `trained_tokens` (integer | null), `training_file` (string)\n\n## Get a fine tuning job\n\nRetrieve a fine tuning job by `job_id`.\n\n`GET /ai/fine_tuning/jobs/{job_id}`\n\n```ruby\nfine_tuning_job = client.ai.fine_tuning.jobs.retrieve(\"job_id\")\n\nputs(fine_tuning_job)\n```\n\nReturns: `created_at` (integer), `finished_at` (integer | null), `hyperparameters` (object), `id` (string), `model` (string), `organization_id` (string), `status` (enum: queued, running, succeeded, failed, cancelled), `trained_tokens` (integer | null), `training_file` (string)\n\n## Cancel a fine tuning job\n\nCancel a fine tuning job.\n\n`POST /ai/fine_tuning/jobs/{job_id}/cancel`\n\n```ruby\nfine_tuning_job = client.ai.fine_tuning.jobs.cancel(\"job_id\")\n\nputs(fine_tuning_job)\n```\n\nReturns: `created_at` (integer), `finished_at` (integer | null), `hyperparameters` (object), `id` (string), `model` (string), `organization_id` (string), `status` (enum: queued, running, succeeded, failed, cancelled), `trained_tokens` (integer | null), `training_file` (string)\n\n## Get available models\n\nThis endpoint returns a list of Open Source and OpenAI models that are available for use.    **Note**: Model `id`'s will be in the form `{source}/{model_name}`. For example `openai/gpt-4` or `mistralai/Mistral-7B-Instruct-v0.1` consistent with HuggingFace naming conventions.\n\n`GET /ai/models`\n\n```ruby\nresponse = client.ai.retrieve_models\n\nputs(response)\n```\n\nReturns: `created` (integer), `id` (string), `object` (string), `owned_by` (string)\n\n## Create embeddings\n\nCreates an embedding vector representing the input text. This endpoint is compatible with the [OpenAI Embeddings API](https://platform.openai.com/docs/api-reference/embeddings) and may be used with the OpenAI JS or Python SDK by setting the base URL to `https://api.telnyx.com/v2/ai/openai`.\n\n`POST /ai/openai/embeddings` — Required: `input`, `model`\n\nOptional: `dimensions` (integer), `encoding_format` (enum: float, base64), `user` (string)\n\n```ruby\nresponse = client.ai.openai.embeddings.create_embeddings(\n  input: \"The quick brown fox jumps over the lazy dog\",\n  model: \"thenlper/gte-large\"\n)\n\nputs(response)\n```\n\nReturns: `data` (array[object]), `model` (string), `object` (string), `usage` (object)\n\n## List embedding models\n\nReturns a list of available embedding models. This endpoint is compatible with the OpenAI Models API format.\n\n`GET /ai/openai/embeddings/models`\n\n```ruby\nresponse = client.ai.openai.embeddings.list_embedding_models\n\nputs(response)\n```\n\nReturns: `created` (integer), `id` (string), `object` (string), `owned_by` (string)\n\n## Summarize file content\n\nGenerate a summary of a file's contents. Supports the following text formats: \n- PDF, HTML, txt, json, csv\n\n Supports the following media formats (billed for both the transcription and summary): \n- flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm\n- Up to 100 MB\n\n`POST /ai/summarize` — Required: `bucket`, `filename`\n\nOptional: `system_prompt` (string)\n\n```ruby\nresponse = client.ai.summarize(bucket: \"my-bucket\", filename: \"data.csv\")\n\nputs(response)\n```\n\nReturns: `summary` (string)\n\n## Get all Speech to Text batch report requests\n\nRetrieves all Speech to Text batch report requests for the authenticated user\n\n`GET /legacy/reporting/batch_detail_records/speech_to_text`\n\n```ruby\nspeech_to_texts = client.legacy.reporting.batch_detail_records.speech_to_text.list\n\nputs(speech_to_texts)\n```\n\nReturns: `created_at` (date-time), `download_link` (string), `end_date` (date-time), `id` (string), `record_type` (string), `start_date` (date-time), `status` (enum: PENDING, COMPLETE, FAILED, EXPIRED)\n\n## Create a new Speech to Text batch report request\n\nCreates a new Speech to Text batch report request with the specified filters\n\n`POST /legacy/reporting/batch_detail_records/speech_to_text` — Required: `start_date`, `end_date`\n\n```ruby\nspeech_to_text = client.legacy.reporting.batch_detail_records.speech_to_text.create(\n  end_date: \"2020-07-01T00:00:00-06:00\",\n  start_date: \"2020-07-01T00:00:00-06:00\"\n)\n\nputs(speech_to_text)\n```\n\nReturns: `created_at` (date-time), `download_link` (string), `end_date` (date-time), `id` (string), `record_type` (string), `start_date` (date-time), `status` (enum: PENDING, COMPLETE, FAILED, EXPIRED)\n\n## Get a specific Speech to Text batch report request\n\nRetrieves a specific Speech to Text batch report request by ID\n\n`GET /legacy/reporting/batch_detail_records/speech_to_text/{id}`\n\n```ruby\nspeech_to_text = client.legacy.reporting.batch_detail_records.speech_to_text.retrieve(\n  \"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\"\n)\n\nputs(speech_to_text)\n```\n\nReturns: `created_at` (date-time), `download_link` (string), `end_date` (date-time), `id` (string), `record_type` (string), `start_date` (date-time), `status` (enum: PENDING, COMPLETE, FAILED, EXPIRED)\n\n## Delete a Speech to Text batch report request\n\nDeletes a specific Speech to Text batch report request by ID\n\n`DELETE /legacy/reporting/batch_detail_records/speech_to_text/{id}`\n\n```ruby\nspeech_to_text = client.legacy.reporting.batch_detail_records.speech_to_text.delete(\"182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e\")\n\nputs(speech_to_text)\n```\n\nReturns: `created_at` (date-time), `download_link` (string), `end_date` (date-time), `id` (string), `record_type` (string), `start_date` (date-time), `status` (enum: PENDING, COMPLETE, FAILED, EXPIRED)\n\n## Get speech to text usage report\n\nGenerate and fetch speech to text usage report synchronously. This endpoint will both generate and fetch the speech to text report over a specified time period.\n\n`GET /legacy/reporting/usage_reports/speech_to_text`\n\n```ruby\nresponse = client.legacy.reporting.usage_reports.retrieve_speech_to_text\n\nputs(response)\n```\n\nReturns: `data` (object)\n\n## Generate speech from text\n\nGenerate synthesized speech audio from text input. Returns audio in the requested format (binary audio stream, base64-encoded JSON, or an audio URL for later retrieval). Authentication is provided via the standard `Authorization: Bearer ` header.\n\n`POST /text-to-speech/speech`\n\nOptional: `aws` (object), `azure` (object), `disable_cache` (boolean), `elevenlabs` (object), `language` (string), `minimax` (object), `output_type` (enum: binary_output, base64_output), `provider` (enum: aws, telnyx, azure, elevenlabs, minimax, rime, resemble), `resemble` (object), `rime` (object), `telnyx` (object), `text` (string), `text_type` (enum: text, ssml), `voice` (string), `voice_settings` (object)\n\n```ruby\nresponse = client.text_to_speech.generate\n\nputs(response)\n```\n\nReturns: `base64_audio` (string)\n\n## List available voices\n\nRetrieve a list of available voices from one or all TTS providers. When `provider` is specified, returns voices for that provider only. Otherwise, returns voices from all providers.\n\n`GET /text-to-speech/voices`\n\n```ruby\nresponse = client.text_to_speech.list_voices\n\nputs(response)\n```\n\nReturns: `voices` (array[object])","tags":["telnyx","inference","ruby","team-telnyx","agent-skills","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk"],"capabilities":["skill","source-team-telnyx","skill-telnyx-ai-inference-ruby","topic-agent-skills","topic-ai-coding-agent","topic-claude-code","topic-cpaas","topic-cursor","topic-iot","topic-llm","topic-sdk","topic-sip","topic-sms","topic-speech-to-text","topic-telephony"],"categories":["ai"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/team-telnyx/ai/telnyx-ai-inference-ruby","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add team-telnyx/ai","source_repo":"https://github.com/team-telnyx/ai","install_from":"skills.sh"}},"qualityScore":"0.533","qualityRationale":"deterministic score 0.53 from registry signals: · indexed on github topic:agent-skills · 167 github stars · SKILL.md body (22,912 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T12:54:44.488Z","embedding":null,"createdAt":"2026-04-18T22:06:21.671Z","updatedAt":"2026-04-22T12:54:44.488Z","lastSeenAt":"2026-04-22T12:54:44.488Z","tsv":"'+13125550001':78 '+13125550002':80 '-01':2411,2421 '-06':2415,2425 '-07':2410,2420 '/ai/audio/transcriptions':215 '/ai/chat/completions':268 '/ai/conversations':407,440,990,1032,1078,1104,1164,1224 '/ai/conversations/insight-groups':478,513,564,611,665,691,729 '/ai/conversations/insights':763,799,858,906,964 '/ai/embeddings':1291,1385,1791 '/ai/embeddings/buckets':1446,1479,1540 '/ai/embeddings/similarity-search':1607 '/ai/embeddings/url':1683 '/ai/fine_tuning/jobs':1839,1888,1957,2013 '/ai/models':2101 '/ai/openai/embeddings':2161 '/ai/openai/embeddings/models':2224 '/ai/summarize':2290 '/assign':697 '/cancel':2016 '/conversations-insights':1107 '/distil-large-v2':223 '/docs/api-reference/audio/createtranscription)':202 '/docs/api-reference/chat)':255 '/docs/api-reference/embeddings)':2139 '/en/stable/api.html#horizontal-filtering-rows)':383 '/insights':694,732 '/legacy/reporting/batch_detail_records/speech_to_text':2333,2396,2482,2549 '/legacy/reporting/usage_reports/speech_to_text':2629 '/message':1167 '/messages':1227 '/resource':1700 '/text-to-speech/speech':2682 '/text-to-speech/voices':2772 '/unassign':735 '/v2/ai/openai':2159 '0':1588 '00':2413,2414,2416,2423,2424,2426 '1':108,1590 '100':2287 '100mb':1365 '182bd5e5':574,628,672,702,710,741,749,867,925,971,1198,2490,2557 '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e':573,627,671,701,709,740,748,866,924,970,1197,2489,2556 '2020':2409,2419 '401':66,143 '403':147 '404':150 '41d4':999,1044,1087,1116,1234 '422':62,129,154 '429':59,98,160 '446655440000':1001,1046,1089,1118,1236 '4fe4':576,630,674,704,712,743,751,869,927,973,1200,2492,2559 '5':1655 '550e8400':996,1041,1084,1113,1231 '6e1a':575,629,673,703,711,742,750,868,926,972,1199,2491,2558 'a716':1000,1045,1088,1117,1235 'a799':577,631,675,705,713,744,752,870,928,974,1201,2493,2560 'aa6d9a6ab26e':578,632,676,706,714,745,753,871,929,975,1202,2494,2561 'actual':115 'add':1142 'ai':3,7,369,437,984,1514,1531 'ai-us':1530 'alreadi':42 'alway':67 'api':22,26,50,123,145,199,252,272,2136,2221 'api.telnyx.com':2158 'api.telnyx.com/v2/ai/openai':2157 'apiconnectionerror':86 'apistatuserror':120 'array':230,290,330,497,548,595,649,1124,1188,1259,1454,2195,2781 'assign':679,684 'assist':819,1222,1248 'assum':39 'attempt':1377 'audio':1353,2648,2653,2659,2667,2738 'authent':64,2330,2672 'author':2678 'auto':171,327 'automat':175 'avail':1576,2060,2075,2210,2741,2747 'aw':2684,2706 'azur':2686,2708 'backoff':106,166 'base':1280,2154 'base64':2172,2662,2702,2737 'base64-encoded':2661 'bash':11 'batch':2317,2325,2379,2388,2467,2476,2534,2543 'beam':339 'bearer':2679 'begin':74 'best':276 'bill':2268 'binari':2658,2700 'boolean':281,284,302,320,341,2690 'brown':2182 'bucket':1298,1335,1387,1408,1412,1437,1441,1448,1451,1453,1464,1473,1480,1483,1485,1488,1518,1522,1528,1541,1546,1561,1609,1621,1625,1681,1686,1692,1696,1766,2292,2301,2304 'cach':2689 'call':51,1183,1187,1218,1258 'cancel':1868,1935,1994,2002,2007,2051 'chat':236,238,250,1161 'chatbot':352 'check':90,109,133,157,1729 'child':1651 'choic':289,324,1191 'chunk':1391,1396,1569,1601,1636 'client':19,40 'client.ai.audio.transcribe':218 'client.ai.chat.create':344 'client.ai.conversations.add':1195 'client.ai.conversations.create':448 'client.ai.conversations.delete':1083 'client.ai.conversations.insight_groups.delete':670 'client.ai.conversations.insight_groups.insight':526 'client.ai.conversations.insight_groups.insights.assign':700 'client.ai.conversations.insight_groups.insights.delete':738 'client.ai.conversations.insight_groups.retrieve':481,572 'client.ai.conversations.insight_groups.update':626 'client.ai.conversations.insights.create':813 'client.ai.conversations.insights.delete':969 'client.ai.conversations.insights.list':766 'client.ai.conversations.insights.retrieve':865 'client.ai.conversations.insights.update':923 'client.ai.conversations.list':410 'client.ai.conversations.messages.list':1230 'client.ai.conversations.retrieve':995,1110 'client.ai.conversations.update':1040 'client.ai.embeddings.buckets.delete':1545 'client.ai.embeddings.buckets.list':1449 'client.ai.embeddings.buckets.retrieve':1484 'client.ai.embeddings.create':1407 'client.ai.embeddings.list':1294 'client.ai.embeddings.retrieve':1796 'client.ai.embeddings.similarity':1619 'client.ai.embeddings.url':1691 'client.ai.fine_tuning.jobs.cancel':2021 'client.ai.fine_tuning.jobs.create':1902 'client.ai.fine_tuning.jobs.list':1842 'client.ai.fine_tuning.jobs.retrieve':1964 'client.ai.openai.embeddings.create':2177 'client.ai.openai.embeddings.list':2227 'client.ai.retrieve':2104 'client.ai.summarize':2300 'client.legacy.reporting.batch_detail_records.speech_to_text.create':2406 'client.legacy.reporting.batch_detail_records.speech_to_text.delete':2555 'client.legacy.reporting.batch_detail_records.speech_to_text.list':2338 'client.legacy.reporting.batch_detail_records.speech_to_text.retrieve':2488 'client.legacy.reporting.usage_reports.retrieve':2632 'client.messages.send':76 'client.new':21 'client.text_to_speech.generate':2733 'client.text_to_speech.list':2775 'cloud':1679 'code':72,142 'common':140 'compat':2131,2216 'complet':237,251,345,1138,1762,2370,2458,2526,2593 'configur':371 'connect':91 'consist':194,246,2095 'content':347,355,1171,1642,1645,1667,2244,2252 'convent':2099 'convers':363,370,409,412,433,438,447,450,980,985,991,994,1003,1023,1030,1033,1039,1048,1069,1073,1079,1096,1102,1105,1111,1122,1148,1157,1165,1208,1215,1225 'cosin':1580 'crawl':1664 'creat':234,414,431,434,452,487,503,507,538,585,639,770,791,794,829,877,935,1005,1050,1126,1140,1240,1300,1417,1490,1705,1802,1834,1846,1876,1881,1913,1972,2029,2109,2118,2120,2233,2344,2373,2382,2432,2500,2567 'csv':1352,2262 'current':1341,1573,1734 'custom':780,839,887,945 'data':2194,2639 'data.csv':2306 'date':417,425,455,463,490,541,588,642,773,832,880,938,1008,1016,1053,1061,1129,1180,1243,1253,1303,1308,1493,1504,1511,2347,2353,2355,2363,2365,2399,2401,2408,2418,2435,2441,2443,2451,2453,2503,2509,2511,2519,2521,2570,2576,2578,2586,2588 'date-tim':416,424,454,462,489,540,587,641,772,831,879,937,1007,1015,1052,1060,1128,1179,1242,1252,1302,1307,1492,1503,1510,2346,2354,2364,2434,2442,2452,2502,2510,2520,2569,2577,2587 'deep':1657 'default':31,781,840,888,946,1285 'delay':116 'delet':655,659,664,728,956,959,963,1067,1070,1077,1519,1539,2529,2537,2548 'descript':492,517,543,590,615,644 'detail':525,536,571,583,625,637,812,827,864,875,922,933 'dimens':2166 'disabl':1513,1526,2688 'distanc':1577,1586,1594,1633 'distil':221 'distil-whisp':220 'doc':1567,1615 'document':1328,1390,1395,1552,1568,1600,1635 'dog':2188 'domain':1661 'download':2349,2437,2505,2572 'durat':227 'e':121 'e.message':126 'e.status':125,128 'e29b':998,1043,1086,1115,1233 'e29b-41d4-a716':997,1042,1085,1114,1232 'earli':279 'either':1272 'elevenlab':2691,2709 'emb':1327,1640,1643 'embed':1293,1296,1330,1338,1380,1399,1405,1414,1436,1440,1460,1467,1501,1517,1524,1689,1702,1725,1735,1756,1768,1776,1783,1795,1800,2119,2122,2135,2178,2204,2211,2228 'enabl':282 'encod':2168,2663 'end':138,139,2352,2400,2407,2440,2508,2575 'endpoint':192,244,1162,2063,2129,2214,2612 'entir':1521 'enum':325,779,838,886,944,1134,1246,1311,1809,1863,1930,1989,2046,2170,2368,2456,2524,2591,2699,2705,2723 'env':24 'error':47,56,61,65,69,85,89,96,119,124,132,141,156,1495 'exampl':37,386,2091 'example.com':1699 'example.com/resource':1698 'expir':2372,2460,2528,2595 'exponenti':105,165 'fail':53,1139,1275,1771,1789,1867,1934,1993,2050,2371,2459,2527,2594 'failur':1315,1769,1813 'fetch':2604,2617 'field':135,158,393,400 'file':1343,1350,1366,1369,1458,1468,1774,1781,1874,1892,1906,1941,2000,2057,2243,2250 'file-level':1457 'filenam':1498,2293,2305 'filter':385,397,2394 'fine':1823,1831,1878,1884,1899,1909,1945,1950,1961,1968,2004,2009,2018,2025 'finish':1305,1420,1708,1805,1849,1916,1975,2032 'flac':2275 'float':2171 'follow':1742,2255,2265 'form':2086 'format':137,159,317,2169,2222,2257,2267,2657 'found':153 'fox':2183 'frequenc':285 'friend':351 'gem':12 'generat':2245,2602,2615,2641,2645 'get':406,469,473,477,554,558,563,756,759,762,850,853,857,978,989,1092,1103,1207,1223,1261,1290,1438,1445,1456,1465,1478,1723,1790,1838,1943,1956,2059,2100,2223,2312,2332,2461,2481,2596,2628,2771 'given':1471 'group':472,476,483,506,511,524,527,535,557,560,565,570,582,604,609,612,624,636,658,661,666,683,689,692,707,721,727,730,746 'guid':288,292,295 'handl':48,68 'header':113,2680 'hello':82,356 'help':818 'html':1347,2259 'huggingfac':2097 'hyperparamet':1853,1894,1920,1979,2036 'id':419,457,494,545,562,566,592,613,646,663,667,693,696,708,731,734,747,775,834,856,860,882,908,940,962,966,988,992,1010,1034,1055,1076,1080,1106,1131,1166,1184,1226,1319,1325,1427,1433,1715,1721,1793,1798,1817,1855,1860,1922,1927,1955,1959,1966,1981,1986,2015,2023,2038,2043,2080,2111,2235,2357,2445,2480,2483,2513,2547,2550,2580 'import':167 'includ':388,1216,1474,1650 'infer':4,8 'initi':43 'input':2126,2163,2179,2651 'insert':1151 'insight':470,475,482,496,504,510,522,533,547,555,559,568,580,594,602,607,622,634,648,656,660,680,686,695,718,724,733,757,761,777,792,797,810,825,836,851,854,859,862,873,884,899,903,907,920,931,942,957,960,965,1093,1098,1112,1123 'instal':10,13 'instruct':782,801,814,841,889,910,947 'insuffici':148 'integ':278,305,334,1394,1398,1616,1848,1851,1871,1915,1918,1938,1974,1977,1997,2031,2034,2054,2110,2167,2234 'invalid':144 'item':180 'item.id':182 'iter':176 'job':1825,1833,1841,1844,1880,1886,1901,1911,1947,1952,1954,1958,1963,1965,1970,2006,2011,2014,2020,2022,2027 'js':210,263,2147 'json':293,404,784,804,843,891,912,949,1351,2261,2664 'jump':2184 'key':23,27,146,273 'languag':241,2693 'last':421,459,1012,1057,1500 'later':2670 'lazi':2187 'least':1787 'length':298 'level':1459,1656 'limit':58,100,162 'link':1674,2350,2438,2506,2573 'list':362,366,1435,1822,1828,2066,2203,2208,2740,2745 'load':1666 'loader':1402 'logprob':301,333 'lower':1592 'm4a':1359,2280 'made':1219 'main':1670 'manual':1158 'match':1371 'max':303,1363 'may':204,257,2141 'mb':2288 'media':2266 'messag':270,346,422,460,1013,1058,1141,1145,1154,1196,1209,1211,1229,1238 'metadata':392,403,427,442,465,1018,1024,1026,1036,1063,1173,1638 'metric':1578 'min':306 'minimax':2695,2710 'mistralai/mistral-7b-instruct-v0.1':2094 'model':219,242,309,1339,1400,1857,1890,1903,1924,1983,2040,2061,2072,2079,2088,2105,2164,2189,2197,2205,2212,2220,2229 'mp3':1355,2276 'mp4':1356,2277 'mpeg':1357,2278 'mpga':1358,2279 'my-bucket':1410,1623,1694,2302 'my-resourc':529,821 'n':311 'name':429,444,467,499,515,528,550,597,617,651,787,802,820,846,894,915,952,1020,1065,1175,1322,1388,1409,1430,1481,1486,1542,1547,1610,1622,1687,1693,1718,1820,2089,2098 'network':55,88 'new':436,509,796,1144,1153,1883,2375,2384 'none':326 'normal':1536 'note':168,2078 'null':1423,1711,1852,1872,1919,1939,1978,1998,2035,2055 'num':1566,1613 'number':228,287,300,308,312,315,322,337,1634 'object':231,294,318,331,405,428,443,466,498,549,596,650,786,806,845,893,914,951,1019,1037,1064,1125,1174,1189,1192,1260,1401,1403,1639,1854,1895,1921,1980,2037,2113,2196,2199,2202,2237,2640,2685,2687,2692,2696,2714,2716,2718,2730,2782 'ogg':2281 'omit':35 'one':1739,1788,2750 'open':2068 'openai':197,209,249,262,2071,2134,2146,2219 'openai/gpt-4':2092 'openai/gpt-4o':1904 'option':271,441,516,614,803,909,1035,1170,1389,1612,1893,2165,2294,2683 'organ':1859,1926,1985,2042 'otherwis':2765 'output':2697,2701,2703 'overlap':1392 'own':2115,2239 'p':307,336 'page':172,178,480,485,765,768,1652,1675 'page.auto':177 'pagin':169 'paramet':380 'partial':1278,1316,1778,1814 'pdf':1346,2258 'penalti':286,299,314 'pend':1135,2369,2457,2525,2592 'perform':1329,1553 'period':2627 'permiss':149 'pick':1749 'platform.openai.com':201,254,2138 'platform.openai.com/docs/api-reference/audio/createtranscription)':200 'platform.openai.com/docs/api-reference/chat)':253 'platform.openai.com/docs/api-reference/embeddings)':2137 'post':214,267,439,512,690,798,1163,1384,1606,1682,1887,2012,2160,2289,2395,2681 'postgrest':377 'postgrest-styl':376 'postgrest.org':382 'postgrest.org/en/stable/api.html#horizontal-filtering-rows)':381 'presenc':313 'price':1538 'process':1274,1289,1313,1476,1663,1754,1811 'product':71 'progress':1137 'prompt':2296 'provid':2674,2704,2754,2756,2763,2770 'put':87,122,130,181,224,360,411,449,484,532,579,610,633,677,715,754,767,824,872,905,930,976,1002,1031,1047,1090,1119,1205,1237,1295,1413,1450,1487,1548,1630,1701,1799,1843,1908,1967,2024,2106,2191,2230,2307,2339,2427,2495,2562,2636,2734,2777 'python':212,265,2149 'queri':379,1283,1572,1605,1611,1626 'queu':1273,1287,1312,1743,1810,1864,1931,1990,2047 'quick':2181 'rate':57,99,161 'ratelimiterror':97 'reason':1496 'record':2359,2447,2515,2582 'ref':274 'regex':296 'remov':722 'report':2318,2326,2380,2389,2468,2477,2535,2544,2601,2609,2622 'repres':2124 'request':2319,2327,2381,2390,2469,2478,2536,2545,2656 'requir':17,134,269,328,514,800,1168,1386,1608,1684,1889,2162,2291,2397 'rescu':83,94,117 'resembl':2712,2713 'resourc':151,531,823 'respons':217,225,316,343,361,1109,1120,1406,1415,1618,1631,1690,1703,2103,2107,2176,2192,2226,2231,2299,2308,2631,2637,2732,2735,2774,2778 'result':75,669,678,699,716,737,755,968,977,1082,1091,1194,1206,1544,1549 'retri':93,103,111,163 'retriev':364,981,1097,1210,1265,1826,1948,2320,2470,2671,2743 'retry-aft':110 'return':226,413,451,486,537,584,638,769,828,876,934,1004,1049,1121,1239,1297,1416,1452,1489,1533,1562,1584,1599,1632,1704,1801,1845,1912,1971,2028,2064,2108,2193,2206,2232,2309,2343,2431,2499,2566,2638,2652,2736,2759,2766,2779 'rime':2711,2715 'role':353,358,1169,1203,1245 'rubi':5,9,16,73,216,342,408,446,479,521,567,621,668,698,736,764,809,861,919,967,993,1038,1081,1108,1193,1228,1292,1404,1447,1482,1543,1617,1688,1794,1840,1898,1960,2017,2102,2175,2225,2298,2334,2402,2484,2551,2630,2731,2773 'run':1759,1865,1932,1991,2048 'schema':785,805,844,892,913,950 'sdk':213,266,2150 'search':340,1550,1556,1620 'segment':229 'sent':1177,1250 'set':2152,2729 'setup':15 'shown':45 'similar':1555,1565,1581,1597 'size':1367,1393,1397 'skill' 'skill-telnyx-ai-inference-ruby' 'sleep':107 'sourc':2069,2087 'source-team-telnyx' 'specif':983,1029,1072,1101,1214,2463,2472,2539 'specifi':1648,2393,2625,2758 'speech':184,188,2314,2322,2335,2340,2376,2385,2403,2428,2464,2473,2485,2496,2531,2540,2552,2563,2597,2605,2619,2633,2642,2647 'ssml':2725 'standard':391,2677 'start':2362,2398,2417,2450,2518,2585 'status':1133,1264,1310,1424,1461,1477,1506,1712,1728,1731,1808,1862,1929,1988,2045,2367,2455,2523,2590 'stop':280 'storag':1334,1537,1560,1680 'stream':319,2660 'string':233,275,291,297,310,430,445,468,493,500,502,518,520,544,551,553,591,598,600,616,618,620,645,652,654,783,788,790,808,842,847,849,890,895,897,911,916,918,948,953,955,1021,1066,1132,1172,1176,1185,1256,1284,1299,1320,1323,1326,1419,1422,1425,1431,1455,1497,1499,1507,1637,1707,1710,1713,1719,1804,1807,1821,1856,1858,1861,1875,1897,1923,1925,1928,1942,1982,1984,1987,2001,2039,2041,2044,2058,2112,2114,2117,2174,2198,2200,2236,2238,2241,2297,2311,2351,2358,2361,2439,2446,2449,2507,2514,2517,2574,2581,2584,2694,2720,2727,2739 'style':378 'succeed':1866,1933,1992,2049 'success':1276,1279,1314,1317,1760,1763,1777,1779,1784,1812,1815 'suffix':1896 'summar':2242 'summari':2247,2274,2310 'support':375,1342,2253,2263 'synchron':2610 'synthes':2646 'system':354,2295 't00':2412,2422 'task':1262,1266,1318,1321,1426,1429,1714,1717,1726,1736,1744,1757,1761,1770,1792,1797,1816,1819 'telnyx':2,6,14,18,20,25,84,95,118,1333,1559,1629,1678,2707,2717 'telnyx-ai-inference-rubi':1 'temperatur':321 'templat':471,505,523,534,556,569,581,603,608,623,635,657,681,719,758,793,811,826,852,863,874,900,904,921,932,958 'text':81,186,190,232,1255,1349,1383,2127,2256,2316,2324,2337,2342,2378,2387,2405,2430,2466,2475,2487,2498,2533,2542,2554,2565,2599,2607,2621,2635,2644,2650,2719,2721,2724 'thenlper/gte-large':2190 'think':283 'time':418,426,456,464,491,542,589,643,774,833,881,939,1009,1017,1054,1062,1130,1181,1244,1254,1304,1309,1494,1505,1512,2348,2356,2366,2436,2444,2454,2504,2512,2522,2571,2579,2589,2626 'token':304,1870,1937,1996,2053 'tool':323,329,1182,1186,1190,1217,1249,1257 'top':332,335 'topic-agent-skills' 'topic-ai-coding-agent' 'topic-claude-code' 'topic-cpaas' 'topic-cursor' 'topic-iot' 'topic-llm' 'topic-sdk' 'topic-sip' 'topic-sms' 'topic-speech-to-text' 'topic-telephony' 'train':1869,1873,1891,1905,1936,1940,1995,1999,2052,2056 'training-data.jsonl':1907 'transcrib':183,187 'transcript':198,2272 'tts':2753 'tune':1824,1832,1879,1885,1900,1910,1946,1951,1962,1969,2005,2010,2019,2026 'txt':2260 'txt/unstructured':1348 'type':778,837,885,943,1344,1374,2360,2448,2516,2583,2698,2722 'unassign':717,739 'unstructur':1382 'updat':601,605,898,901,1022,1025,1508 'url':1641,1649,1671,1685,1697,2155,2668 'usag':2201,2600,2608 'use':170,206,259,338,1149,1160,1336,1532,2077,2143 'user':359,374,1204,1247,1269,1324,1432,1444,1472,1720,1837,2173,2331 'uuid':420,458,495,546,593,647,776,835,883,941,1011,1056,1428,1434,1716,1722,1818 'valid':60,131,155 'vector':2123 'via':2675 'video':1354 'voic':2726,2728,2742,2748,2760,2767,2776,2780 'wait':101,1746 'wav':1360,2282 'webhook':501,519,552,599,619,653,789,807,848,896,917,954 'webm':1362,2284 'websit':1644 'whisper':222 'within':1658 'without':1159 'worker':1753 'world':357","prices":[{"id":"bf752ea3-b6f0-495c-9966-930f1fdbf92b","listingId":"44bf0d3e-358a-42d3-a47a-c95ca8b1fd5d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"team-telnyx","category":"ai","install_from":"skills.sh"},"createdAt":"2026-04-18T22:06:21.671Z"}],"sources":[{"listingId":"44bf0d3e-358a-42d3-a47a-c95ca8b1fd5d","source":"github","sourceId":"team-telnyx/ai/telnyx-ai-inference-ruby","sourceUrl":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-ai-inference-ruby","isPrimary":false,"firstSeenAt":"2026-04-18T22:06:21.671Z","lastSeenAt":"2026-04-22T12:54:44.488Z"}],"details":{"listingId":"44bf0d3e-358a-42d3-a47a-c95ca8b1fd5d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"team-telnyx","slug":"telnyx-ai-inference-ruby","github":{"repo":"team-telnyx/ai","stars":167,"topics":["agent-skills","ai","ai-coding-agent","claude-code","cpaas","cursor","iot","llm","sdk","sip","sms","speech-to-text","telephony","telnyx","tts","twilio-migration","voice-agents","voice-ai","webrtc","windsurf"],"license":"mit","html_url":"https://github.com/team-telnyx/ai","pushed_at":"2026-04-21T22:09:49Z","description":"Official one-stop shop for AI Agents and developers building with Telnyx.","skill_md_sha":"7ad5492e3c45cfd5b76bb9135c2b1cb8c2cffbd9","skill_md_path":"skills/telnyx-ai-inference-ruby/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/team-telnyx/ai/tree/main/skills/telnyx-ai-inference-ruby"},"layout":"multi","source":"github","category":"ai","frontmatter":{"name":"telnyx-ai-inference-ruby","description":">-"},"skills_sh_url":"https://skills.sh/team-telnyx/ai/telnyx-ai-inference-ruby"},"updatedAt":"2026-04-22T12:54:44.488Z"}}