AIvantage
Kehittäjille

API-dokumentaatio

AIvantage on OpenAI- ja Anthropic-yhteensopiva reititin. Sovellus vaihtaa vain osoitteen ja avaimen, ja kutsut toimivat muuten ennallaan.

Osoite ja avain

  • OpenAI-muotohttps://app.aivantage.fi/v1
  • Anthropic-muotohttps://app.aivantage.fi

OpenAI-kirjastot käyttävät osoitetta, jonka lopussa on /v1. Anthropic-kirjastot ja Claude Code lisäävät polun itse, joten niille annetaan osoite ilman /v1:tä.

Avain luodaan portaalissa sovellukselle, ja se näytetään vain kerran. Lähetä se otsakkeessa Authorization: Bearer <AIVANTAGE_KEY> tai x-api-key: <AIVANTAGE_KEY>. Kumpikin otsake käy kumpaankin muotoon. Väärä tai poistettu avain palauttaa 401 invalid_api_key.

Rajapinnan virheviestit ovat aina englanniksi.

Rajapinnat

RajapintaKäyttö
POST /v1/chat/completionsOpenAI Chat Completions. Porrastus (aivantage/auto) tai lukittu malli, suoratoisto, työkalut ja kuvat.
POST /v1/responsesOpenAI Responses API palveluntarjoajan omille työkaluille (xAI x_search ja web_search). Vain xAI-mallit, ei suoratoistoa.
POST /v1/messagesAnthropic Messages. Anthropicin mallit sellaisinaan tai aivantage/auto, vastaus aina Anthropicin muodossa.
POST /v1/messages/count_tokensAnthropicin tokenilaskuri, ei laskuteta. Kun Anthropic ei voi laskea, esimerkiksi kun porrastuksessa ei ole Anthropic-mallia, reititin arvioi määrän itse ja lisää otsakkeen x-aivantage-estimate: 1.
GET /v1/modelsSovelluksen käytettävissä olevat mallit. Otsakkeen anthropic-version kanssa Anthropicin muodossa.
GET /v1/models/{model_id}Yksi malli samassa muodossa. Tuntematon malli: 404 model_not_found.

Mallit

Mallin nimiToiminta
aivantage/autoPorrastus. Pyyntö menee ensin politiikan halvimmalle askeleelle, ja laatuportit nostavat sen vahvempaan malliin vain tarvittaessa. Askeleet päätetään portaalissa. Toimii rajapinnoissa /v1/chat/completions ja /v1/messages. Jos model puuttuu, /v1/chat/completions käyttää porrastusta.
aivantage/<id>Lukittu malli. Pyyntö menee suoraan tälle mallille ilman porrastusta. Tunnisteen voi antaa myös ilman etuliitettä (esim. claude-sonnet). Sovelluksen sallitut mallit listaa GET /v1/models.
gpt-5.5, grok-4.7Palveluntarjoajan omat mallinimet eivät käy OpenAI-muodossa: vastaus on 404 model_not_found. Käytä tunnistetta listalta /v1/models.
claude-sonnet-5-5Rajapinnassa /v1/messages käyvät myös Anthropicin omat nimet, päivätyt versiot (esim. -20251001) ja pääte [1m]. Muiden palveluntarjoajien malleille vastaus on 400 messages_model_not_anthropic.

Vastauksen model-kentässä on malli, joka vastasi (aivantage/<id>). Jos sovellus on portaalissa lukittu yhteen malliin, pyyntö menee sille. Jos lukko hylkää muut mallit, toisen mallin pyyntö palauttaa 409 app_model_locked.

Suoratoisto, työkalut ja kuvat

Suoratoisto (stream: true)

PorrastusToimii molemmissa muodoissa. Porrastus valitsee vastauksen ensin, ja valmis vastaus lähetetään SSE-paloina. Ensimmäinen pala tulee siis vasta, kun vastaus on valmis. Jos politiikan stream_mode on fixed, suoratoisto alkaa heti kiinteältä mallilta.
Lukittu malliAito suoratoisto palveluntarjoajalta. Rajapinnassa /v1/messages Anthropicin tapahtumat tulevat sellaisinaan.
/v1/responsesEi suoratoistoa: 400 stream_not_supported.

