Cloudflare Workers AI Free Model Edible Guide

Tutoriels pratiques sur l'IAMise à jour il y a 10 mois Sharenet.ai
1.8K 0
吐司AI

bref

Cloudflare Workers AI vous permet d'exécuter des modèles d'apprentissage automatique sur le réseau mondial de Cloudflare à l'aide de GPU sans serveur. Vous pouvez intégrer ces modèles dans votre propre code via Workers, Pages ou l'API Cloudflare. La plateforme prend en charge une variété de tâches d'IA, notamment la classification d'images, la génération de texte et la détection d'objets.

 

Caractéristiques principales.

Modèles. Une large sélection de modèles open source pour différentes tâches d'IA.
Facturation. À partir du 1er avril 2024, l'utilisation de modèles non testés sera facturée.
Ressources. Accès à des produits connexes tels que Vectorize, R2, D1 et autres.
frappe (sur le clavier) Visitez la place officielle du grand modèle

 

facturation

Plan gratuit 10 000 vaches par jour (les vaches sont l'unité monétaire de l'IA du CF et peuvent être utilisées) Calculateur officiel Calculé), 10 000 vaches disponibles :

  • 100-200 dialogues
  • 500 traductions
  • 500 secondes de discours en texte
  • 10 000 classifications de textes
  • 1 500 à 15 000 liens

 

À partir du 1er avril 2024, les modèles suivants seront facturés à 0,011 $/kcw par jour au-delà de 10 000 vaches par jour

  • bge-small-fr-v1.5
  • bge-base-fr-v1.5
  • bge-large-fr-v1.5
  • distilbert-sst-2-int8
  • llama-2-7b-chat-int8
  • llama-2-7b-chat-fp16
  • mistral-7b-instruct-v0.1
  • m2m100-1.2b
  • resnet-50
  • chuchoter

L'utilisation du crédit peut être consultée dans l'onglet AI du panneau CF, veuillez vous référer aux taux de facturation spécifiques :Tarification | Cloudflare Workers AI docs

 

Derniers travailleurs Limites du plan AI Free(Nous commencerons à facturer tous les modèles selon la nouvelle structure tarifaire à partir du 1er novembre 2024).

ModèleTaille du calque libre
Génération de textes - LLM每天 10,000 个 token,适用于任何模型大小
intégration每天 10,000 个 token,适用于任何模型大小
photographie250 步之和,最高 1024x1024 分辨率
de la parole au texte每天 10 分钟音频

 

Démarrage facile

Avant de commencer, vous devez enregistrer votre propre compte et vous connecter.

 

Obtenir l'identifiant du compte

spectacle (un billet) page du panneauLa chaîne qui suit le dernier / dans la barre d'adresse est votre AccountID.

 

Obtenir un jeton

spectacle (un billet) page des jetons Créer le jeton, noter la sélection des travailleurs AI

 

Paramètres OneAPI

modèle de dialogue

Cloudflare Workers AI 免费模型食用指南

 

