← Back to docs

OpenAI / AI

Language: SV | EN | SV

OpenAI / AI

Tools kan använda en intern AI-motor ("OpenAI Engine") för att analysera innehåll och driva plattformsfunktioner – utan att någon API-nyckel någonsin exponeras i frontend.

Den här dokumentationen är en användarmanual och beskriver:

  • Webgränssnittet för OpenAI Engine (admin)
  • Skillnaden mellan SocialGPT-flödet och den bredare direkta OpenAI-baserade Tools-accessen
  • API-endpointen för URL-analys
  • Behörigheter och autentisering
  • Hur man väljer rätt endpoint för en riktig integration
  • Hur man undviker vanliga 401-, 403- och 422-fel

Två olika AI-accesslager i plattformen

Plattformen gör nu en medveten skillnad mellan:

  1. SocialGPT / Social Media Tools-access
  2. Direkt OpenAI-baserad Tools-access

Den skillnaden är viktig eftersom de inte är samma sak.

Viktigt: POST /api/ai/socialgpt/respond är inte den huvudsakliga/generella "respond"-endpointen i Tools. Den finns för SocialGPT / Social Media Tools-kontraktet. Interna runtimes som IRCWatch ska normalt använda POST /api/ai/internal/respond i stället.

SocialGPT / Social Media Tools-access

  • Använder bearer-token som har access scopet ai.socialgpt (ai.client finns kvar som legacy-alias)
  • Den inbyggda SocialGPT-generatorn skapar fortfarande en dedikerad tokenrad med label/provider provider_socialgpt (äldre tools_ai_bearer-rader fungerar fortfarande), men den faktiska runtime-autentiseringen följer nu tokenens scope i stället för providernamnet i sig
  • Är avsett för SocialGPT-klienten/browserflödet och relaterad Social Media Tools-användning via Tools
  • Konfigureras från Social Media Tools-startsidan, men den sidan är inte längre hemmet för själva ansökningsformuläret för direkt OpenAI-access

Direkt OpenAI-baserad Tools-access

  • Är den bredare plattformsgrinden för direkt OpenAI-baserade Tools-endpoints och interna OpenAI-forwarder-token
  • Hör hemma under My API Keys (/keys/mine) och adminkön /admin/openai
  • Är det du ansöker om när du behöver åtkomst utanför det dedikerade SocialGPT-flödet

Web: OpenAI Engine (admin)

URL:

  • /admin/openai

Krav:

  • Inloggning (web session)
  • Behörighet: openai.manage

I webgränssnittet kan du:

  • Aktivera/avaktivera motorn (Enabled)
  • Sätta global policy (default model, allowlist, token-tak, rate limits)
  • Skapa/uppdatera Prompt profiles
  • Köra Test prompt för att verifiera att allt fungerar (server-side)

Dynamiska modellistor

Model-dropdowns i /admin/openai är inte längre hårdkodade.

  • Tools hämtar modellkatalogen server-side via OpenAI GET /v1/models
  • svaret filtreras ned till modell-id:n som är rimliga för chat/completions
  • om allowed_models är satt så filtreras dropdownen vidare av allowlisten
  • om live-discovery misslyckas används konfigurerade/default-modeller som fallback så att UI:t fortfarande fungerar

Det betyder att modellistan i admin bättre speglar vad den aktiva provider-nyckeln faktiskt kan använda, utan att någon nyckel exponeras i webbläsaren.

Vad betyder “Enabled”?

  • Enabled = av: AI-endpoints ska vara avstängda (ofta 503, beroende på endpoint).
  • Enabled = på: motorn kan användas (förutsatt att global provider-nyckel finns).

Obs: Provider-nycklar hanteras under API Keys och visas aldrig i klartext.

Audit-synlighet för operatörer

Om Slack-audit-forwarding är aktiverad för OpenAI- / SocialGPT-kategorier innehåller auditposterna nu också:

  • löst användaridentitet (user_id, och namn/e-post när det finns)
  • requestmetadata för IP / metod / path
  • en läsbar error_reason när ett upstream-/provideranrop misslyckas