Työkalut (function calling)

PorrastusToimii. Laatuportti tarkistaa työkalukutsun: työkalun pitää olla pyynnössä ja argumenttien kelvollista JSONia pakollisine kenttineen. Virheellinen kutsu siirtää pyynnön seuraavalle askeleelle.
Lukittu malliToimii, jos malli tukee työkaluja. Muuten 403 capability_not_supported.
/v1/messagesAnthropicin omat työkalut (esim. verkkohaku), dokumentit ja kuvat työkalun tuloksissa toimivat vain Anthropicin malleilla. Porrastuksessa tällainen pyyntö ohittaa muut askeleet.
/v1/responsesTyökalut x_search, web_search ja function.

Kuvat

PorrastusToimii (image_url, Anthropic-muodossa image). Askeleet, joiden kohde ei tue kuvia, ohitetaan.
Lukittu malliToimii, jos malli tukee kuvia. Muuten 403 capability_not_supported.
/v1/responsesinput_image välitetään palveluntarjoajalle.

Tietosuojasuodatin ei lue kuvia, joten kuva on aina tarkastamaton liite. Jos politiikka estää tarkastamattomat liitteet, pyyntö estetään ennen kuin mitään lähtee: 403 privacy_blocked, syy attachment_not_inspected.

Otsakkeet

Pyynnössä

Authorization: Bearer
x-api-key
AIvantage-avain. Kumpi tahansa.
X-AIvantage-End-UserLoppukäyttäjän tunniste tietosuojalokiin. Siitä tallennetaan vain avaimellinen tiiviste. Vaihtoehtoisesti OpenAI-kenttä safety_identifier tai user tai Anthropic-kenttä metadata.user_id.
X-AIvantage-Session-IdIstunnon tunniste tietosuojalokiin. Claude Coden X-Claude-Code-Session-Id luetaan samoin.
X-AIvantage-Privacy-OverridePeruste, jolla pyydetään päästämään tietosuojaesto läpi. Hyväksytään vain avaimelta, jonka politiikka nimeää, sallitulla perusteella ja sallituille tunnistetyypeille. Pyyntö kirjataan aina, hyväksyttiin se tai ei.
anthropic-versionRajapinnassa /v1/models lista ja virheet palautetaan Anthropicin muodossa. Rajapinnassa /v1/messages otsaketta ei välitetä, koska reititin lähettää oman versionsa.
anthropic-betaVälitetään Anthropicille. Tiliin sidotut betat (esim. tiedostot) välitetään vain asiakkaan omalla Anthropic-avaimella (BYOK).

Vastauksessa

x-aivantage-request-idPyynnön tunniste (req_…). Sama tunniste näkyy portaalin pyyntölokissa ja virherungon kentässä request_id. Kerro se tuelle.
Retry-AfterNopeusrajan 429-vastauksessa: sekunnit, joiden jälkeen pyynnön voi yrittää uudelleen. Mukana myös x-ratelimit-limit-*, x-ratelimit-remaining-* ja x-ratelimit-reset-*.
x-aivantage-estimateArvo 1, kun /v1/messages/count_tokens palauttaa reitittimen oman arvion.

Virheet

OpenAI-muodossa virheen syy on kentässä error.code ja luokka kentässä error.type: routing_error, policy_blocked, privacy_blocked, invalid_request_error tai billing_error.

{"error": {"message": "The model is not allowed by the tenant's policy.",
           "type": "policy_blocked", "code": "model_not_allowed",
           "request_id": "req_…"}}

Anthropic-muodossa (/v1/messages) tyyppi tulee HTTP-tilasta Anthropicin tapaan, ja koodi on viestin lopussa hakasulkeissa. Tila 503 no_healthy_instance palautetaan muodossa 529 overloaded_error, jotta kirjastot yrittävät uudelleen. Kun palveluntarjoaja itse hylkää pyynnön, sen oma virhe palautetaan sellaisenaan.

{"type": "error",
 "error": {"type": "permission_error",
           "message": "The model is not allowed by the tenant's policy. [model_not_allowed]"},
 "request_id": "req_…"}

