> ## Documentation Index
> Fetch the complete documentation index at: https://phaseo.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Phaseo Gateway base URL: https://api.phaseo.app/v1. Send `Authorization: Bearer $PHASEO_API_KEY` with every request.
> Model IDs look like `provider/model`, for example `openai/gpt-6-astra`. Do not guess IDs: list them with `GET /v1/models` or check https://phaseo.app/models. `phaseo/free` routes to an available free model and needs no wallet balance.
> For new text integrations prefer `POST /v1/responses`. `POST /v1/chat/completions` (OpenAI format) and `POST /v1/messages` (Anthropic format) suit existing code.
> The full API contract is https://phaseo.app/docs/openapi/v1/openapi.yaml. Official SDKs: `@phaseo/sdk` (TypeScript) and `phaseo` (Python), plus Go, C#, PHP, Ruby and Rust.
> Search these docs over MCP at https://phaseo.app/docs/mcp, and install Phaseo skills with `npx skills add https://phaseo.app/docs`. If a page is wrong or out of date, report it with the MCP `submit_feedback` tool.
> Manage Phaseo accounts with the `phaseo` CLI (`npm install -g @phaseo/cli`, then `phaseo login` or `phaseo login --device-code`), the `/v1` Management API or the MCP server at `https://mcp.phaseo.app/mcp?access=manage`. Do not send users to the dashboard for account tasks. A person is still needed for sign-up, approving a sign-in, paying the first top-up on the checkout link that `phaseo credits add` returns when no card is saved, confirming each saved-card top-up from the emailed link, and account security (password, MFA, passkeys). Create API keys with `phaseo keys create --name <name> --json`; never guess one. Credit top-ups need `phaseo login --scopes billing:write` first. Task map: https://phaseo.app/docs/v1/developers/manage-from-an-agent.md.

# STT (تحويل الكلام إلى نص)

> حوّل الصوت إلى نص باستخدام POST /v1/audio/transcriptions من أي حزمة Phaseo SDK.