key : le jeton à obtenir
base_url : https://api.cloudflare.com/client/v4/accounts/AccountID/ai, remplaçant AccountID
modèle: :

  • @cf/deepseek-ai/deepseek-math-7b-instruct
  • @cf/defog/sqlcoder-7b-2
  • @cf/fblgit/una-cybertron-7b-v2-awq
  • @cf/fblgit/una-cybertron-7b-v2-bf16
  • @cf/google/gemma-2b-it-lora
  • @cf/google/gemma-7b-it-lora
  • @cf/meta-llama/llama-2-7b-chat-hf-lora
  • @cf/meta/llama-2-7b-chat-fp16
  • @cf/meta/llama-2-7b-chat-int8
  • @cf/meta/llama-3-8b-instruct
  • @cf/meta/llama-3-8b-instruct-awq
  • @cf/microsoft/phi-2
  • @cf/mistral/mistral-7b-instruct-v0.1
  • @cf/mistral/mistral-7b-instruct-v0.1-vllm
  • @cf/mistral/mistral-7b-instruct-v0.2-lora
  • @cf/openchat/openchat-3.5-0106
  • @cf/qwen/qwen1.5-0.5b-chat
  • @cf/qwen/qwen1.5-1.8b-chat
  • @cf/qwen/qwen1.5-14b-chat-awq
  • @cf/qwen/qwen1.5-7b-chat-awq
  • @cf/thebloke/discolm-allemand-7b-v1-awq
  • @cf/tiiuae/falcon-7b-instruct
  • @cf/tinyllama/tinyllama-1.1b-chat-v1.0
  • @hf/google/gemma-7b-it
  • @hf/mistral/mistral-7b-instruct-v0.2
  • @hf/nexusflow/starling-lm-7b-beta
  • @hf/nousresearch/hermes-2-pro-mistral-7b
  • @hf/thebloke/codellama-7b-instruct-awq
  • @hf/thebloke/deepseek-coder-6.7b-base-awq
  • @hf/thebloke/deepseek-coder-6.7b-instruct-awq
  • @hf/thebloke/llama-2-13b-chat-awq
  • @hf/thebloke/llamaguard-7b-awq
  • @hf/thebloke/mistral-7b-instruct-v0.1-awq
  • @hf/thebloke/neural-chat-7b-v3-1-awq
  • @hf/thebloke/openhermes-2.5-mistral-7b-awq
  • @hf/thebloke/zephyr-7b-beta-awq

 

Exemple POST :

curl --request POST \
--url https://api.cloudflare.com/client/v4/accounts/${AccountID}//ai/v1/chat/completions \
--header 'Authorization: Bearer 令牌' \
--header 'Content-Type: application/json' \
--data '
{
"model": "@cf/meta/llama-3-8b-instruct",
"messages": [
{
"role": "user",
"content": "how to build a wooden spoon in 3 short steps? give as short as answer as possible"
}
]
}
'

 

Intégration de modèles

Exactement la même chose que le dialogue, sauf que le modèle est différent et peut être placé dans le même canal que le dialogue.

clé: jeton obtenu
base_url: :https://api.cloudflare.com/client/v4/accounts/AccountID/aiRemplacement de l'AccountID
modèle: :

  • @cf/baai/bge-base-fr-v1.5
  • @cf/baai/bge-large-fr-v1.5
  • @cf/baai/bge-small-fr-v1.5

 

Modèle Vincennes

clé: jeton obtenu
base_urll'adresse de votre travailleur, l'adresse par défaut est isolée et doit être acheminée.
modèle: :

  • @cf/bytedance/stable-diffusion-xl-lightning
  • @cf/lykon/dreamshaper-8-lcm
  • @cf/runwayml/stable-diffusion-v1-5-img2img
  • @cf/runwayml/stable-diffusion-v1-5-peinture
  • @cf/stabilityai/stable-diffusion-xl-base-1.0

 

code worker.js(Notez le remplacement de AccountID)

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
if (request.method === "OPTIONS") {
return new Response("", {
headers: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*'
}, status: 204
});
}

if (/^(https?:\/\/[^\/]*?)\/file\//i.test(request.url)) {
if (request.headers.get("if-modified-since")) {
return new Response("", { status: 304, headers: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*',
"Last-Modified": request.headers.get("If-Modified-Since")
}});
}

