@@ -82,7 +82,6 @@ import json url = "${url}" api_key = "" -idempotency_key = "stream-example-1" # уникальный ID запроса; необходим для переподключения к стриму form_data = { "content": "Привет! Как дела?", @@ -92,7 +91,6 @@ form_data = { } headers = { "Authorization": api_key, - "Idempotency-Key": idempotency_key, } with httpx.stream("POST", url, json=form_data, headers=headers, timeout=120) as response: @@ -103,7 +101,6 @@ import json url = "${url}" api_key = "" -idempotency_key = "stream-example-1" # уникальный ID запроса; необходим для переподключения к стриму filename = "example.png" form_data = { @@ -114,7 +111,6 @@ form_data = { } headers = { "Authorization": api_key, - "Idempotency-Key": idempotency_key, } with open(filename, "rb") as f: @@ -125,14 +121,13 @@ ${indentCode(SSE_LOOP_HTTPX, 4)}` const reconnectCode = `import httpx import json -url = "${url}" api_key = "" -idempotency_key = "stream-example-1" # тот же ключ, что при POST; необходим для переподключения +message_uuid = "" # уникальный ID стрима: data.message_uuid в событии start offset = 10 # номер последнего полученного event; стрим продолжится с этого места +url = f"https://api.air.fail/public/${modelsType}/{message_uuid}/stream/reconnect" headers = { "Authorization": api_key, - "Idempotency-Key": idempotency_key, } with httpx.stream("GET", url, params={"offset": offset}, headers=headers, timeout=120) as response: @@ -175,7 +170,6 @@ import json url = "${url}" api_key = "" -idempotency_key = "stream-example-1" # уникальный ID запроса; необходим для переподключения к стриму form_data = { "content": "Привет! Как дела?", @@ -185,7 +179,6 @@ form_data = { } headers = { "Authorization": api_key, - "Idempotency-Key": idempotency_key, } with requests.post(url, json=form_data, headers=headers, stream=True, timeout=120) as response: @@ -196,7 +189,6 @@ import json url = "${url}" api_key = "" -idempotency_key = "stream-example-1" # уникальный ID запроса; необходим для переподключения к стриму filename = "example.png" form_data = { @@ -207,7 +199,6 @@ form_data = { } headers = { "Authorization": api_key, - "Idempotency-Key": idempotency_key, } with open(filename, "rb") as f: @@ -218,14 +209,13 @@ ${indentCode(SSE_LOOP_REQUESTS, 4)}` const reconnectCode = `import requests import json -url = "${url}" api_key = "" -idempotency_key = "stream-example-1" # тот же ключ, что при POST; необходим для переподключения +message_uuid = "" # уникальный ID стрима: data.message_uuid в событии start offset = 10 # номер последнего полученного event; стрим продолжится с этого места +url = f"https://api.air.fail/public/${modelsType}/{message_uuid}/stream/reconnect" headers = { "Authorization": api_key, - "Idempotency-Key": idempotency_key, } with requests.get(url, params={"offset": offset}, headers=headers, stream=True, timeout=120) as response: @@ -265,9 +255,6 @@ export function getOpenAiStreamingBlocks({ client = OpenAI( base_url="https://api.air.fail/public/openai", api_key="", - default_headers={ - "Idempotency-Key": "stream-example-1", # уникальный ID запроса; необходим для переподключения к стриму - }, ) for event in client.responses.create( @@ -288,9 +275,6 @@ from openai import OpenAI client = OpenAI( base_url="https://api.air.fail/public/openai", api_key="", - default_headers={ - "Idempotency-Key": "stream-example-1", # уникальный ID запроса; необходим для переподключения к стриму - }, ) filename = "example.png" @@ -323,13 +307,12 @@ for event in client.responses.create( client = OpenAI( base_url="https://api.air.fail/public/openai", api_key="", - default_headers={ - "Idempotency-Key": "stream-example-1", # тот же ключ, что при POST; необходим для переподключения - }, ) +response_id = "" # уникальный ID стрима: response.id в событии response.created + with client.responses.stream( - response_id="stream-example-1", + response_id=response_id, starting_after=0, # номер последнего полученного event; стрим продолжится с этого места ) as stream: for event in stream: @@ -368,26 +351,21 @@ export function getCurlStreamingBlocks({ const url = `https://api.air.fail/public/${modelsType}/${modelSlug}/stream` const infoJson = toCompactInfoJson(formattedModelParams) - const streamCode = `# Idempotency-Key — уникальный ID запроса; необходим для переподключения -curl -N -X POST "${url}" \\ + const streamCode = `curl -N -X POST "${url}" \\ -H "Authorization: " \\ - -H "Idempotency-Key: stream-example-1" \\ -F "content=Привет! Как дела?" \\ -F 'info=${infoJson}'` - const streamFileCode = `# Idempotency-Key — уникальный ID запроса; необходим для переподключения -curl -N -X POST "${url}" \\ + const streamFileCode = `curl -N -X POST "${url}" \\ -H "Authorization: " \\ - -H "Idempotency-Key: stream-example-1" \\ -F "content=Привет, что на картинке?" \\ -F 'info=${infoJson}' \\ -F "file=@example.png"` - const reconnectCode = `# Idempotency-Key — тот же ключ, что при POST; необходим для переподключения + const reconnectCode = `# уникальный ID стрима: data.message_uuid в событии start # offset — номер последнего полученного event; стрим продолжится с этого места -curl -N -X GET "${url}?offset=10" \\ - -H "Authorization: " \\ - -H "Idempotency-Key: stream-example-1"` +curl -N -X GET "https://api.air.fail/public/${modelsType}//stream/reconnect?offset=10" \\ + -H "Authorization: "` const blocks: StreamingCodeBlock[] = [ { id: `${prefix}-stream-1`, title: '1. Обычный стриминг', code: streamCode, language: 'bash' }, @@ -259,7 +259,7 @@ export const PythonOpenAISDK = ({ currentVersion, modelSlug, modelsType, showFil const code1 = `from openai import OpenAI client = OpenAI( - base_url="https://api.air.fail/public/openai/", + base_url="https://api.air.fail/public/openai", api_key='' ) @@ -277,7 +277,7 @@ print(response)` from openai import OpenAI client = OpenAI( - base_url="https://api.air.fail/public/openai/", + base_url="https://api.air.fail/public/openai", api_key='' ) filename = "example.png" @@ -327,19 +327,21 @@ print(response)` export const cURL = ({ currentVersion, modelSlug, modelsType, showFileExample, modelParams }: IComponentProps) => { const formattedModelParams = formatModelParams(currentVersion, modelParams) - const code1 = `curl -X POST "https://api.air.fail/public/${modelsType}/${modelSlug}" --H "Authorization: " --F "content=Привет! Как дела?" --F "info": { - ${formattedModelParams} - }` - - const code2 = `curl -X POST "https://api.air.fail/public/${modelsType}/${modelSlug}" - -H "Authorization: " - -F "content=Привет! Как дела?" - -F "info": { - ${formattedModelParams} - } + const infoJson = `{${formattedModelParams + .split('\n') + .map((line) => line.trim()) + .filter(Boolean) + .join('')}}` + + const code1 = `curl -X POST "https://api.air.fail/public/${modelsType}/${modelSlug}" \\ + -H "Authorization: " \\ + -F "content=Привет! Как дела?" \\ + -F 'info=${infoJson}'` + + const code2 = `curl -X POST "https://api.air.fail/public/${modelsType}/${modelSlug}" \\ + -H "Authorization: " \\ + -F "content=Привет! Как дела?" \\ + -F 'info=${infoJson}' \\ -F "file=@example.png"` return (