Det gör det lättare för operatörer att se vem som utlöste ett AI-anrop och varför en misslyckad request avvisades.

Personliga Tools AI-token

Användare som har behörighet kan skapa en eller flera personliga bearer-token i Tools:

  • Gå till My API Keys: /keys/mine
  • Om kontot är nytt måste användaren först skicka in en OpenAI-ansökan där och invänta admin-godkännande
  • Använd sektionen Tools OpenAI forwarder tokens för att skapa separata namngivna token för olika interna jobb/klienter
  • Varje token kan roteras eller dödas separat senare
  • Själva tokenvärdet visas bara en gång och lagras server-side
  • Det generella formuläret Add new key/keys/mine visar nu de kända access scopes i Tools som en checkboxlista i stället för att användaren själv ska behöva gissa scopens namn manuellt
  • Samma key-formulär kan nu också generera lokala/interna public- och secret-värden direkt i webbläsarflödet när du behöver ett Tools-hanterat token-skelett i stället för att klistra in en tredjepartscredential

Dessa Tools-baserade AI-klienttoken är:

  • klient-/mottagartoken som används mot Tools
  • giltiga för Tools AI-endpoints som redan kräver godkänd OpenAI-access för användaren som äger tokenen
  • inte samma sak som den riktiga uppströmsnyckeln mot OpenAI
  • styrs nu av explicita access scopes på tokenen (ai.socialgpt, ai.internal osv.), så provider/namn är bara label/kategori

Det gör att du kan ha en token per uppdrag (till exempel en intern automation, ett batchjobb eller en research-klient) utan att återanvända samma bearer-token överallt.

Tools har fortfarande också ett separat dedikerat tokenflöde för SocialGPT:

  • den inbyggda SocialGPT-token-generatorn skapar fortfarande en provider_socialgpt-rad för bekvämlighet
  • äldre tools_ai_bearer fungerar fortfarande för kompatibilitet
  • dessa genererade SocialGPT-token är helt enkelt förkonfigurerade med scopet ai.socialgpt

Används så här:

Authorization: Bearer <token>

Varje token fungerar bara för de endpoints som täcks av tokenens egna access scopes och är kopplad till din användare + behörighet.

De inbyggda access scopes som nu visas i My API Keys är:

  • ai.socialgpt
  • ai.internal
  • whisper.api
  • mail-support-assistant.relay
  • sms.send
  • sms.gateway

Tools stöder nu också andra personliga systemtoken (till exempel provider_ircwatch eller provider_mail_support_assistant) så länge de är:

  • personliga / icke-globala
  • aktiva
  • markerade som AI-kapabla (is_ai=1) och/eller tilldelade det explicita scopet ai.socialgpt

Viktig skillnad:

  • dessa AI-kapabla token är klient-/mottagartoken som används mot Tools
  • provider_openai är uppströmsproviderns secret som används mot OpenAI och behandlas aldrig som en AI-mottagartoken

Snabbstart för integration

Om du ska integrera en klient mot Tools AI, börja här.

Steg 1: välj rätt endpoint-typ

Börja inte med att klistra in en slumpmässig AI-URL i en klient och hoppas att den beter sig som OpenAI:s publika API.

Tools har i dag flera AI-relaterade endpoints med olika kontrakt:

Användningsfall Endpoint Token-scope Viktig notering
SocialGPT-liknande reply / verify / modify-flöde POST /api/ai/socialgpt/respond ai.socialgpt Detta är ett Tools-specifikt kontrakt, inte ett OpenAI-kompatibelt
Intern runtime / assistent / automation POST /api/ai/internal/respond ai.internal Kräver client_slug och minst context eller user_prompt
IRCWatch / server-side-botruntime POST /api/ai/internal/respond ai.internal Använd helst en intern client slug som ircwatch; behandla inte SocialGPT som standardendpoint för runtime-flöden
Analys av en fjärr-URL server-side POST /api/ai/url/analyze godkänd OpenAI-access för den autentiserade användaren Inte tänkt som en generell chat-endpoint
Validera bara en SocialGPT-liknande bearer-token GET /api/social-media-tools/extension/validate-token ai.socialgpt Kontrollerar tokenen, inte om användaren faktiskt får köra OpenAI