Uudelleenyritys kannattaa tiloissa 429 (odota Retry-After), 502 ja 503. Muut 4xx-virheet johtuvat pyynnöstä tai asetuksista, eikä sama pyyntö onnistu uudelleen.

HTTPerror.codeMerkitys
400invalid_requestinvalid_request_errorRunko ei ole JSONia tai pakollinen kenttä puuttuu (model, messages, input).
400stream_not_supportedinvalid_request_error/v1/responses ei suoratoista. Lähetä pyyntö ilman stream: true.
400unsupported_toolinvalid_request_error/v1/responses hyväksyy vain työkalut x_search, web_search ja function.
400responses_model_not_supportedrouting_error/v1/responses tukee vain palveluntarjoajan työkaluja tarjoavia malleja (xAI, esim. aivantage/grok).
400messages_model_not_anthropicrouting_errorTämä rajapinta palvelee Anthropicin malleja ja aivantage/autoa; muiden palveluntarjoajien malleille käytä /v1/chat/completions-rajapintaa.
400messages_auto_needs_anthropicrouting_errorPyyntö käyttää Anthropicin omaa ominaisuutta, mutta porrastuksessa ei ole käytettävää Anthropic-mallia.
400messages_shared_account_featurerouting_errorTiedostot, kontit, skillit ja MCP-palvelimet vaativat asiakkaan oman Anthropic-avaimen (BYOK); AIvantagen jaetulla avaimella ne eivät ole käytettävissä.
400privacy_blockedprivacy_blockedTietosuojasuodatin esti pyynnön: siinä oli tunniste, jonka asiakkaan politiikka estää. Pyyntöä ei lähetetty millekään mallille.
401invalid_api_keyinvalid_request_errorAvain puuttuu, on väärä tai poistettu. Anthropic-muodossa tyyppi on authentication_error.
402pilot_endedbilling_errorPilotti on päättynyt eikä palvelua ole aktivoitu. Tyyppi billing_error, Anthropic-muodossa sama.
402provider_billingrouting_errorPalveluntarjoaja hylkäsi avaimen: saldo loppu tai kuukausiraja täynnä. Viestissä on palveluntarjoajan oma selitys.
403privacy_blockedprivacy_blockedTietosuojasuodatin esti pyynnön: siinä oli tunniste, jonka asiakkaan politiikka estää. Pyyntöä ei lähetetty millekään mallille.
403privacy_own_capacity_unsupportedprivacy_blockedPyynnössä oli tunniste, jonka asiakkaan politiikka ohjaa vain omalle kapasiteetille, eikä oma kapasiteetti palvele tätä rajapintaa; käytä /v1/chat/completions-rajapintaa. Pyyntöä ei lähetetty millekään mallille.
403policy_invalidpolicy_blockedAsiakkaan käsittelypolitiikka puuttuu tai on virheellinen; pyyntöä ei käsitelty.
403model_not_allowedpolicy_blockedMalli ei ole asiakkaan politiikan sallima.
403no_eligible_instancepolicy_blockedPolitiikan sallimaa kohdetta tälle mallille ei ole.
403capability_not_supportedpolicy_blockedMallin palveluntarjoaja ei tue pyynnön ominaisuutta (suoratoisto, työkalut tai kuvat).
403no_allowed_cascade_steppolicy_blockedPorrastuksessa ei ole politiikan sallimaa askelta.
403jurisdiction_not_allowedpolicy_blockedLainkäyttöalue ei ole politiikan sallima.
403external_not_allowedpolicy_blockedUlkoiset pilvipalvelut eivät ole politiikan sallimia.
403provider_not_allowedpolicy_blockedPalveluntarjoaja ei ole politiikan sallima.
403sovereignty_offpolicy_blockedSuvereniteetti on pois päältä, joten AIvantagen koneita ei käytetä.
403dedicated_to_other_tenantpolicy_blockedInstanssi on dedikoitu toiselle asiakkaalle.
403critical_requires_dedicatedpolicy_blockedVain asiakkaalle dedikoitu oma kapasiteetti on sallittu.
403credential_not_configuredpolicy_blockedPolitiikassa ei ole määritelty, kenen avaimella palveluntarjoajaa kutsutaan (oma vai AIvantagen).
403billing_agreement_requiredpolicy_blockedAIvantagen omat mallit vaativat hyväksytyn laskutussopimuksen. Käytä omaa API-avaintanne (BYOK) tai aktivoi palvelu portaalissa.
403platform_key_not_allowedpolicy_blockedAIvantagen API-avaimia ei käytetä asiakkaan kielimallikutsuihin ilman hyväksyttyä laskutussopimusta. Käytä omaa API-avaintanne (BYOK).
403app_model_not_allowedpolicy_blockedSovelluksen malli ei ole sallituilla alueilla. Valitse sovellukselle sallittu malli.
403sovereignty_fi_unsupportedpolicy_blockedSovelluksen pyynnöt kulkevat vain AIvantagen raudalla Suomessa, eikä rauta palvele tätä rajapintaa; käytä /v1/chat/completions-rajapintaa. Pyyntöä ei lähetetty millekään mallille.
404model_not_foundrouting_errorMallia ei ole. Käytä tunnistetta aivantage/<id> tai pelkkää <id>:tä listalta /v1/models.
404endpoint_not_supportedinvalid_request_errorPolkua ei ole (esim. /v1/embeddings). Viestissä luetellaan tuetut rajapinnat.
405method_not_allowedinvalid_request_errorPolku on olemassa, mutta metodi on väärä (esim. GET /v1/chat/completions).
409app_model_lockedpolicy_blockedSovellus on lukittu yhteen malliin, ja sovelluksen asetus hylkää muiden mallien pyynnöt.
413context_length_exceededrouting_errorSyöte on pidempi kuin politiikan salliman mallin konteksti. Vastausta ei palautettu.
429usage_limit_tokenspolicy_blockedSovelluksen kuukausittainen tokenraja on täynnä.
429usage_limit_eurpolicy_blockedSovelluksen kuukausittainen euroraja on täynnä.
429platform_spend_limitpolicy_blockedAsiakkaan kuukausikatto AIvantagen palveluntarjoaja-avaimille on täynnä. Käytä omaa avaintanne (BYOK) tai pyydä AIvantagea nostamaan kattoa.
429rate_limit_exceededrequests | tokensAsiakkaan nopeusraja täynnä: pyyntöä tai tokenia minuutissa tai samanaikaisia pyyntöjä. Syy kentässä reason, odotusaika otsakkeessa Retry-After.
4xxupstream_rejectedrouting_errorPalveluntarjoaja hylkäsi pyynnön. HTTP-tila ja viesti ovat palveluntarjoajan omat.
499client_disconnectedrouting_errorAsiakas katkaisi suoratoiston. Näkyy vain pyyntölokissa.
500internal_errorrouting_errorReitittimen sisäinen virhe. Kerro tuelle request_id.
502all_targets_failedrouting_errorKaikki politiikan sallimat kohteet epäonnistuivat; pyyntöä ei ohjattu muualle.
502upstream_stream_errorrouting_errorSuoratoisto katkesi palveluntarjoajan päässä kesken vastauksen. Virhe tulee viimeisenä SSE-tapahtumana.
503no_healthy_instancerouting_errorKaikki politiikan sallimat instanssit ovat alhaalla.
503locked_version_unavailablerouting_errorLukittua malliversiota ei ole saatavilla; versiota ei vaihdeta ilman hyväksyntää.
503credential_missingrouting_errorPalveluntarjoajan avain puuttuu: oma avain (BYOK) on tallentamatta tai AIvantagen avainta ei ole asetettu.
503app_model_unavailablepolicy_blockedSovelluksen lukittu malli ei ole nyt saatavilla, eikä sovellukselle ole valittu varamallia.
503sovereignty_fi_unavailablepolicy_blockedSovelluksen pyynnöt kulkevat vain AIvantagen raudalla Suomessa, mutta rauta ei ole nyt käytettävissä. Pyyntöä ei lähetetty millekään mallille.
503privacy_filter_unavailableprivacy_blockedTietosuojasuodatin ei saanut tarkistusta valmiiksi, ja asiakkaan politiikka vaatii sen ennen lähettämistä (fail-closed). Pyyntöä ei lähetetty millekään mallille.
503privacy_own_capacity_unavailableprivacy_blockedPyynnössä oli tunniste, jonka asiakkaan politiikka ohjaa vain omalle kapasiteetille, mutta politiikan sallimaa omaa kapasiteettia tälle pyynnölle ei ole. Pyyntöä ei lähetetty millekään mallille.