const img = await fetch(request.url.replace(/^(https?:\/\/[^\/]*?)\//, "https://telegra.ph/"));
return new Response(img.body, { status: img.status, headers: {
"content-type": img.headers.get("content-type"),
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*',
"Last-Modified": (new Date()).toUTCString(),
"Cache-Control": "public, max-age=31536000"
}});
}

const url = new URL(request.url);
const search = url.searchParams;

if (!search.get("debug")) {
if (url.pathname !== "/v1/chat/completions" || request.method !== "POST") {
return new Response("Not Found or Method Not Allowed", {
status: 404,
headers: {
"Content-Type": "application/json",
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*'
}
});
}
}

const authHeader = request.headers.get("Authorization") || "Bearer " + search.get("key");
if (!authHeader || !authHeader.startsWith("Bearer ")) {
return new Response("Unauthorized: Missing or invalid Authorization header", {
status: 401,
headers: {
"Content-Type": "application/json",
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*'
}
});
}

const apiKey = authHeader.slice(7);
let data;
try {
data = await request.json();
} catch (error) {
if (!search.get("debug")) return new Response("Bad Request: Invalid JSON", { status: 400 });
data = { model: search.get("model") || "@cf/stabilityai/stable-diffusion-xl-base-1.0", messages: [{ role: "user", content: search.get("prompt") || "cat" }] };
}

if (!data || !data.model || !data.messages || data.messages.length === 0) {
return new Response("Bad Request: Missing required fields", { status: 400 });
}

const prompt = data.messages[data.messages.length - 1].content;
const cloudflareUrl = `https://api.cloudflare.com/client/v4/AccountID/ai/run/${data.model}`;

const requestBody = JSON.stringify({
prompt: prompt,
num_inference_steps: 20,
guidance_scale: 7.5,
strength: 1
});

const currentTimestamp = Math.floor(Date.now() / 1000);
const uniqueId = `imggen-${currentTimestamp}`;

try {
const apiResponse = await fetch(cloudflareUrl, {
method: 'POST',
headers: {
'Authorization': authHeader,
'Content-Type': 'application/json',
},
body: requestBody,
});

if (!apiResponse.ok) {
throw new Error("Request error: " + apiResponse.status);
}

const imageBlob = await apiResponse.blob();
const formData = new FormData();
formData.append("file", imageBlob, "image.jpg");

const uploadResponse = await fetch("https://telegra.ph/upload", {
method: 'POST',
body: formData,
});

if (!uploadResponse.ok) {
throw new Error("Failed to upload image");
}

const uploadResult = await uploadResponse.json();
const imageUrl = request.url.match(/^(https?:\/\/[^\/]*?)\//)[1] + uploadResult[0].src;

const responsePayload = {
id: uniqueId,
object: "chat.completion.chunk",
created: currentTimestamp,
model: data.model,
choices: [
{
index: 0,
delta: {
content: `![](${imageUrl})`,
},
finish_reason: "stop",
},
],
};

const dataString = JSON.stringify(responsePayload);

return new Response(`data: ${dataString}\n\n`, {
status: 200,
headers: {
"Content-Type": "text/event-stream",
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*',
},
});
} catch (error) {
return new Response("Internal Server Error: " + error.message, {
status: 500,
headers: {
"Content-Type": "application/json",
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*',
},
});
}
}

 

modèle de synthèse vocale

clé: jeton obtenu
base_urll'adresse de votre travailleur
modèle: :

  • @cf/openai/whisper
  • @cf/openai/whisper-sherpa
  • @cf/openai/whisper-tiny-fr

Exemple POST :

Notez le remplacement de domain.com par l'adresse de votre travailleur.

curl -X POST https://domain.com/v1/audio/transcriptions \
-H "Authorization: Bearer 令牌" \
-F file=@C:\Users\Folders\audio.mp3 \
-F model="@cf/openai/whisper"

 

code worker.js(Notez le remplacement de AccountID)

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
const url = new URL(request.url)
const { pathname } = url

if (request.method === 'POST' && pathname === '/v1/audio/transcriptions') {
const formData = await request.formData()
const file = formData.get('file')
const model = formData.get('model')

if (!file || !model) {
return new Response('File or model not provided', { status: 400 })
}

const apiUrl = `https://api.cloudflare.com/client/v4/accounts/AccountID/ai/run/${model}`

const apiResponse = await fetch(apiUrl, {
method: 'POST',
headers: {
'Authorization': request.headers.get('Authorization'),
'Content-Type': 'application/octet-stream'
},
body: file.stream()
})

const apiResult = await apiResponse.json()

const textResult = apiResult.result.text

const formattedResult = JSON.stringify({ text: textResult })

return new Response(formattedResult, {
headers: { 'Content-Type': 'application/json' }
})
} else {
return new Response('Not Found', { status: 404 })
}
}

 