Steg 2: kontrollera om klienten förväntar sig ett OpenAI-kompatibelt API

Det här är den vanligaste integrationsmissen.

Tools-endpoints som:

  • POST /api/ai/socialgpt/respond
  • POST /api/ai/internal/respond

är inte drop-in-ersättare för OpenAI /v1/chat/completions.

Det betyder att:

  • en generisk ruta som heter ungefär “AI Provider URL” i en annan klient ändå kan fallera även när tokenen är korrekt
  • om klienten bara vet hur den ska skicka OpenAI-liknande JSON kommer Tools att svara med valideringsfel i stället för användbara svar
  • särskilt POST /api/ai/internal/respond kräver Tools-specifika fält som client_slug

Om klienten inte kan styra JSON-body själv kan den behöva en adapter/proxy i stället för direktkoppling mot den interna Tools-endpointen.

Steg 3: kontrollera både token-scope och användarens access

För bearer-tokenintegrationer finns två separata kontroller som måste vara uppfyllda:

  1. Tokenen i sig måste ha rätt scope
  2. Användaren som äger tokenen måste fortfarande få använda OpenAI-baserade Tools-funktioner

Exempel:

  • en token kan ha ai.internal men ändå nekas med 403 om användaren bakom tokenen saknar godkänd OpenAI-access
  • en token kan vara giltig i validate-token men ändå misslyckas på ett riktigt AI-anrop eftersom användaren bakom tokenen saknar provider_openai

Steg 4: testa med rå HTTP innan du skyller på klient-UI:t

Innan du felsöker en browser extension, Copilot-liknande inställningsruta eller desktopklient, testa samma endpoint manuellt med curl eller annan rå HTTP-klient.

Det svarar direkt på:

  • om tokenen accepteras
  • om användaren har OpenAI-access
  • om payloaden är giltig
  • om endpointen faktiskt är rätt för klienttypen

Vilken URL ska jag använda?

För en SocialGPT-liknande klient

Använd:

  • POST /api/ai/socialgpt/respond

när klienten kan skicka Tools-specifika fält som:

  • context
  • user_prompt
  • modifier
  • request_mode
  • valfri klientmetadata (client_name, client_version, client_platform)

För en intern assistent / runtime / automation-klient

Använd:

  • POST /api/ai/internal/respond

när klienten kan skicka en Tools-specifik JSON-body som innehåller:

  • client_slug
  • och minst en av context eller user_prompt

Det här är normalvalet för Tools-baserade runtimes som IRCWatch, cron-jobb, bakgrundsarbetare och andra integrationer som inte är SocialGPT.

För en generisk OpenAI-kompatibel chatklient

Utgå inte från att POST /api/ai/internal/respond är rätt URL.

Om klienten bara kan skicka OpenAI-standardformat som messages[], input eller vanlig Chat Completions-payload behöver du i dagsläget i stället något av följande:

  • en dedikerad Tools-side adapter-endpoint som är OpenAI-kompatibel
  • eller en liten proxy som transformerar inkommande request till Tools-kontraktet

Utan den adaptern kan klienten fallera med 422 Unprocessable Content trots att tokenen är korrekt.

API: URL Analyze

OpenAI-ansökningar (användarflöde)

Vanliga nya användare får inte längre använda OpenAI-baserade Tools-funktioner automatiskt bara för att ett dagligt budgettak finns.

Användarflöde:

  • Öppna My API Keys: /keys/mine
  • Om du öppnar /openai/access/request direkt i webbläsaren skickar Tools dig nu tillbaka till den inbyggda ansökningsrutan under My API Keys i stället för att lämna dig på en generisk felsida
  • Samma redirectskydd accepterar nu också den vanliga felskrivningen /openai/access/requst
  • Om kontot ännu inte har OpenAI-access används formuläret där för att beskriva behovet
  • Social Media Tools-startsidan länkar nu hit när du faktiskt behöver plattformsbred OpenAI-access utanför SocialGPT-flödet
  • En admin granskar sedan ansökan i /admin/openai
  • Efter godkännande får kontot den faktiska behörigheten provider_openai och kan därefter skapa en eller flera Tools OpenAI forwarder-token under My API Keys

