This is an automated email from the ASF dual-hosted git repository.

nferraro pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git


The following commit(s) were added to refs/heads/main by this push:
     new e896dfa  add openai-classification action
e896dfa is described below

commit e896dfa5ace635f761ea6bf4ac5769534a917327
Author: nicolaferraro <[email protected]>
AuthorDate: Tue May 11 11:29:19 2021 +0200

    add openai-classification action
---
 .../kamelets/openai-classification-action.svg      |   2 +
 docs/modules/ROOT/nav.adoc                         |   1 +
 .../ROOT/pages/openai-classification-action.adoc   |  79 +++++++++++++
 openai-classification-action.kamelet.yaml          | 125 +++++++++++++++++++++
 4 files changed, 207 insertions(+)

diff --git 
a/docs/modules/ROOT/assets/images/kamelets/openai-classification-action.svg 
b/docs/modules/ROOT/assets/images/kamelets/openai-classification-action.svg
new file mode 100644
index 0000000..f742d9e
--- /dev/null
+++ b/docs/modules/ROOT/assets/images/kamelets/openai-classification-action.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="894" height="170" xmlns="http://www.w3.org/2000/svg";><path 
d="M625.55 35.22c-13.75 0-23.57 4.7-28.39 13.59l-2.59 
4.79V37.54h-22.4v97.85h23.56V77.18c0-13.91 7.55-21.89 20.73-21.89 12.56 0 19.76 
7.76 19.76 21.31v58.79h23.56v-63c0-23.26-12.8-37.17-34.23-37.17zm-114.22 
0c-27.79 0-45.06 17.33-45.06 45.25v13.74c0 26.83 17.42 43.51 45.45 43.51 18.74 
0 31.88-6.88 40.15-21l-14.61-8.39c-6.11 8.15-15.86 13.19-25.54 13.19-14.19 
0-22.67-8.76-22.67-23.44v-3.89h65.79V77.95c0-26-17.08-42.73- [...]
\ No newline at end of file
diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc
index 584c9bb..39500ad 100644
--- a/docs/modules/ROOT/nav.adoc
+++ b/docs/modules/ROOT/nav.adoc
@@ -60,6 +60,7 @@
 * xref:ROOT:minio-source.adoc[image:kamelets/minio-source.svg[] Minio Source]
 * xref:ROOT:mqtt-source.adoc[image:kamelets/mqtt-source.svg[] MQTT Source]
 * xref:ROOT:nats-source.adoc[image:kamelets/nats-source.svg[] NATS Source]
+* 
xref:ROOT:openai-classification-action.adoc[image:kamelets/openai-classification-action.svg[]
 OpenAI Classification Action]
 * 