Nopeusrajat (429 rate_limit_exceeded)

Muoto on sama kuin palveluntarjoajien rajoissa: error.type on requests tai tokens, error.code on rate_limit_exceeded ja reitittimen oma syy on kentässä error.reason: tenant_rate_requests, tenant_rate_tokens, tenant_concurrency.

Tietosuojaesto (privacy_blocked)

Estetty pyyntö ei lähde millekään mallille. Kenttä error.privacy kertoo syyn (reason), selityksen suomeksi ja englanniksi (message_fi, message_en) sekä kohdat (violations), ei koskaan estettyjä arvoja.

HTTPerror.privacy.reasonMerkitys
403entity_blockedPyynnössä on tunniste, jonka politiikka estää. Kohdat: error.privacy.violations (ei arvoja).
403attachment_not_inspectedLiitettä tai kuvaa ei voitu tarkastaa, ja politiikka estää tarkastamattomat liitteet.
400unsupported_contentViestissä on sisältölohko, jonka tyyppiä suodatin ei tunne.
503request_too_longTarkastettavaa tekstiä on enemmän kuin asiakkaan asetusten raja.
503filter_timeoutTarkastus ei valmistunut ajoissa, ja politiikka vaatii sen (fail-closed).
503filter_errorTarkastus epäonnistui, ja politiikka vaatii sen (fail-closed).
503privacy_own_capacity_unavailablePyynnössä oli tunniste, jonka asiakkaan politiikka ohjaa vain omalle kapasiteetille, mutta politiikan sallimaa omaa kapasiteettia tälle pyynnölle ei ole. Pyyntöä ei lähetetty millekään mallille.
403privacy_own_capacity_unsupportedPyynnössä oli tunniste, jonka asiakkaan politiikka ohjaa vain omalle kapasiteetille, eikä oma kapasiteetti palvele tätä rajapintaa; käytä /v1/chat/completions-rajapintaa. Pyyntöä ei lähetetty millekään mallille.