Adminflöde:

  • Öppna /admin/openai
  • Granska tabellen OpenAI access requests
  • Godkänn eller avslå ansökningar direkt där
  • När en eller flera OpenAI-ansökningar fortfarande väntar visar Tools nu en liten fast påminnelse på vanliga inloggade sidor för admins/granskare, med direktlänk tillbaka till /admin/openai
  • Ett avslag tar också bort eventuella personliga AI-mottagartoken för användaren (inklusive dedikerade provider_tools_openai-token, inte bara den äldre Tools AI bearer-raden)

API: URL Analyze

Endpoint:

  • POST /api/ai/url/analyze

Syfte:

  • Du skickar in en URL (och ev. en fråga)
  • Tools hämtar och sanerar texten server-side
  • OpenAI Engine analyserar texten via vald prompt-profil

Request

Form data eller JSON:

  • url (required) — URL att analysera
  • question (optional) — fråga/fokus för analysen
  • profile (optional) — prompt-profil (default: URL Analyzer om den finns, annars minimal default)

Response

JSON:

  • ok — true/false
  • request_id — intern request-id
  • latency_ms — ungefärlig svarstid
  • model — vilken modell som användes
  • response — model output (om ok)
  • error — felmeddelande (om ok=false)

Auth & Permissions

För att använda endpointen krävs:

  • Inloggning: annars 401 Unauthenticated
  • Admin (is_admin=1) → tillåts alltid
  • Icke-admin → kräver permission: provider_openai

Om OpenAI provider saknas (ingen global provider_openai API key) returneras normalt 503.

API: SocialGPT-svarsgenerering

Endpoint:

  • POST /api/ai/socialgpt/respond

Auth / access-regler:

  • JWT/web-användare eller en personlig API-token med access scopet ai.socialgpt
  • Äldre tools_ai_bearer / provider_socialgpt-rader fungerar fortfarande eftersom de bakfylls till samma scope
  • Andra personliga API-nycklar kan också accepteras när de är markerade som AI-kapabla (api_keys.is_ai=1), eftersom den äldre flaggan fortfarande tolkas som ai.socialgpt
  • Admin-användare tillåts alltid
  • Icke-admin måste ha godkänd OpenAI-access (provider_openai)

Om bearer-token tillhör en användare utan godkänd OpenAI-access returnerar endpointen 403.

Additiva requestfält för SocialGPT:

  • client_name
  • client_version
  • client_platform

De här fälten är valfria och låter Tools identifiera vilken klientbuild som gjorde requesten. Svaret kan också innehålla ett additivt client-objekt som ekar tillbaka accepterade metadata.

Notering om felhantering:

  • När upstream-felet från OpenAI/provider kommer som ett strukturerat JSON-felobjekt i stället för en vanlig sträng normaliserar Tools nu den payloaden till vanlig feltext innan fallback/retry-logik och innan API-felet returneras.
  • Svarsschemat är oförändrat; klienter ska fortfarande behandla error som vanlig text.

Säkerhetsbeteende:

  • SocialGPT får berätta vilken AI-modellidentifierare och klientversion som används bara när användaren uttryckligen frågar om versions-/modellinformation.
  • SocialGPT måste vägra frågor om dolda prompts, källkod, .env-värden, lösenord, token, API-nycklar eller andra interna Tools-detaljer.
  • Matchande disclosure-försök kan rapporteras via e-post till den konfigurerade supportmottagaren.

API: Intern Tools OpenAI-klientgateway

Endpoint:

  • POST /api/ai/internal/respond