ارفع الصوت إلى `POST /v1/audio/transcriptions` بوصفه نموذجًا متعدد الأجزاء يحتوي على حقل `file`. يفشل التحقق من جسم JSON يحتوي على سلسلة base64. لا يمكن إرسال هذا النموذج إلا من حزمة TypeScript SDK؛ أما في كل لغة أخرى، فأرسله باستخدام عميل HTTP القياسي، كما في الأمثلة أدناه، أو أرسل عنوان URL بدلًا من ذلك (انظر [تحويل الصوت إلى نص من عنوان URL](#transcribe-audio-from-a-url)).

## رفع ملف صوتي

```typescript TypeScript theme={null}
import { readFile } from "node:fs/promises";

const form = new FormData();
form.append("model", "openai/gpt-4o-transcribe");
form.append("language", "en");
form.append("file", new Blob([await readFile("call.mp3")], { type: "audio/mpeg" }), "call.mp3");

const transcript = await client.generateTranscription(form as unknown as Record<string, unknown>);
console.log(transcript.text);
```

```python Python theme={null}
# لا تستطيع generate_transcription() إرسال بيانات متعددة الأجزاء بعد، لذا أرسل النموذج باستخدام HTTPX.
import os
import httpx

with open("call.mp3", "rb") as audio:
    response = httpx.post(
        "https://api.phaseo.app/v1/audio/transcriptions",
        headers={"Authorization": f"Bearer {os.environ['PHASEO_API_KEY']}"},
        data={"model": "openai/gpt-4o-transcribe", "language": "en"},
        files={"file": ("call.mp3", audio, "audio/mpeg")},
        timeout=120,
    )
response.raise_for_status()
print(response.json()["text"])
```

```go Go theme={null}
// ترسل CreateTranscription() بيانات JSON، لذا أرسل النموذج باستخدام net/http وmime/multipart.
var body bytes.Buffer
form := multipart.NewWriter(&body)
_ = form.WriteField("model", "openai/gpt-4o-transcribe")
_ = form.WriteField("language", "en")
part, _ := form.CreateFormFile("file", "call.mp3")
audio, _ := os.ReadFile("call.mp3")
_, _ = part.Write(audio)
_ = form.Close()

req, _ := http.NewRequest("POST", "https://api.phaseo.app/v1/audio/transcriptions", &body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PHASEO_API_KEY"))
req.Header.Set("Content-Type", form.FormDataContentType())

resp, err := http.DefaultClient.Do(req)
```

```csharp C# theme={null}
// ترسل CreateTranscription() بيانات JSON، لذا أرسل النموذج باستخدام HttpClient.
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new("Bearer", Environment.GetEnvironmentVariable("PHASEO_API_KEY"));

using var form = new MultipartFormDataContent
{
    { new StringContent("openai/gpt-4o-transcribe"), "model" },
    { new StringContent("en"), "language" },
    { new ByteArrayContent(await File.ReadAllBytesAsync("call.mp3")), "file", "call.mp3" },
};

var response = await http.PostAsync("https://api.phaseo.app/v1/audio/transcriptions", form);
Console.WriteLine(await response.Content.ReadAsStringAsync());
```

```php PHP theme={null}
<?php
// ترسل generateTranscription() بيانات JSON، لذا أرسل النموذج باستخدام Guzzle، الذي ثبّته Composer مع حزمة SDK.
require 'vendor/autoload.php';

$http = new GuzzleHttp\Client();

$response = $http->post('https://api.phaseo.app/v1/audio/transcriptions', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('PHASEO_API_KEY')],
    'multipart' => [
        ['name' => 'model', 'contents' => 'openai/gpt-4o-transcribe'],
        ['name' => 'language', 'contents' => 'en'],
        ['name' => 'file', 'contents' => fopen('call.mp3', 'r'), 'filename' => 'call.mp3'],
    ],
]);

echo $response->getBody();
```

```ruby Ruby theme={null}
# ترسل generate_transcription بيانات JSON، لذا أرسل النموذج باستخدام Net::HTTP.
require 'net/http'

uri = URI('https://api.phaseo.app/v1/audio/transcriptions')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{ENV.fetch('PHASEO_API_KEY')}"
request.set_form(
  [['model', 'openai/gpt-4o-transcribe'], ['language', 'en'], ['file', File.open('call.mp3')]],
  'multipart/form-data'
)

response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
puts response.body
```

```java Java theme={null}
// لا ترمّز دوال JSON المساعدة في حزمة SDK البيانات متعددة الأجزاء، لذا أرسل النموذج باستخدام java.net.http.
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.file.Path;
import java.time.Duration;
import java.util.UUID;

String baseUrl = System.getenv().getOrDefault("PHASEO_BASE_URL", "https://api.phaseo.app/v1")
    .replaceAll("/+$", "");
String apiKey = System.getenv("PHASEO_API_KEY");
String boundary = "phaseo-" + UUID.randomUUID();
var body = BodyPublishers.concat(
    BodyPublishers.ofString("--" + boundary + "\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nopenai/gpt-4o-transcribe\r\n"),
    BodyPublishers.ofString("--" + boundary + "\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nen\r\n"),
    BodyPublishers.ofString("--" + boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"call.mp3\"\r\nContent-Type: audio/mpeg\r\n\r\n"),
    BodyPublishers.ofFile(Path.of("call.mp3")),
    BodyPublishers.ofString("\r\n--" + boundary + "--\r\n")
);
var request = HttpRequest.newBuilder(URI.create(baseUrl + "/audio/transcriptions"))
    .header("Authorization", "Bearer " + apiKey)
    .header("Content-Type", "multipart/form-data; boundary=" + boundary)
    .timeout(Duration.ofSeconds(60))
    .POST(body)
    .build();
var response = HttpClient.newHttpClient().send(request, BodyHandlers.ofString());
if (response.statusCode() < 200 || response.statusCode() >= 300) {
    throw new IOException("HTTP " + response.statusCode() + ": " + response.body());
}
System.out.println(response.body());
```

| اللغة | دالة حزمة SDK | هل يمكنها رفع ملف؟ |
| - | - | - |
| TypeScript | `client.generateTranscription(form)` | نعم. مرّر جسم `FormData` وسترسله حزمة SDK بوصفه بيانات متعددة الأجزاء دون تغيير. التحويل (cast) ضروري لأن نوع الدالة يصف جسم JSON. |
| Python | `client.generate_transcription(request)` | لا. ترسل دائمًا بيانات JSON، لذا أرسل النموذج باستخدام HTTPX، كما في المثال أعلاه. |
| Go | `client.CreateTranscription(ctx, req)` | لا. ترسل بيانات JSON؛ استخدم `net/http` و`mime/multipart`. |
| C# | `client.CreateTranscription(request)` | لا. ترسل بيانات JSON؛ استخدم `HttpClient` و`MultipartFormDataContent`. |
| PHP | `$client->generateTranscription($request)`، والاسم البديل `createTranscription()` | لا. ترسل بيانات JSON؛ استخدم خيار `multipart` في Guzzle. |
| Ruby | `client.generate_transcription(...)`، والاسم البديل `create_transcription` | لا. ترسل بيانات JSON؛ استخدم `Net::HTTP` و`set_form`. |
| Java | لا توجد | لا. استخدم `java.net.http.HttpClient` مع جسم متعدد الأجزاء. |
| Rust | لا توجد | لا. ترسل `client.post()` بيانات JSON فقط، لذا لا تعمل إلا مع [مصادر URL](#transcribe-audio-from-a-url). |

## تحويل الصوت إلى نص من عنوان URL

يمكن لنماذج Mistral وElevenLabs وMorpheus قراءة الصوت من عنوان URL بدلًا من رفعه. ولأن هذا الطلب بتنسيق JSON، فإن دوال حزم SDK التي لا تستطيع رفع ملف تتعامل معه:

```python Python theme={null}
result = client.generate_transcription({
    "model": "mistral/voxtral-mini-transcribe-2",
    "file_url": "https://example.com/call.mp3",
    "language": "en",
})

print(result["text"])
```

```go Go theme={null}
resp, err := client.CreateTranscription(context.Background(), map[string]interface{}{
  "model":    "mistral/voxtral-mini-transcribe-2",
  "file_url": "https://example.com/call.mp3",
  "language": "en",
})
if err != nil {
  panic(err)
}
fmt.Println(resp["text"])
```

```csharp C# theme={null}
var response = await client.CreateTranscription(new Dictionary<string, object>
{
    ["model"] = "mistral/voxtral-mini-transcribe-2",
    ["file_url"] = "https://example.com/call.mp3",
    ["language"] = "en",
});
```

```php PHP theme={null}
$response = $client->generateTranscription([
    'model' => 'mistral/voxtral-mini-transcribe-2',
    'file_url' => 'https://example.com/call.mp3',
    'language' => 'en',
]);

echo $response['text'];
```

```ruby Ruby theme={null}
response = client.generate_transcription(
  model: 'mistral/voxtral-mini-transcribe-2',
  file_url: 'https://example.com/call.mp3',
  language: 'en'
)
```

```rust Rust theme={null}
let response = client.post("/audio/transcriptions", &json!({
    "model": "mistral/voxtral-mini-transcribe-2",
    "file_url": "https://example.com/call.mp3",
    "language": "en"
}))?;

println!("{}", response.body["text"]);
```

## المعاملات

أسماء الحقول في كل لغة هي حقول النموذج (أو حقول JSON لمصدر URL).

| الحقل | ملاحظات |
| - | - |
| `model` | مطلوب. معرّف نموذج تحويل الكلام إلى نص. |
| `file` | الملف الصوتي المرفوع: `aac` أو `flac` أو `mp3` أو `mp4` أو `mpeg` أو `mpga` أو `m4a` أو `ogg` أو `opus` أو `wav` أو `webm`. مطلوب إلا عند استخدام خيارات URL أدناه. ما يصل إلى 25 MB لمعظم النماذج. |
| `file_url`، `file_id`، `s3_presigned_url` | تقبل نماذج Mistral وElevenLabs وMorpheus مصدرًا صوتيًا واحدًا بالضبط، لذا يمكنها استخدام عنوان URL بدلًا من `file`. |
| `language` | تلميح اللغة، مثل `en`. |
| `prompt` | سياق لتحسين الدقة. |
| `temperature` | من `0` إلى `1` (من `0` إلى `2` لدى ElevenLabs). |
| `response_format` | `json` أو `text` أو `srt` أو `verbose_json` أو `vtt` أو `diarized_json`. |
| `timestamp_granularities` | `word` و/أو `segment`. |
| `stream` | بثّ النص أثناء إنتاجه، حيث يدعم النموذج ذلك. |

المخطط الكامل موجود في [مرجع Transcriptions API](https://phaseo.app/docs/ar/v1/api-reference/endpoint/audio-transcriptions.md).

## الاستجابة

`AudioTranscriptionResponse`، وتُعاد بنوع الخريطة الخاص بكل حزمة SDK (`map[string]interface{}` في Go، و`Dictionary<string, object>?` في C#، ومصفوفة في PHP، وHash في Ruby):

```json theme={null}
{
  "text": "Hello world"
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.