Transformace maji svou kategorii, pribylo XML

Odstranena sluzba AI zpracovani textu. Delala totez co OpenAI, jen jinymi
slovy, a dva zpusoby jak udelat jednu vec znamenaji jen otazku, ktery pouzit.
Ukazkove stromy a stopy, ktere na ni odkazovaly, miri na openai.chat.

- nova kategorie Transformace dat. Driv byly mezi obecnymi sluzbami vedle
  webhooku a pauzy; ve chvili kdy jich je vic nez tri, hleda je clovek jako
  skupinu, ne mezi spoustecemi.
- skript transform.to-xml: zapise objekt jako XML vcetne escapovani. Cizi
  systemy si XML porad rikaji casto (ISDOC, EDI, banky, statni sprava)
  a bez toho se sestavuje retezcem v HTTP kroku, kde se na escapovani
  zapomene pokazde. Klice, ktere nejsou platny nazev prvku, se prejmenuji
  a rekne se to nahlas; klic zacinajici cislici dostane podtrzitko misto
  odriznuti, jinak by 2024 a 2025 byly totez.
- navrh cele skupiny transformaci v 13-transformace-dat.md: formaty, pole
  a hodnoty, seznamy, text a kontrola, vcetne toho co v seznamu zamerne neni.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-28 09:05:27 +02:00