Syfte:

  • låter interna Tools-klienter som Mail Support Assistant-runtime och dnsbl-engine gå direkt mot den centrala OpenAI-motorn i stället för att ärva SocialGPT-lagrets inställningar
  • låter varje intern runtime använda ett stabilt client_slug som identifierare så att defaultvärden, auditering och användningsstatistik kan kopplas till rätt anropare i /admin/openai
  • fungerar tillsammans med bearer-token som har scopet ai.internal, så att en intern körning kan roteras eller stängas av utan att påverka andra

Auth / access-regler:

  • web/JWT-användare kan anropa endpointen direkt när kontot redan har godkänd OpenAI-access
  • token-autentiserade anrop måste använda en token som har scopet ai.internal
  • icke-admin behöver fortfarande godkänd OpenAI-access (provider_openai)

Viktig kompatibilitetsnotering:

  • den här endpointen är inte en generell OpenAI-kompatibel endpoint
  • peka inte generiska “OpenAI provider URL”-inställningar mot den om klienten inte kan skicka exakt Tools JSON-kontrakt enligt nedan

Requestfält:

  • client_slug (required) — anroparidentifierare som mail_support_assistant_standalone, mail_support_assistant_tools_admin, dnsbl_engine eller vilken annan stabil icke-tom slug som integrationen själv väljer
  • context (optional) — stödjande kontext/body-data
  • user_prompt (optional) — den direkta instruktionen för uppgiften
  • modifier (optional) — kort uppföljande modifierare
  • mood / custom_mood (optional) — tonalitetsoverride för just det här anropet ovanpå sparad klientconfig
  • responder_name_override (optional)
  • persona_profile_override (optional)
  • custom_instruction_override (optional)
  • model (optional)
  • reasoning_effort (optional)none|low|medium|high|xhigh
  • response_language (optional)auto|sv|en|da|no|de|fr|es
  • max_tokens (optional)
  • temperature (optional)
  • use_web_search (optional)
  • web_search_required (optional)

Valideringsregel som orsakar många 422-svar:

  • client_slug är obligatoriskt
  • minst en av context eller user_prompt måste vara icke-tom

Viktig runtime-notering:

  • en giltig anropare blockeras inte längre bara för att sluggen aldrig tidigare registrerats i /admin/openai
  • om token/användaren redan har access accepteras valfri icke-tom client_slug som identifierare
  • Tools auto-registrerar nu sedda interna slugs så att operatörer senare kan lägga på sparade defaultvärden och se lättviktig statistik per slug

Så en payload som denna fallerar:

{
  "model": "gpt-4"
}

med ett valideringsliknande 422 / “unprocessable content”-svar.

Minsta giltiga interna request

{
  "client_slug": "client_browser_companion",
  "user_prompt": "Reply with ok",
  "context": "Connection test"
}

Exempel: request för intern assistent

curl -X POST "https://tools.tornevall.net/api/ai/internal/respond" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
    "client_slug": "client_browser_companion",
    "context": "Temporary demo feature",
    "user_prompt": "Reply with ok",
    "model": "gpt-4o",
    "response_language": "en"
  }'

Lyckat svar innehåller:

  • ok
  • request_id
  • model
  • response
  • usage
  • used_fallback_model
  • client (slug, name, description)
  • applied_settings (responder_name, persona_profile_excerpt, custom_instruction_excerpt, mood, response_language, reasoning_effort)
  • additiv web_search-metadata (requested, required, used, citations[])

Admin-UI-notering:

  • /admin/openai har nu också en central sektion Internal AI clients där operatörer kan redigera sparade standardvärden för varje internt client_slug, även sådana slugs som först dök upp via live-trafik.

Hur instruerar jag en intern assistent?

För interna assistentliknande klienter ligger den huvudsakliga styrningen inte i URL:en i sig.

Beteendet kommer från två lager:

  1. den sparade server-side-konfigurationen för valt client_slug (när en sådan finns)
  2. valfria override-fält i enskilda requester