xref:ROOT:openai-completion-action.adoc[image:kamelets/openai-completion-action.svg[]
 OpenAI Completion Action]
 * xref:ROOT:pdf-action.adoc[image:kamelets/pdf-action.svg[] PDF Action]
 * xref:ROOT:rabbitmq-source.adoc[image:kamelets/rabbitmq-source.svg[] RabbitMQ 
Source]
diff --git a/docs/modules/ROOT/pages/openai-classification-action.adoc 
b/docs/modules/ROOT/pages/openai-classification-action.adoc
new file mode 100644
index 0000000..0ae9ade
--- /dev/null
+++ b/docs/modules/ROOT/pages/openai-classification-action.adoc
@@ -0,0 +1,79 @@
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
+= image:kamelets/openai-classification-action.svg[] OpenAI Classification 
Action
+
+*Provided by: "Apache Software Foundation"*
+
+Classifies a sentence using the OpenAI API.
+
+It requires an OpenAI account (beta accounts available at 
https://beta.openai.com/).
+
+Training data for classification can be provided in advance by uploading a 
file with purpose="classifications", see: 
https://beta.openai.com/docs/api-reference/files/upload.
+
+The Kamelet accepts data in:
+- `text/plain` format (default)
+- `application/json` format: see reference at 
https://beta.openai.com/docs/api-reference/classifications/create
+
+
+== Configuration Options
+
+The following table summarizes the configuration options available for the 
`openai-classification-action` Kamelet:
+[width="100%",cols="2,^2,3,^2,^2,^3",options="header"]
+|===
+| Property| Name| Description| Type| Default| Example
+| *authorizationToken {empty}* *| Authorization Token| The authorization token 
to use to contact the openAI API| string| | 
+| engine| Engine| The OpenAI engine to use| string| `"davinci"`| 
+| file| Examples File| The ID of an uploaded file containing examples for 
classification| string| | `"file-9HbeJXxtG7pg1YTXRx1v1fmn"`
+| format| Format| The response format ('text/plain' or 'application/json' are 
supported)| string| `"text/plain"`| 
+|===
+
+NOTE: Fields marked with ({empty}*) are mandatory.
+
+== Usage
+
+This section summarizes how the `openai-classification-action` can be used in 
various contexts.
+
+=== Knative Action
+
+The `openai-classification-action` Kamelet can be used as intermediate step in 
a binding.
+
+.openai-classification-action-binding.yaml
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: KameletBinding
+metadata:
+  name: openai-classification-action-binding
+spec:
+  source:
+    ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: timer-source
+    properties:
+      message: "Hello"
+  steps:
+  - ref:
+      kind: Kamelet
+      apiVersion: camel.apache.org/v1alpha1
+      name: openai-classification-action
+    properties:
+      authorizationToken: "The Authorization Token"
+  sink:
+    ref:
+      kind: InMemoryChannel
+      apiVersion: messaging.knative.dev/v1
+      name: mychannel
+
+----
+
+Make sure you have xref:latest@camel-k::installation/installation.adoc[Camel K 
installed] into the Kubernetes cluster you're connected to.
+
+Save the `openai-classification-action-binding.yaml` file into your hard 
drive, then configure it according to your needs.
+
+You can run the action using the following command:
+
+[source,shell]
+----
+kubectl apply -f openai-classification-action-binding.yaml
+----
+// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
diff --git a/openai-classification-action.kamelet.yaml 
b/openai-classification-action.kamelet.yaml
new file mode 100755
index 0000000..51f0c0f
--- /dev/null
+++ b/openai-classification-action.kamelet.yaml
@@ -0,0 +1,125 @@
+apiVersion: camel.apache.org/v1alpha1
+kind: Kamelet
+metadata:
+  name: openai-classification-action
+  annotations:
+    camel.apache.org/kamelet.icon: 
"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iODk0IiBoZWlnaHQ9IjE3MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNjI1LjU1IDM1LjIyYy0xMy43NSAwLTIzLjU3IDQuNy0yOC4zOSAxMy41OWwtMi41OSA0Ljc5VjM3LjU0aC0yMi40djk3Ljg1aDIzLjU2Vjc3LjE4YzAtMTMuOTEgNy41NS0yMS44OSAyMC43My0yMS44OSAxMi41NiAwIDE5Ljc2IDcuNzYgMTkuNzYgMjEuMzF2NTguNzloMjMuNTZ2LTYzYzAtMjMuMjYtMTIuOC0zNy4xNy0zNC4yMy0zNy4xN3ptLTExNC4yMiAwYy0yNy
 [...]
+    camel.apache.org/provider: "Apache Software Foundation"
+    camel.apache.org/kamelet.group: "OpenAI"
+  labels:
+    camel.apache.org/kamelet.type: "action"
+spec:
+  definition:
+    title: "OpenAI Classification Action"
+    description: |
+      Classifies a sentence using the OpenAI API.
+
+      It requires an OpenAI account (beta accounts available at 
https://beta.openai.com/).
+
+      Training data for classification can be provided in advance by uploading 
a file with purpose="classifications", see: 
https://beta.openai.com/docs/api-reference/files/upload.
+
+      The Kamelet accepts data in:
+      - `text/plain` format (default)
+      - `application/json` format: see reference at 
https://beta.openai.com/docs/api-reference/classifications/create
+
+    required:
+      - authorizationToken
+    type: object
+    properties:
+      authorizationToken:
+        title: Authorization Token
+        description: The authorization token to use to contact the openAI API
+        type: string
+      format:
+        title: Format
+        description: The response format ('text/plain' or 'application/json' 
are supported)
+        type: string
+        default: text/plain
+      engine:
+        title: Engine
+        description: The OpenAI engine to use
+        type: string
+        default: davinci
+      file:
+        title: Examples File
+        description: The ID of an uploaded file containing examples for 
classification
+        type: string
+        example: "file-9HbeJXxtG7pg1YTXRx1v1fmn"
+  types:
+    in:
+      mediaType: text/plain
+    out:
+      mediaType: text/plain
+  dependencies:
+  - "github:apache.camel-kamelets:camel-kamelets-utils:main-SNAPSHOT"
+  - "camel:jackson"
+  - "camel:jsonpath"
+  - "camel:core"
+  - "camel:kamelet"
+  - "camel:http"
+  flow:
+    from:
+      uri: kamelet:source
+      steps:
+      - choice:
+          when:
+          - simple: "${header[Content-Type]} == null || 
${header[Content-Type]} == 'text/plain'"
+            steps:
+            - convert-body-to:
+                type: "java.lang.String"
+            - transform:
+                simple: "${bean:type:java.util.Map?method=of('query', 
${body})}"
+            - marshal:
+                json: {}
+      - unmarshal:
+          json: 
+            library: Jackson
+            unmarshalTypeName: com.fasterxml.jackson.databind.JsonNode
+      - choice:
+          when:
+          - simple: "${body.has('model')} == false"
+            steps:
+            - set-property:
+                name: "field"
+                constant: "model"
+            - set-property:
+                name: "value"
+                constant: "{{engine}}"
+            - bean: "org.apache.camel.kamelets.utils.transform.InsertField"
+      - set-property:
+          name: "file"
+          constant: "{{file:}}"
+      - choice:
+          when:
+          - simple: "${body.has('file')} == false && ${exchangeProperty.file} 
!= null"
+            steps:
+            - set-property:
+                name: "field"
+                constant: "file"
+            - set-property:
+                name: "value"
+                simple: "${exchangeProperty.file}"
+            - bean: "org.apache.camel.kamelets.utils.transform.InsertField"
+      - marshal:
+          json: {}
+      - set-header:
+          name: "Authorization"
+          simple: "Bearer {{authorizationToken}}"
+      - set-header:
+          name: "Content-Type"
+          constant: "application/json"
+      - to: "https://api.openai.com/v1/classifications";
+      - remove-header:
+          header-name: "Authorization"
+      - set-property:
+          name: format
+          constant: "{{format}}"
+      - choice:
+          when:
+          - simple: "${exchangeProperty.format} == 'text/plain'"
+            steps:
+            - transform:
+                jsonpath: "$.label"
+            - set-header:
+                name: "Content-Type"
+                constant: "text/plain"

Reply via email to