modèle de traduction

modèle: :

  • @cf/meta/m2m100-1.2b

Les langues prises en charge, source_lang et target_lang sont dans la même plage.

  • Anglais (en)
  • Chinois (zh)
  • Français (fr)
  • Allemand (de)
  • Espagnol (es)
  • Italien (it)
  • Japonais (ja)
  • Coréen (ko)
  • Portugais (pt)
  • Russe (ru)
  • Néerlandais (nl)
  • Suédois (sv)
  • Norvégien (non)
  • Danois (da)
  • Finlandais (fi)
  • Polonais (pl)
  • Turc (tr)
  • Arabe (ar)
  • Hébreu (il)
  • Indonésien (id)
  • Thaï (th)
  • Vietnamien (vi)
  • Hindi (hi)
  • Malais (ms)
  • Grec (el)
  • Tchèque (cs)
  • Slovaque (sk)
  • Roumain (ro)
  • Hongrois (hu)
  • Bulgare (bg)
  • Croate (hr)
  • Serbe (sr)
  • Ukrainien (uk)

 

Exemple POST :

curl --request POST \
--url https://api.cloudflare.com/client/v4/accounts/account_id/ai/run/${model}\
--header 'Authorization: Bearer 令牌' \
--header 'Content-Type: application/json' \
--data '{
"source_lang": "en",
"target_lang": "zh",
"text": "I love you."
}'

 

Traduction en immersion

Traduction immersive Ouvrez Beta dans Developer Settings et sélectionnez DeepLX (Beta) Address Input :https://你的worker地址/translate?password=${authKey}

worker.js

addEventListener('fetch', event => event.respondWith(handleRequest(event.request)));

const model = '@cf/meta/m2m100-1.2b';
const authKey = 'YOUR_PASSWORD';
const accountId = 'YOUR_ACCOUNT_ID';
const token = 'YOUR_TOKEN';

async function handleRequest(request) {
const url = new URL(request.url);

if (request.method === 'OPTIONS') return new Response(null, { status: 204, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization' } });

if (request.method !== 'POST' || url.pathname !== '/translate' || url.searchParams.get('password') !== authKey) return new Response(request.method !== 'POST' || url.pathname !== '/translate' ? 'Not Found' : 'Unauthorized', { status: request.method !== 'POST' || url.pathname !== '/translate' ? 404 : 401 });

const data = await request.json();
if (!data.text || !data.source_lang || !data.target_lang) return new Response('Bad Request', { status: 400 });

const cloudflareUrl = `https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/run/${model}`;
const init = {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ source_lang: data.source_lang.toLowerCase(), target_lang: data.target_lang.toLowerCase(), text: data.text })
};

try {
const response = await fetch(cloudflareUrl, init);
const responseData = await response.json();

return new Response(JSON.stringify({
alternatives: [], code: 200, data: responseData.result.translated_text, id: Math.floor(Math.random() * 10000000000), source_lang: data.source_lang, target_lang: data.target_lang
}), { headers: { 'Content-Type': 'application/json' } });
} catch (error) {
console.error('Translation failed:', error);
return new Response(JSON.stringify({ error: 'Translation failed' }), { headers: { 'Content-Type': 'application/json' }, status: 500 });
}
}

 

© déclaration de droits d'auteur
AiPPT

Articles connexes

Pas de commentaires

aucun
Pas de commentaires...