Det normala sättet att “instruera Copilot för den här assistenten” är därför att:

  • välja en stabil client_slug för den aktuella runtimen
  • vid behov låta sluggen dyka upp en gång och sedan förfina den i /admin/openai om du vill ha sparade defaultvärden/statistik där
  • konfigurera standardvärden där
  • vid behov skicka override-fält som:
    • responder_name_override
    • persona_profile_override
    • custom_instruction_override
    • mood
    • response_language

Om det externa klient-UI:t inte låter dig skicka dessa extra fält är begränsningen i den klienten — inte i själva Tools-tokenen.

Felsökning

401 Unauthenticated

Brukar betyda:

  • ingen bearer-token skickades
  • tokenvärdet är fel
  • tokenen är inaktiv
  • tokenen saknar rätt scope för endpointen

403 Forbidden

Brukar betyda:

  • tokenen är giltig, men användaren bakom tokenen saknar godkänd OpenAI-access (provider_openai)
  • eller att användaren annars inte får använda just den endpointen

Detta är inte samma sak som “dålig token”.

422 Unprocessable Content

Brukar betyda:

  • endpointen nåddes framgångsrikt
  • auth passerade sannolikt långt nog för att nå valideringen
  • men JSON-body saknar obligatoriska Tools-fält

För POST /api/ai/internal/respond är det vanligast att något av detta är orsaken:

  • client_slug saknas
  • både context och user_prompt är tomma
  • en extern klient skickar generisk OpenAI-payload i stället för Tools-kontraktet

“Min token validerar, men riktiga requester failar ändå”

Det är väntat om du bara testade:

  • GET /api/social-media-tools/extension/validate-token

för den endpointen verifierar bara tokenen i sig.

Den bevisar inte att användaren faktiskt får köra OpenAI-baserade requester just nu.

“Vilken endpoint ska jag testa först?”

För en ny integration, testa i den här ordningen:

  1. validera token / authmodell
  2. kör en rå curl-request mot den riktiga mål-endpointen med minsta giltiga payload
  3. först därefter matar du in samma värden i det GUI/den klient du egentligen vill använda

Dokumentationsskiss: framtida OpenAI-kompatibel adapter-endpoint

Den här sektionen är avsiktligt bara en designskiss.

Den beskriver en rekommenderad riktning för en framtida Tools-side kompatibilitetsadapter så att externa klienter som bara förstår OpenAI-liknande requestformat ändå kan prata med Tools utan att själva behöva skicka dagens Tools-specifika client_slug / context / user_prompt-payload direkt.

Den här endpointen finns inte ännu som ett publikt kontrakt.

Varför en adapter är användbar

Vissa klienter stöder bara fält som:

  • model
  • messages[]
  • temperature
  • max_tokens

och ett enda textfält för ungefär “provider URL”.

Sådana klienter kan inte enkelt prata med:

  • POST /api/ai/internal/respond

eftersom den interna Tools-endpointen förväntar sig fält som:

  • client_slug
  • context
  • user_prompt

En adapter-endpoint skulle lösa den mismatchen.

Rekommenderad adapterform

Föreslagen framtida endpoint:

  • POST /api/openai/v1/chat/completions

Föreslagen authmodell:

  • bearer-token med scopet ai.internal
  • eller ett smalare framtida scope som är dedikerat för adaptern om du senare vill separera den från den råa interna gatewayen

Föreslaget backendbeteende:

  1. acceptera en OpenAI-liknande chat-payload
  2. lösa internt client_slug från någon av dessa källor:
    • explicit requestfält som additivt client_slug
    • additiv header som X-Tools-Client-Slug
    • tokennivå-default som kan konfigureras i Tools senare
    • sista säker fallback som generic_openai_compat_client
  3. platta ut messages[] till internt Tools-format:
    • tidigare system / developer / assistenthistorik → context
    • senaste user-meddelandet → user_prompt
  4. föra vidare stödda generationsfält:
    • model
    • temperature
    • max_tokens
  5. internt anropa befintlig service bakom POST /api/ai/internal/respond
  6. konvertera tillbaka Tools-svaret till ett OpenAI-kompatibelt responseobjekt

Föreslagen minsta accepterade request-body