Jos ohitusta pyydettiin mutta sitä ei hyväksytty, kenttä error.privacy.override kertoo syyn:

  • key_not_allowed Politiikka ei salli tämän avaimen ohittaa estoa.
  • reason_not_allowed Peruste ei ole politiikan sallittujen listalla.
  • type_not_overridable Tätä tunnistetyyppiä ei saa ohittaa.

Ei tuettu

Reititin palvelee vain yllä luetellut rajapinnat. Esimerkiksi upotukset, kuvien luonti ja puhe eivät ole käytettävissä: /v1/embeddings, /v1/images/*, /v1/audio/*, /v1/files, /v1/batches, /v1/fine_tuning/*, /v1/moderations, /v1/completions, /v1/assistants, /v1/realtime.

Tuntematon /v1-polku palauttaa tilan 404 ja tuetut rajapinnat:

{"error": {"message": "POST /v1/embeddings is not supported by AIvantage. Supported: …",
           "type": "invalid_request_error", "param": null,
           "code": "endpoint_not_supported"}}

Esimerkit

Korvaa <AIVANTAGE_KEY> sovelluksen avaimella. Sovelluksen sivulla portaalissa on samat esimerkit sovelluksen malleilla sekä Claude Coden ja LangChainin asetukset.

OpenAI · Python

pip install openai
from openai import OpenAI

client = OpenAI(
    base_url="https://app.aivantage.fi/v1",
    api_key="<AIVANTAGE_KEY>",
)
resp = client.chat.completions.create(
    model="aivantage/auto",
    messages=[{"role": "user", "content": "Hei!"}],
)
print(resp.choices[0].message.content)

OpenAI · JS/TS

npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://app.aivantage.fi/v1",
  apiKey: "<AIVANTAGE_KEY>",
});
const resp = await client.chat.completions.create({
  model: "aivantage/auto",
  messages: [{ role: "user", content: "Hei!" }],
});
console.log(resp.choices[0].message.content);

Anthropic · Python

pip install anthropic
import anthropic

client = anthropic.Anthropic(
    base_url="https://app.aivantage.fi",
    api_key="<AIVANTAGE_KEY>",
)
msg = client.messages.create(
    model="aivantage/auto",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hei!"}],
)
print(msg.content[0].text)

cURL

OpenAI-muoto: /v1/chat/completions
curl https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer <AIVANTAGE_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"model": "aivantage/auto", "messages": [{"role": "user", "content": "Hei!"}]}'
Anthropic-muoto: /v1/messages
curl https://app.aivantage.fi/v1/messages \
  -H "x-api-key: <AIVANTAGE_KEY>" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "aivantage/auto", "max_tokens": 256, "messages": [{"role": "user", "content": "Hei!"}]}'

Testaa toiminnot

Näillä pyynnöillä tarkistat, että kukin toiminto toimii. Anna ensin sovelluksen avain muuttujaan: export AIVANTAGE_API_KEY=…

Suojan Naamioi, Vain oma kapasiteetti ja Estä, liitteiden esto ja Suvereniteetti ovat käytössä, kun palvelu on aktivoitu. Pilotissa Suoja vain kirjaa.

Avain ja mallilista

Tarkistaa, että avain toimii ja mitkä mallit sovellus saa käyttää.

curl
curl -s https://app.aivantage.fi/v1/models \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY"

Mitä pitäisi näkyä: Tila 200. Listassa on aivantage/auto, jonka kentässä aivantage.cascade ovat porrastuksen askeleet, ja jokainen sovellukselle sallittu malli. Mallin kenttä aivantage.class kertoo, missä se ajetaan (own on AIvantagen oma kapasiteetti, muut eu, us ja cn), ja aivantage.jurisdictions maat.

Väärä avain

Tarkistaa, että väärällä avaimella ei pääse sisään.

curl
curl -s https://app.aivantage.fi/v1/models \
  -H "Authorization: Bearer vaara-avain"

Mitä pitäisi näkyä: Tila 401, error.code on invalid_api_key.

Porrastus

Tarkistaa, että porrastus valitsee mallin ja vastaa.

curl
curl -si https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","messages":[{"role":"user","content":"Vastaa yhdellä sanalla: mikä on Suomen pääkaupunki?"}]}'

Mitä pitäisi näkyä: Tila 200. Kentässä model on malli, joka vastasi (aivantage/<id>), ja se on yksi mallilistan aivantage/auto-kohdan cascade-malleista. Helppo kysymys menee yleensä ensimmäiselle askeleelle. Otsake x-aivantage-request-id on sama kuin kenttä id, ja samalla tunnisteella pyyntö näkyy portaalin pyyntölokissa. Kentässä usage ovat laskutettavat tokenit.

Lukittu malli

Tarkistaa, että pyyntö menee juuri pyydetylle mallille. Vaihda malliksi jokin tunniste mallilistalta.

curl
curl -s https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/gpt-luna","messages":[{"role":"user","content":"Sano pelkkä: ok"}]}'

Mitä pitäisi näkyä: Tila 200, ja kentässä model on pyydetty malli. Malli, jota listalla ei ole, palauttaa 404 model_not_found.

Anthropic-muoto

Tarkistaa, että Anthropic-kirjastojen rajapinta toimii samalla avaimella.

curl
curl -s https://app.aivantage.fi/v1/messages \
  -H "x-api-key: $AIVANTAGE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","max_tokens":50,"messages":[{"role":"user","content":"Sano pelkkä: ok"}]}'

Mitä pitäisi näkyä: Tila 200. Vastaus on Anthropicin muodossa (type on message), ja kentässä model on malli, joka vastasi (aivantage/<id>).

Suoratoisto

Tarkistaa, että vastaus tulee SSE-paloina.

curl
curl -sN https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","stream":true,"messages":[{"role":"user","content":"Laske yhdestä viiteen."}]}'

Mitä pitäisi näkyä: Rivejä data: {…}, joissa object on chat.completion.chunk ja joka palassa sama id ja model. Viimeisenä tulee pala, jossa on usage, ja sitten data: [DONE].

Suoja: henkilötunnus

Tarkistaa, mitä Suoja tekee henkilötunnukselle. Malli kirjoittaa tunnisteen merkki kerrallaan, joten vastauksesta näkee, mitä malli sai. Asetus: Portaalin Suoja-sivulla Henkilötunnus-rivin toimenpide.

curl
curl -s https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","messages":[{"role":"user","content":"Kirjoita tämä tunniste merkki kerrallaan välilyönnein erotettuna, ei muuta: 131052-308T"}]}'
AsetusMitä pitäisi näkyä
KirjaaTila 200, ja vastauksessa on 1 3 1 0 5 2 - 3 0 8 T: malli sai arvon. Löydös näkyy vain portaalissa.
NaamioiTila 200, ja vastauksessa on H E T U _ 1: malli sai paikkamerkin. Jos malli toistaa paikkamerkin sellaisenaan, AIvantage palauttaa vastaukseen alkuperäisen arvon.
Vain oma kapasiteettiTila 200, ja kentässä model on malli, jonka aivantage.class mallilistassa on own.
EstäTila 403. error.code on privacy_blocked ja error.privacy.reason entity_blocked. Kenttä error.privacy.violations kertoo kohdan, ei arvoa.

Suvereniteetti

Tarkistaa, että pyyntö ajetaan Suomessa. Toista pyyntö ilman henkilötunnusta ja vertaa. Asetus: Sovelluksen Suvereniteetti. Kriittiset Suomeen vaatii, että henkilötunnus on Kriittiset tiedot -listalla.

curl
curl -s https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","messages":[{"role":"user","content":"Henkilötunnus 131052-308T. Sano pelkkä: ok"}]}'
AsetusMitä pitäisi näkyä
Kriittiset SuomeenHenkilötunnuksen kanssa kentässä model on malli, jonka mallilistassa aivantage.class on own ja aivantage.jurisdictions FI. Ilman tunnistetta pyyntö reititetään tavalliseen tapaan.
Kaikki SuomeenKummassakin pyynnössä kentässä model on malli, jonka aivantage.class on own ja aivantage.jurisdictions FI.
Suomen kapasiteetti ei käytettävissäTila 503 sovereignty_fi_unavailable, jos asetus on Estä. Asetuksella Päästä pilveen ja kirjaa vastaa pilvimalli.

Tarkastamaton liite

Tarkistaa, että kuva, jota Suoja ei voi lukea, ei lähde mallille. Asetus: Suoja-sivun Edistyneet asetukset, Liitteet: Estä pyyntö.

curl
curl -s https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","messages":[{"role":"user","content":[{"type":"text","text":"Mitä kuvassa on?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="}}]}]}'

Mitä pitäisi näkyä: Tila 403. error.code on privacy_blocked ja error.privacy.reason attachment_not_inspected.

Nopeusraja

Tarkistaa, että raja pysäyttää ryöpyn. Mallia aivantage/rajatesti ei ole, joten pyynnöt eivät kuluta tokeneita.

curl
seq 800 | xargs -P 50 -I{} curl -s -o /dev/null -w '%{http_code}\n' https://app.aivantage.fi/v1/chat/completions \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/rajatesti","messages":[{"role":"user","content":"hei"}]}' | sort | uniq -c

Mitä pitäisi näkyä: Tulosteessa on rivi 429 ja loput 404. Yksittäisessä 429-vastauksessa error.code on rate_limit_exceeded, error.reason tenant_rate_requests ja otsakkeissa Retry-After ja x-ratelimit-limit-requests.

Tuntematon rajapinta

Tarkistaa, että rajapinta, jota AIvantage ei palvele, kertoo sen.

curl
curl -s https://app.aivantage.fi/v1/embeddings \
  -H "Authorization: Bearer $AIVANTAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"aivantage/auto","input":"hei"}'

Mitä pitäisi näkyä: Tila 404, error.code on endpoint_not_supported, ja viestissä luetellaan tuetut rajapinnat.