Solved No transcriptions - Version 20.0 Update 10 (Build 1621 Alpha - AI 1.6.57)

Alphabetic

3CX MVP
Silver Partner
Advanced Certified
Joined
Jul 1, 2016
Messages
6,600
Reaction score
2,608
Hello!

I've had no transcriptions since 11:30 today.

Using OpenAI.

I have checked in OpenAI and we have not hit limits.

I've tried recreating API key and restarting the 3CX AI service.

Any help appreciated?

This is all i have in 3CXAI.log - verbose is logging level.

Code:
2026-09-10 16:38:47.337| Info|{} 3CX AI started v.1.6.57
2026-09-10 16:38:47.338| Info|{} Configuration loaded successfully, logging to /var/lib/3cxpbx/Data/Logs/3CXAI.log
2026-09-10 16:38:47.928| Info|{} prewarm openai properties: total_s=0.570183
2026-09-10 16:38:47.928|Debug|{} About to initialize pbx
2026-09-10 16:38:47.930| Info|{} LiveConfig: initial configuration loaded

1789055022847.png
1789055038025.png
 
Solution
Hi all.

I managed to figure this out with the help of OpenAI (Though probably should have seen this sooner).

We ran out of API Credits at the Organisation level - I would have known this if I had access to the email the account was set up under (or checked billing but shh its a good troubleshooting exercise)

I worked this out when I tried to upload a wav to openai in Python (help of AI cos im not that clever) and it returned:

1789124441346.png

Since put additional email addresses in place for notifications :D

Thanks for your help everyone @IliasL_3CX
Hello @Alphabetic
If the PBX is in verbose logging mode, the transcription logs will be stored in Logs/3cxSystemService.log
 
Hi,

Do check the logs, but also advise, this started before or after you updated to alpha2?
 
Hi,

Do check the logs, but also advise, this started before or after you updated to alpha2?
Hi Kryiacos,

it started after Alpha 2 but this was installed about 08:30 and I had transcriptions after this.
 
  • Like
Reactions: NikosT_3CX
Hi all.

I managed to figure this out with the help of OpenAI (Though probably should have seen this sooner).

We ran out of API Credits at the Organisation level - I would have known this if I had access to the email the account was set up under (or checked billing but shh its a good troubleshooting exercise)

I worked this out when I tried to upload a wav to openai in Python (help of AI cos im not that clever) and it returned:

1789124441346.png

Since put additional email addresses in place for notifications :D

Thanks for your help everyone @IliasL_3CX
 
Solution
Happy we could help !
 
If anyone is interested..

Grab one of the latest wav files (copy path of one)
Code:
find /var/lib/3cxpbx/Instance1/Data/Recordings -type f -name "*.wav" -printf '%T@ %p\n' 2>/dev/null | sort -nr | head -5

Input your APIKey
Code:
read -s -p "OpenAI API Key: " OPENAI_API_KEY
echo
export OPENAI_API_KEY

Test the upload - be sure to change file path name of wav
Code:
python3 - <<'PY'
import http.client
import ssl
import uuid
import os

wav = r"/var/lib/3cxpbx/Instance1/Data/Recordings/110/<YOUR_FILE_NAME.wav"

api_key = os.environ["OPENAI_API_KEY"]

boundary = "----3CXTest" + uuid.uuid4().hex

with open(wav, "rb") as f:
    audio = f.read()

body = (
    f"--{boundary}\r\n"
    'Content-Disposition: form-data; name="model"\r\n\r\n'
    "whisper-1\r\n"
    f"--{boundary}\r\n"
    'Content-Disposition: form-data; name="file"; filename="test.wav"\r\n'
    "Content-Type: audio/wav\r\n\r\n"
).encode()

body += audio
body += f"\r\n--{boundary}--\r\n".encode()

print("WAV size:", os.path.getsize(wav), "bytes")
print("Request size:", len(body), "bytes")

ctx = ssl.create_default_context()

conn = http.client.HTTPSConnection(
    "api.openai.com",
    443,
    context=ctx,
    timeout=120
)

conn.request(
    "POST",
    "/v1/audio/transcriptions",
    body=body,
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": f"multipart/form-data; boundary={boundary}",
        "Content-Length": str(len(body))
    }
)

response = conn.getresponse()

print("HTTP status:", response.status, response.reason)
print("Response:")
print(response.read().decode("utf-8", errors="replace"))

conn.close()
PY