{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "user",
      "content": "Sammanfatta den här sidan i tre punkter."
    }
  ]
}

Föreslagna additiva Tools-specifika kompatibilitetsfält

Det här är valfria idéer för en framtida adapter. De är inte aktiva publika API-fält idag.

{
  "client_slug": "generic_openai_compat_client",
  "response_language": "en",
  "tools_context": "Temporary browser-side assistant session"
}

Föreslagen responseform

För maximal kompatibilitet bör svaret strukturellt ligga nära OpenAI Chat Completions, till exempel:

{
  "id": "tools-chatcmpl-123",
  "object": "chat.completion",
  "created": 1760000000,
  "model": "gpt-4o",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 100,
    "completion_tokens": 40,
    "total_tokens": 140
  }
}

Rekommenderad validerings- och felmappning

Om adaptern implementeras senare, håll felsemantiken tydlig:

  • 401 → saknad/ogiltig token
  • 403 → token accepterad, men användaren bakom tokenen saknar OpenAI-access
  • 422 → saknad messages[], saknat användbart user-meddelande eller misslyckad klientupplösning
  • 503 → Tools OpenAI Engine/provider otillgänglig

Rekommenderad implementationsplats

Om det byggs senare är den renaste riktningen normalt:

  • ny controllermetod nära app/Http/Controllers/AiGatewayController.php
  • route i routes/api.php
  • återanvändning av InternalOpenAiClientService
  • ett litet request/response-mapperlager i stället för duplicerad OpenAI-logik

Generiska kodsnippets för interna assistentintegrationer

Snippetarna nedan är avsiktligt generiska. De är inte beroende av en viss intern klient som client_browser_companion.

Byt ut platshållare som:

  • YOUR_API_TOKEN
  • YOUR_CLIENT_SLUG
  • YOUR_TEXT_HERE

mot värden som passar din egen Tools-konfiguration.

Minsta giltiga interna request (JSON)

{
  "client_slug": "YOUR_CLIENT_SLUG",
  "user_prompt": "YOUR_TEXT_HERE",
  "context": "Valfri stödjande kontext"
}

curl-exempel

curl -X POST "https://tools.tornevall.net/api/ai/internal/respond" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
    "client_slug": "generic_internal_assistant",
    "context": "Valfri sid- eller arbetsflödeskontext.",
    "user_prompt": "Sammanfatta de viktigaste åtgärderna från den här sidan.",
    "model": "gpt-4o",
    "response_language": "en"
  }'

JavaScript / fetch-exempel

const response = await fetch("https://tools.tornevall.net/api/ai/internal/respond", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_API_TOKEN"
  },
  body: JSON.stringify({
    client_slug: "generic_internal_assistant",
    context: "Valfri sid- eller arbetsflödeskontext.",
    user_prompt: "Sammanfatta de viktigaste åtgärderna från den här sidan.",
    model: "gpt-4o",
    response_language: "en"
  })
});

const data = await response.json();
console.log(data);

PowerShell-exempel

$headers = @{
  "Content-Type"  = "application/json"
  "Authorization" = "Bearer YOUR_API_TOKEN"
}

$body = @{
  client_slug       = "generic_internal_assistant"
  context           = "Valfri sid- eller arbetsflödeskontext."
  user_prompt       = "Sammanfatta de viktigaste åtgärderna från den här sidan."
  model             = "gpt-4o"
  response_language = "en"
} | ConvertTo-Json

Invoke-RestMethod \
  -Method Post \
  -Uri "https://tools.tornevall.net/api/ai/internal/respond" \
  -Headers $headers \
  -Body $body

Python-exempel

import requests

response = requests.post(
    "https://tools.tornevall.net/api/ai/internal/respond",
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer YOUR_API_TOKEN",
    },
    json={
        "client_slug": "generic_internal_assistant",
        "context": "Valfri sid- eller arbetsflödeskontext.",
        "user_prompt": "Sammanfatta de viktigaste åtgärderna från den här sidan.",
        "model": "gpt-4o",
        "response_language": "en",
    },
    timeout=60,
)