co-authored by Claude Opus 5
parent aa0a783095
commit e1c52e3da3
9 changed files with 287 additions and 428 deletions
+2 -2
View File
@@ -574,7 +574,7 @@ function seedDemoAutomations(): void {
steps: [
{ id: 'st_11', kind: 'action', serviceId: 'voicebot', operationId: 'play-scenario' },
{ id: 'st_12', kind: 'action', serviceId: 'transcription', operationId: 'transcribe' },
{ id: 'st_13', kind: 'action', serviceId: 'ai-text', operationId: 'classify' },
{ id: 'st_13', kind: 'action', serviceId: 'openai', operationId: 'chat' },
{
id: 'st_14',
kind: 'condition',
@@ -624,7 +624,7 @@ function seedDemoAutomations(): void {
{ id: 'st_31', kind: 'action', serviceId: 'ga4', operationId: 'run-report' },
{ id: 'st_32', kind: 'action', serviceId: 'google-ads', operationId: 'campaign-report' },
{ id: 'st_33', kind: 'action', serviceId: 'sklik', operationId: 'campaign-report' },
{ id: 'st_34', kind: 'action', serviceId: 'ai-text', operationId: 'generate' },
{ id: 'st_34', kind: 'action', serviceId: 'openai', operationId: 'chat' },
{ id: 'st_35', kind: 'action', serviceId: 'email', operationId: 'send' },
],
},
+8 -86
View File
@@ -29,7 +29,12 @@ export type ServiceCategory =
| 'logistika'
| 'komunikace'
| 'analytika'
| 'ai';
| 'ai'
/**
* Prevody dat mezi kroky. Vlastni kategorie, ne polozka v Obecnem:
* je jich hodne a clovek je hleda jako skupinu, ne mezi webhookem a pauzou.
*/
| 'transformace';
/**
* available = sluzbu umime, planned = je na roadmape.
@@ -278,6 +283,7 @@ export const serviceCategories: Array<{ id: ServiceCategory; label: string }> =
{ id: 'komunikace', label: 'Komunikace' },
{ id: 'analytika', label: 'Analytika' },
{ id: 'ai', label: 'AI a hlas' },
{ id: 'transformace', label: 'Transformace dat' },
];
export const services: Service[] = [
@@ -2306,90 +2312,6 @@ export const services: Service[] = [
},
],
},
{
id: 'ai-text',
name: 'AI zpracování textu',
category: 'ai',
description: 'Klasifikace, extrakce dat a generování textu jazykovým modelem.',
icon: 'Sparkles',
status: 'available',
general: false,
/*
* Nebezi u nas, stejne jako OpenAI. Rozdil proti sluzbe OpenAI je v tom,
* na co se pta: tam se posila volny dotaz, tady jsou hotove ulohy
* (zaradit, vytahnout, napsat) s pevnym vystupem, na ktery se da ve strome
* navazat podminkou.
*/
appId: null,
baseUrl: 'https://api.openai.com/v1',
visibility: { mode: 'everyone', tenantIds: [], userIds: [] },
credentials: [
{
id: 'apiKey',
label: 'API klíč',
target: 'header',
name: 'Authorization',
prefix: 'Bearer ',
required: true,
secret: true,
hint: 'platform.openai.com, sekce API keys. Vložte jen klíč, slovo Bearer doplní portál.',
},
{
id: 'model',
label: 'Model',
target: 'config',
name: 'model',
required: false,
secret: false,
hint: 'Bez vyplnění gpt-4o-mini. Platí pro všechny operace této služby.',
},
{
id: 'organization',
label: 'ID organizace',
target: 'header',
name: 'OpenAI-Organization',
required: false,
secret: false,
hint: 'Jen když má účet víc organizací a útrata se má počítat konkrétní z nich.',
},
],
// Seznam modelu: nejlevnejsi cteci volani, ktere vyzaduje platny klic.
verifyPath: '/models',
triggers: [],
actions: [
{
id: 'classify',
name: 'Zařadit do kategorie',
description: 'Rozhodne, do které kategorie text patří (např. téma ticketu).',
inputs: [
{
id: 'categories',
label: 'Seznam kategorií',
kind: 'text',
required: true,
hint: 'Oddělte čárkou, například: porucha, dotaz, reklamace',
},
{ id: 'text', label: 'Text', kind: 'longtext', required: true },
],
outputFields: [
{ id: 'ai.category', name: 'category', type: 'string', required: true },
{ id: 'ai.confidence', name: 'confidence', type: 'number', required: true },
],
},
{
id: 'extract',
name: 'Vytáhnout údaje',
description: 'Z volného textu získá strukturovaná data podle schématu.',
fields: ['Schéma polí', 'Text'],
},
{
id: 'generate',
name: 'Vygenerovat text',
description: 'Napíše odpověď nebo shrnutí podle instrukce.',
fields: ['Instrukce', 'Vstupní data'],
},
],
},
/**
* OpenAI je jina nez zbytek katalogu: **nebezi u nas**. Nema tedy `appId`,
@@ -2552,7 +2474,7 @@ export const services: Service[] = [
{
id: 'transform',
name: 'Transformace dat',
category: 'obecne',
category: 'transformace',
description: 'Přemapování polí, formátování a čištění dat mezi kroky.',
icon: 'Shuffle',
status: 'available',
+6 -6
View File
@@ -499,8 +499,8 @@ function seedDemoTickets(): void {
},
{
kind: 'action',
serviceId: 'ai-text',
operationId: 'classify',
serviceId: 'openai',
operationId: 'chat',
label: 'Zařazení do kategorie',
status: 'ok',
response: '{ "category": "porucha", "priority": "high", "confidence": 0.88 }',
@@ -602,8 +602,8 @@ function seedDemoTickets(): void {
},
{
kind: 'action',
serviceId: 'ai-text',
operationId: 'extract',
serviceId: 'openai',
operationId: 'chat',
label: 'Vytažení údajů z textu',
status: 'ok',
response: '{ "type": "pozadavek na zmenu", "system": "CRM + iDoklad", "urgent": false }',
@@ -684,8 +684,8 @@ function seedDemoTickets(): void {
},
{
kind: 'action',
serviceId: 'ai-text',
operationId: 'classify',
serviceId: 'openai',
operationId: 'chat',
label: 'Zařazení do kategorie',
status: 'ok',
response: '{ "category": "vypadek reportu", "priority": "normal", "confidence": 0.79 }',