print(response.status_code)
print(response.json())

Generisk /admin/openai-instruktionsmall för interna assistenter

Om du skapar en intern assistentprofil i /admin/openai är den här generiska startmallen ofta en bättre första nivå än att direkt hårdkoda en klientspecifik persona.

Föreslagen klientavsikt

Använd den här stilen för assistenter som ska:

  • sammanfatta skickad kontext
  • förklara synligt innehåll eller arbetsflödesstatus
  • skriva om text tydligt
  • föreslå nästa steg
  • hålla sig praktisk och kortfattad

Föreslagen responderstil

  • kortfattat före heltäckande
  • praktiskt före teoretiskt
  • förklara vad användaren ska göra härnäst, inte bara vad något betyder
  • undvik onödigt utfyllnadsspråk
  • låtsas inte känna till dold kontext som klienten inte har skickat in
  • om information saknas, säg exakt vad som saknas

Föreslagen custom instruction-text

Du är en praktisk intern assistent för Tools-anslutna klienter.

Din uppgift är att hjälpa användaren att förstå den skickade kontexten, sammanfatta viktig information, skriva om eller förtydliga text och föreslå användbara nästa steg.

Prioriteringar:
1. Var tydlig och operativt användbar.
2. Föredra korta, direkta svar om inte användaren uttryckligen ber om mer detalj.
3. När du sammanfattar, fokusera på de viktigaste fakta, beslut, blockerare, deadlines och actions.
4. Om den skickade kontexten är ofullständig, säg vad som saknas i stället för att hitta på detaljer.
5. Påstå inte att du har klickat, hämtat, verifierat eller inspekterat något utanför den skickade kontexten.
6. Om användaren ber om en omskrivning, bevara betydelsen men förbättra struktur, ton och tydlighet.
7. Om användaren frågar vad nästa steg är, ge en kort ordnad lista med åtgärder.

Ton:
- lugn
- kompetent
- hjälpsam
- inte överdrivet pratig

Undvik:
- hype
- vag konsultprosa
- att presentera osäker information som verifierad sanning
- långa introduktioner eller avslutande utfyllnad om inte användaren vill ha mer formell stil

Föreslagen default mood

Ett bra generiskt startvärde i /admin/openai är:

  • clear, concise, practical

Föreslaget beteende för responsespråk

  • använd samma språk som användarens synliga fråga när det går
  • om inputen är blandad, prioritera språket i den faktiska frågan/prompten

API: Extensionens smoke test jämfört med tokenvalidering

Relaterade extension-endpoints:

  • GET /api/social-media-tools/extension/validate-token
  • GET /api/social-media-tools/extension/test
  • POST /api/social-media-tools/extension/test

Viktig skillnad:

  • validate-token verifierar bara att den skickade personliga AI-kapabla tokenen är giltig
  • test kör ett riktigt OpenAI-baserat smoke test och kräver därför godkänd OpenAI-access för icke-admin

Det gör att klienter kan skilja på "tokenet tillhör en riktig användare" och "den användaren får faktiskt köra OpenAI-anrop just nu".

Exempel

curl -X POST "https://tools.tornevall.net/api/ai/url/analyze" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <TOKEN>" \
  -d '{
    "url": "https://example.com",
    "question": "What is this page about?",
    "profile": "URL Analyzer"
  }'

Säkerhet

  • Inga nycklar exponeras i frontend.
  • URL-innehåll hämtas server-side med SSRF-skydd (privata IP-ranges blockeras, storleksgräns, timeouts, redirect-limit).
  • System/developer-instruktioner styrs av prompt-profiler, inte klienten.

API: Modellkatalog för Social Media-extension

Endpoint:

  • GET /api/social-media-tools/extension/models

Syfte:

  • returnerar den modellista som backend har upptäckt för den autentiserade Tools bearer token
  • gör att Chrome-extensionen kan bygga sin model-dropdown dynamiskt utan att prata direkt med OpenAI
  • återanvänder samma nyckelupplösning som resten av Tools (personlig OpenAI-nyckel om sådan finns, annars global)