From 61d950f01330d35efe97ebf54bc388956fc306df Mon Sep 17 00:00:00 2001 From: Veit Heller Date: Mon, 3 Mar 2025 12:15:26 +0100 Subject: [PATCH] Use GToolkit-specific packages for Ollama and OpenAI [feenkcom/gtoolkit#4322] --- .../GtOllamaClient.extension.st | 27 ++++++++++++++ .../GtOllamaModelsGroup.extension.st | 31 ++++++++++++++++ .../GtOllamaThreadMessageExamples.class.st | 4 +- src/Gt4Ollama/GtOllamaClient.class.st | 26 ------------- .../GtOllamaEmbeddingsGroup.class.st | 14 ------- src/Gt4Ollama/GtOllamaModel.class.st | 9 ----- src/Gt4Ollama/GtOllamaModelsGroup.class.st | 30 --------------- src/Gt4Ollama/GtOllamaProvider.class.st | 25 ------------- .../Gt4LlmHomeSection.extension.st | 2 +- .../GtLlmWardleyMapTutor.class.st | 2 +- .../GtOllamaEmbeddingsGroup.extension.st | 15 ++++++++ .../GtOllamaModel.extension.st | 10 +++++ .../GtOllamaProvider.extension.st | 26 +++++++++++++ .../GtOpenAIActionMessage.extension.st | 17 +++++++++ .../GtOpenAIAssistantProvider.extension.st | 9 +++++ .../GtOpenAIBlogPostMessage.extension.st | 15 ++++++++ .../GtOpenAIClient.extension.st | 6 +++ .../GtOpenAIEmbeddingsGroup.extension.st | 15 ++++++++ .../GtOpenAIFile.extension.st | 15 ++++++++ .../GtOpenAIFineTuningJob.extension.st | 37 +++++++++++++++++++ .../GtOpenAIProvider.extension.st | 6 +++ .../GtOpenAIThread.extension.st | 33 +++++++++++++++++ .../GtOpenAIThreadMessageExamples.class.st | 4 +- .../GtOpenAIThreadRun.extension.st | 11 ++++++ .../GtOpenAIUtilities.extension.st | 8 ++++ .../GtOpenAIWardleyMapMessage.class.st | 2 +- .../GtPharoMethodCoder.extension.st | 2 +- .../GtWardleyMapEditorContext.extension.st | 2 +- .../GtWardleyMapNodeModel.extension.st | 8 ++-- .../GtWardleyMapViewModel.extension.st | 2 +- .../LeWardleyMapSnippetViewModel.extension.st | 2 +- src/Gt4OpenAI/GtOpenAIActionMessage.class.st | 16 -------- .../GtOpenAIAssistantProvider.class.st | 5 +-- .../GtOpenAIBlogPostMessage.class.st | 14 ------- src/Gt4OpenAI/GtOpenAIClient.class.st | 7 +--- .../GtOpenAIEmbeddingsGroup.class.st | 14 ------- src/Gt4OpenAI/GtOpenAIFile.class.st | 14 ------- src/Gt4OpenAI/GtOpenAIFineTuningJob.class.st | 36 ------------------ src/Gt4OpenAI/GtOpenAIProvider.class.st | 5 --- src/Gt4OpenAI/GtOpenAIThread.class.st | 32 ---------------- src/Gt4OpenAI/GtOpenAIThreadRun.class.st | 10 ----- src/Gt4OpenAI/GtOpenAIUtilities.class.st | 7 ---- 42 files changed, 298 insertions(+), 277 deletions(-) create mode 100644 src/Gt4Ollama-GToolkit/GtOllamaClient.extension.st create mode 100644 src/Gt4Ollama-GToolkit/GtOllamaModelsGroup.extension.st rename src/{Gt4Ollama => Gt4Ollama-GToolkit}/GtOllamaThreadMessageExamples.class.st (95%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/Gt4LlmHomeSection.extension.st (97%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtLlmWardleyMapTutor.class.st (99%) create mode 100644 src/Gt4OpenAI-GToolkit/GtOllamaEmbeddingsGroup.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOllamaModel.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOllamaProvider.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIActionMessage.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIAssistantProvider.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIBlogPostMessage.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIClient.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIEmbeddingsGroup.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIFile.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIFineTuningJob.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIProvider.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIThread.extension.st rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtOpenAIThreadMessageExamples.class.st (99%) create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIThreadRun.extension.st create mode 100644 src/Gt4OpenAI-GToolkit/GtOpenAIUtilities.extension.st rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtOpenAIWardleyMapMessage.class.st (99%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtPharoMethodCoder.extension.st (87%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtWardleyMapEditorContext.extension.st (75%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtWardleyMapNodeModel.extension.st (94%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/GtWardleyMapViewModel.extension.st (82%) rename src/{Gt4OpenAI => Gt4OpenAI-GToolkit}/LeWardleyMapSnippetViewModel.extension.st (91%) diff --git a/src/Gt4Ollama-GToolkit/GtOllamaClient.extension.st b/src/Gt4Ollama-GToolkit/GtOllamaClient.extension.st new file mode 100644 index 0000000..68eff5f --- /dev/null +++ b/src/Gt4Ollama-GToolkit/GtOllamaClient.extension.st @@ -0,0 +1,27 @@ +Extension { #name : #GtOllamaClient } + +{ #category : #'*Gt4Ollama-GToolkit' } +GtOllamaClient >> initializeClient [ + | aClient | + aClient := ZnClient new. + aClient forJsonREST. + aClient timeout: 600. + ^ aClient +] + +{ #category : #'*Gt4Ollama-GToolkit' } +GtOllamaClient >> postStreaming: aString withEntity: anEntity [ + | aClient aResult | + aClient := self initializeClient + accept: 'application/jsonl,application/x-ndjson'; + contentReader: [ :entity | (NeoJSONReader on: entity readStream) upToEnd ]. + aClient url: self baseUrl / aString. + + aClient contents: anEntity. + + aResult := aClient post. + + aResult size > 0 ifTrue: [ self checkForErrors: aResult first ]. + + ^ aResult +] diff --git a/src/Gt4Ollama-GToolkit/GtOllamaModelsGroup.extension.st b/src/Gt4Ollama-GToolkit/GtOllamaModelsGroup.extension.st new file mode 100644 index 0000000..7ab3b9c --- /dev/null +++ b/src/Gt4Ollama-GToolkit/GtOllamaModelsGroup.extension.st @@ -0,0 +1,31 @@ +Extension { #name : #GtOllamaModelsGroup } + +{ #category : #'*Gt4Ollama-GToolkit' } +GtOllamaModelsGroup >> gtModelsFor: aView [ + + ^ aView columnedList + title: 'Models'; + priority: 1; + items: [ self items ]; + column: 'Name' text: #name; + column: 'Model' text: #model; + column: 'Modified at' + text: #modifiedAt + weight: 2; + column: 'Actions' + stencil: [ :aModel | + | aToolbar | + aToolbar := BrToolbar new + aptitude: (BrGlamorousToolbarAptitude new spacing: 5); + fitContent; + addItem: (BrButton new beTinySize + aptitude: BrGlamorousButtonWithIconAptitude; + icon: BrGlamorousVectorIcons inspect; + label: 'Get model information'; + action: [ aToolbar phlow spawnObject: (self client getModelInformationFor: aModel name) ]); + addItem: (BrButton new beTinySize + aptitude: BrGlamorousButtonWithIconAptitude; + icon: BrGlamorousVectorIcons cancel; + label: 'Delete model'; + action: [ self client deleteModel: aModel name ]) ] +] diff --git a/src/Gt4Ollama/GtOllamaThreadMessageExamples.class.st b/src/Gt4Ollama-GToolkit/GtOllamaThreadMessageExamples.class.st similarity index 95% rename from src/Gt4Ollama/GtOllamaThreadMessageExamples.class.st rename to src/Gt4Ollama-GToolkit/GtOllamaThreadMessageExamples.class.st index b7bdb6f..4abda73 100644 --- a/src/Gt4Ollama/GtOllamaThreadMessageExamples.class.st +++ b/src/Gt4Ollama-GToolkit/GtOllamaThreadMessageExamples.class.st @@ -1,7 +1,7 @@ Class { #name : #GtOllamaThreadMessageExamples, - #superclass : #GtLlmThreadMessageExamples, - #category : #Gt4Ollama + #superclass : #Object, + #category : #'Gt4Ollama-GToolkit' } { #category : #'as yet unclassified' } diff --git a/src/Gt4Ollama/GtOllamaClient.class.st b/src/Gt4Ollama/GtOllamaClient.class.st index 5b6df00..226f9ce 100644 --- a/src/Gt4Ollama/GtOllamaClient.class.st +++ b/src/Gt4Ollama/GtOllamaClient.class.st @@ -159,15 +159,6 @@ GtOllamaClient >> initialize [ self baseUrl: self defaultBaseUrl ] -{ #category : #accessing } -GtOllamaClient >> initializeClient [ - | aClient | - aClient := ZnClient new. - aClient forJsonREST. - aClient timeout: 600. - ^ aClient -] - { #category : #accessing } GtOllamaClient >> listModels [ ^ GtOllamaListModelsClient new @@ -193,23 +184,6 @@ GtOllamaClient >> post: aString withEntity: anEntity [ ^ self checkForErrors: aClient post ] -{ #category : #accessing } -GtOllamaClient >> postStreaming: aString withEntity: anEntity [ - | aClient aResult | - aClient := self initializeClient - accept: 'application/jsonl,application/x-ndjson'; - contentReader: [ :entity | (NeoJSONReader on: entity readStream) upToEnd ]. - aClient url: self baseUrl / aString. - - aClient contents: anEntity. - - aResult := aClient post. - - aResult size > 0 ifTrue: [ self checkForErrors: aResult first ]. - - ^ aResult -] - { #category : #accessing } GtOllamaClient >> pullModel: aString [ ^ GtOllamaPullModelClient new diff --git a/src/Gt4Ollama/GtOllamaEmbeddingsGroup.class.st b/src/Gt4Ollama/GtOllamaEmbeddingsGroup.class.st index 21debb0..f52e74f 100644 --- a/src/Gt4Ollama/GtOllamaEmbeddingsGroup.class.st +++ b/src/Gt4Ollama/GtOllamaEmbeddingsGroup.class.st @@ -24,17 +24,3 @@ GtOllamaEmbeddingsGroup >> client: aGtOllamaClient [ client := aGtOllamaClient. self items do: [ :anItem | anItem client: aGtOllamaClient ] ] - -{ #category : #accessing } -GtOllamaEmbeddingsGroup >> gtEmbeddingsFor: aView [ - - ^ aView columnedList - title: 'Embeddings'; - priority: 1; - items: [ self items withIndexCollect: [ :anItem :anIndex | anIndex -> anItem ] ]; - column: 'Index' - text: [ :aPair | aPair key asRopedText foreground: BrGlamorousColors disabledButtonTextColor ] - width: 50; - column: 'Size' text: [ :aPair | aPair value size ]; - send: #value -] diff --git a/src/Gt4Ollama/GtOllamaModel.class.st b/src/Gt4Ollama/GtOllamaModel.class.st index 7248ab6..c567b9b 100644 --- a/src/Gt4Ollama/GtOllamaModel.class.st +++ b/src/Gt4Ollama/GtOllamaModel.class.st @@ -42,15 +42,6 @@ GtOllamaModel >> digest: anObject [ digest := anObject ] -{ #category : #accessing } -GtOllamaModel >> gtDeleteModelActionFor: anAction [ - - ^ anAction button - label: 'Delete'; - icon: BrGlamorousVectorIcons cancel; - action: [ :aButton | self client deleteModel: self name ] -] - { #category : #accessing } GtOllamaModel >> gtPushModelActionFor: anAction [ diff --git a/src/Gt4Ollama/GtOllamaModelsGroup.class.st b/src/Gt4Ollama/GtOllamaModelsGroup.class.st index 3d4afd7..5a602f0 100644 --- a/src/Gt4Ollama/GtOllamaModelsGroup.class.st +++ b/src/Gt4Ollama/GtOllamaModelsGroup.class.st @@ -24,33 +24,3 @@ GtOllamaModelsGroup >> client: anObject [ self do: [ :anItem | anItem client: client ] ] - -{ #category : #accessing } -GtOllamaModelsGroup >> gtModelsFor: aView [ - - ^ aView columnedList - title: 'Models'; - priority: 1; - items: [ self items ]; - column: 'Name' text: #name; - column: 'Model' text: #model; - column: 'Modified at' - text: #modifiedAt - weight: 2; - column: 'Actions' - stencil: [ :aModel | - | aToolbar | - aToolbar := BrToolbar new - aptitude: (BrGlamorousToolbarAptitude new spacing: 5); - fitContent; - addItem: (BrButton new beTinySize - aptitude: BrGlamorousButtonWithIconAptitude; - icon: BrGlamorousVectorIcons inspect; - label: 'Get model information'; - action: [ aToolbar phlow spawnObject: (self client getModelInformationFor: aModel name) ]); - addItem: (BrButton new beTinySize - aptitude: BrGlamorousButtonWithIconAptitude; - icon: BrGlamorousVectorIcons cancel; - label: 'Delete model'; - action: [ self client deleteModel: aModel name ]) ] -] diff --git a/src/Gt4Ollama/GtOllamaProvider.class.st b/src/Gt4Ollama/GtOllamaProvider.class.st index 0b5d81c..52c4b02 100644 --- a/src/Gt4Ollama/GtOllamaProvider.class.st +++ b/src/Gt4Ollama/GtOllamaProvider.class.st @@ -26,31 +26,6 @@ GtOllamaProvider >> client: anObject [ client := anObject ] -{ #category : #'as yet unclassified' } -GtOllamaProvider >> gtModelFileFor: aView [ - - modelfile ifNil: [ ^ aView empty ]. - - ^ aView forward - title: 'Modelfile'; - priority: 1; - object: [ modelfile ]; - view: #gtContentFor:; - actionButtonIcon: BrGlamorousVectorIcons playinspect - tooltip: 'Inspect modelfile' - action: [ :aButton | aButton phlow spawnObject: modelfile ] -] - -{ #category : #'as yet unclassified' } -GtOllamaProvider >> gtTriggerAssistantActionFor: anAction [ - - ^ anAction button - priority: 1; - tooltip: 'Trigger'; - icon: BrGlamorousVectorIcons refresh; - action: [ self triggerAssistant ] -] - { #category : #'as yet unclassified' } GtOllamaProvider >> initialize [ super initialize. diff --git a/src/Gt4OpenAI/Gt4LlmHomeSection.extension.st b/src/Gt4OpenAI-GToolkit/Gt4LlmHomeSection.extension.st similarity index 97% rename from src/Gt4OpenAI/Gt4LlmHomeSection.extension.st rename to src/Gt4OpenAI-GToolkit/Gt4LlmHomeSection.extension.st index 05f15b8..854e3e3 100644 --- a/src/Gt4OpenAI/Gt4LlmHomeSection.extension.st +++ b/src/Gt4OpenAI-GToolkit/Gt4LlmHomeSection.extension.st @@ -1,6 +1,6 @@ Extension { #name : #Gt4LlmHomeSection } -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } Gt4LlmHomeSection >> apiKeyCard [ | card | diff --git a/src/Gt4OpenAI/GtLlmWardleyMapTutor.class.st b/src/Gt4OpenAI-GToolkit/GtLlmWardleyMapTutor.class.st similarity index 99% rename from src/Gt4OpenAI/GtLlmWardleyMapTutor.class.st rename to src/Gt4OpenAI-GToolkit/GtLlmWardleyMapTutor.class.st index 8bdf5b6..f71cc2e 100644 --- a/src/Gt4OpenAI/GtLlmWardleyMapTutor.class.st +++ b/src/Gt4OpenAI-GToolkit/GtLlmWardleyMapTutor.class.st @@ -1,7 +1,7 @@ Class { #name : #GtLlmWardleyMapTutor, #superclass : #GtLlmTutor, - #category : #Gt4OpenAI + #category : #'Gt4OpenAI-GToolkit' } { #category : #'as yet unclassified' } diff --git a/src/Gt4OpenAI-GToolkit/GtOllamaEmbeddingsGroup.extension.st b/src/Gt4OpenAI-GToolkit/GtOllamaEmbeddingsGroup.extension.st new file mode 100644 index 0000000..57a7459 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOllamaEmbeddingsGroup.extension.st @@ -0,0 +1,15 @@ +Extension { #name : #GtOllamaEmbeddingsGroup } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOllamaEmbeddingsGroup >> gtEmbeddingsFor: aView [ + + ^ aView columnedList + title: 'Embeddings'; + priority: 1; + items: [ self items withIndexCollect: [ :anItem :anIndex | anIndex -> anItem ] ]; + column: 'Index' + text: [ :aPair | aPair key asRopedText foreground: BrGlamorousColors disabledButtonTextColor ] + width: 50; + column: 'Size' text: [ :aPair | aPair value size ]; + send: #value +] diff --git a/src/Gt4OpenAI-GToolkit/GtOllamaModel.extension.st b/src/Gt4OpenAI-GToolkit/GtOllamaModel.extension.st new file mode 100644 index 0000000..be7a216 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOllamaModel.extension.st @@ -0,0 +1,10 @@ +Extension { #name : #GtOllamaModel } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOllamaModel >> gtDeleteModelActionFor: anAction [ + + ^ anAction button + label: 'Delete'; + icon: BrGlamorousVectorIcons cancel; + action: [ :aButton | self client deleteModel: self name ] +] diff --git a/src/Gt4OpenAI-GToolkit/GtOllamaProvider.extension.st b/src/Gt4OpenAI-GToolkit/GtOllamaProvider.extension.st new file mode 100644 index 0000000..06bd3f1 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOllamaProvider.extension.st @@ -0,0 +1,26 @@ +Extension { #name : #GtOllamaProvider } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOllamaProvider >> gtModelFileFor: aView [ + + modelfile ifNil: [ ^ aView empty ]. + + ^ aView forward + title: 'Modelfile'; + priority: 1; + object: [ modelfile ]; + view: #gtContentFor:; + actionButtonIcon: BrGlamorousVectorIcons playinspect + tooltip: 'Inspect modelfile' + action: [ :aButton | aButton phlow spawnObject: modelfile ] +] + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOllamaProvider >> gtTriggerAssistantActionFor: anAction [ + + ^ anAction button + priority: 1; + tooltip: 'Trigger'; + icon: BrGlamorousVectorIcons refresh; + action: [ self triggerAssistant ] +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIActionMessage.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIActionMessage.extension.st new file mode 100644 index 0000000..f76aed3 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIActionMessage.extension.st @@ -0,0 +1,17 @@ +Extension { #name : #GtOpenAIActionMessage } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIActionMessage >> gtTextFor: aView [ + + + self textBlock isEmptyOrNil ifTrue: [ ^ aView empty ]. + + ^ aView textEditor + title: 'Text'; + priority: 1; + styler: (BlCompositeStyler new + stylers: {GtLlmMessageStyler new + threadMessageViewModel: (GtLlmNewThreadMessageViewModel new threadMessage: GtLlmNewThreadMessage new). + GtLlmThreadMessageStyler new annotations: self annotations}); + text: [ self textBlock ] +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIAssistantProvider.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIAssistantProvider.extension.st new file mode 100644 index 0000000..fc870cf --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIAssistantProvider.extension.st @@ -0,0 +1,9 @@ +Extension { #name : #GtOpenAIAssistantProvider } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIAssistantProvider >> executeWait [ + future := (self runFuture + then: [ :aRun | + self updateMessages. + chat signalRunIsDone ]) await: GtOpenAIUtilities executionConfiguration +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIBlogPostMessage.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIBlogPostMessage.extension.st new file mode 100644 index 0000000..50a933d --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIBlogPostMessage.extension.st @@ -0,0 +1,15 @@ +Extension { #name : #GtOpenAIBlogPostMessage } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIBlogPostMessage >> gtDiffFor: aView [ + + + (self contentJson includesKey: 'Post') ifFalse: [ ^ aView empty ]. + ^ aView diff + title: 'Diff'; + priority: 2; + from: [ self chat serializer instance value asString ]; + to: [ self contentJson at: 'Post' ]; + actionButtonIcon: BrGlamorousVectorIcons accept + action: [ :b | self chat serializer instance updateContent: (self contentJson at: 'Post') ] +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIClient.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIClient.extension.st new file mode 100644 index 0000000..909c85e --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIClient.extension.st @@ -0,0 +1,6 @@ +Extension { #name : #GtOpenAIClient } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIClient class >> withApiKeyFromClipboard [ + ^ self new apiKey: Clipboard clipboardText +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIEmbeddingsGroup.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIEmbeddingsGroup.extension.st new file mode 100644 index 0000000..b3df3f6 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIEmbeddingsGroup.extension.st @@ -0,0 +1,15 @@ +Extension { #name : #GtOpenAIEmbeddingsGroup } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIEmbeddingsGroup >> gtEmbeddingsFor: aView [ + + ^ aView columnedList + title: 'Embeddings'; + priority: 1; + items: [ self items withIndexCollect: [ :anItem :anIndex | anIndex -> anItem ] ]; + column: 'Index' + text: [ :aPair | aPair key asRopedText foreground: BrGlamorousColors disabledButtonTextColor ] + width: 50; + column: 'Size' text: [ :aPair | aPair value size ]; + send: #value +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIFile.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIFile.extension.st new file mode 100644 index 0000000..f2d630b --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIFile.extension.st @@ -0,0 +1,15 @@ +Extension { #name : #GtOpenAIFile } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIFile >> gtFileFor: aView [ + + ^ aView explicit + title: 'File'; + priority: 1; + stencil: [ (self contents gtViewsFor: GtPhlowEmptyView new) + asElementDo: [ :e | + e + margin: (BlInsets all: 15); + background: Color white; + addAptitude: BrShadowAptitude ] ] +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIFineTuningJob.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIFineTuningJob.extension.st new file mode 100644 index 0000000..12f7539 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIFineTuningJob.extension.st @@ -0,0 +1,37 @@ +Extension { #name : #GtOpenAIFineTuningJob } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIFineTuningJob >> gtUpdateActionFor: anAction [ + + self client ifNil: [ ^ anAction noAction ]. + + ^ anAction button + priority: 1; + tooltip: 'Update job'; + icon: BrGlamorousVectorIcons refresh; + action: [ :aButton | aButton phlow spawnObject: (self refresh) ] +] + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIFineTuningJob >> gtViewLossFor: aView [ + + ^ aView explicit + title: 'Training loss'; + priority: 4; + stencil: [ | aData aChart | + aData := GtPlotterDataGroup new + values: ((self events reversed select: [ :anEvent | anEvent data isEmptyOrNil not ]) + collectWithIndex: [ :anEvent :anIndex | anIndex -> (anEvent data at: 'train_loss') ]); + background: BrGlamorousColors primaryBorderColor. + aChart := GtPlotterLineChart new. + aChart with: aData. + aChart valueX: #key. + aChart scaleX: GtPlotterLinearScale new. + aChart labelFormatX: [ :x | x asString ]. + aChart valueY: #value. + aChart scaleY: GtPlotterLinearScale new. + aChart labelFormatY: [ :x | x printShowingDecimalPlaces: 1 ]. + aChart ticksY: 4. + aChart asElement height: 300 ]; + actionUpdateButton +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIProvider.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIProvider.extension.st new file mode 100644 index 0000000..2f20570 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIProvider.extension.st @@ -0,0 +1,6 @@ +Extension { #name : #GtOpenAIProvider } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIProvider class >> withApiKeyFromClipboard [ + ^ self new apiKey: Clipboard clipboardText +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIThread.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIThread.extension.st new file mode 100644 index 0000000..b0ab680 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIThread.extension.st @@ -0,0 +1,33 @@ +Extension { #name : #GtOpenAIThread } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIThread >> gtMessagesFor: aView [ + + ^ aView forward + title: 'Messages'; + priority: 1; + object: [ self messages ]; + view: #gtMessagesFor:; + actionButtonIcon: BrGlamorousVectorIcons refresh + tooltip: 'Update' + action: [ :aButton :aTab | + self updateMessages. + aTab viewContentElement phlow update ] +] + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIThread >> gtWriteFor: aView [ + + ^ aView textEditor + title: 'Write'; + priority: 2; + text: [ 'Write a message here' ]; + actionButtonIcon: BrGlamorousVectorIcons play + tooltip: 'Send' + action: [ :aButton | + aButton parent parent parent parent + allChildrenBreadthFirstDetect: [ :anElement | anElement isKindOf: BrEditor ] + ifFound: [ :anEditor | + self sendMessage: anEditor text asString. + anEditor text: '' ] ] +] diff --git a/src/Gt4OpenAI/GtOpenAIThreadMessageExamples.class.st b/src/Gt4OpenAI-GToolkit/GtOpenAIThreadMessageExamples.class.st similarity index 99% rename from src/Gt4OpenAI/GtOpenAIThreadMessageExamples.class.st rename to src/Gt4OpenAI-GToolkit/GtOpenAIThreadMessageExamples.class.st index f4448c9..408408d 100644 --- a/src/Gt4OpenAI/GtOpenAIThreadMessageExamples.class.st +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIThreadMessageExamples.class.st @@ -1,7 +1,7 @@ Class { #name : #GtOpenAIThreadMessageExamples, - #superclass : #GtLlmThreadMessageExamples, - #category : #Gt4OpenAI + #superclass : #Object, + #category : #'Gt4OpenAI-GToolkit' } { #category : #'examples - messages' } diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIThreadRun.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIThreadRun.extension.st new file mode 100644 index 0000000..bc38d29 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIThreadRun.extension.st @@ -0,0 +1,11 @@ +Extension { #name : #GtOpenAIThreadRun } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIThreadRun >> gtActionReloadFor: anAction [ + + ^ anAction button + icon: BrGlamorousVectorIcons refresh; + tooltip: 'Reload'; + priority: 5; + action: [ :aButton | aButton phlow spawnObject: (self client getRun: self id forThread: self threadId) ] +] diff --git a/src/Gt4OpenAI-GToolkit/GtOpenAIUtilities.extension.st b/src/Gt4OpenAI-GToolkit/GtOpenAIUtilities.extension.st new file mode 100644 index 0000000..82168d6 --- /dev/null +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIUtilities.extension.st @@ -0,0 +1,8 @@ +Extension { #name : #GtOpenAIUtilities } + +{ #category : #'*Gt4OpenAI-GToolkit' } +GtOpenAIUtilities class >> executionConfiguration [ + ^ AsyncFutureExecutionConfiguration new + customGroup: #OpenAI; + lowPriority +] diff --git a/src/Gt4OpenAI/GtOpenAIWardleyMapMessage.class.st b/src/Gt4OpenAI-GToolkit/GtOpenAIWardleyMapMessage.class.st similarity index 99% rename from src/Gt4OpenAI/GtOpenAIWardleyMapMessage.class.st rename to src/Gt4OpenAI-GToolkit/GtOpenAIWardleyMapMessage.class.st index 6863cfb..d96648d 100644 --- a/src/Gt4OpenAI/GtOpenAIWardleyMapMessage.class.st +++ b/src/Gt4OpenAI-GToolkit/GtOpenAIWardleyMapMessage.class.st @@ -1,7 +1,7 @@ Class { #name : #GtOpenAIWardleyMapMessage, #superclass : #GtOpenAIActionMessage, - #category : #Gt4OpenAI + #category : #'Gt4OpenAI-GToolkit' } { #category : #'as yet unclassified' } diff --git a/src/Gt4OpenAI/GtPharoMethodCoder.extension.st b/src/Gt4OpenAI-GToolkit/GtPharoMethodCoder.extension.st similarity index 87% rename from src/Gt4OpenAI/GtPharoMethodCoder.extension.st rename to src/Gt4OpenAI-GToolkit/GtPharoMethodCoder.extension.st index 04767cf..17e664f 100644 --- a/src/Gt4OpenAI/GtPharoMethodCoder.extension.st +++ b/src/Gt4OpenAI-GToolkit/GtPharoMethodCoder.extension.st @@ -1,6 +1,6 @@ Extension { #name : #GtPharoMethodCoder } -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtPharoMethodCoder >> actionFormatAddOnFor: anAST into: coderAddOns [ (self behavior includesBehavior: GtLlmTutor) ifFalse: [ ^ self ]. diff --git a/src/Gt4OpenAI/GtWardleyMapEditorContext.extension.st b/src/Gt4OpenAI-GToolkit/GtWardleyMapEditorContext.extension.st similarity index 75% rename from src/Gt4OpenAI/GtWardleyMapEditorContext.extension.st rename to src/Gt4OpenAI-GToolkit/GtWardleyMapEditorContext.extension.st index 649da07..20e9a54 100644 --- a/src/Gt4OpenAI/GtWardleyMapEditorContext.extension.st +++ b/src/Gt4OpenAI-GToolkit/GtWardleyMapEditorContext.extension.st @@ -1,6 +1,6 @@ Extension { #name : #GtWardleyMapEditorContext } -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtWardleyMapEditorContext >> llm [ ^ self wardleyMapViewModel llm ] diff --git a/src/Gt4OpenAI/GtWardleyMapNodeModel.extension.st b/src/Gt4OpenAI-GToolkit/GtWardleyMapNodeModel.extension.st similarity index 94% rename from src/Gt4OpenAI/GtWardleyMapNodeModel.extension.st rename to src/Gt4OpenAI-GToolkit/GtWardleyMapNodeModel.extension.st index 0d3b287..85a3afa 100644 --- a/src/Gt4OpenAI/GtWardleyMapNodeModel.extension.st +++ b/src/Gt4OpenAI-GToolkit/GtWardleyMapNodeModel.extension.st @@ -1,6 +1,6 @@ Extension { #name : #GtWardleyMapNodeModel } -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtWardleyMapNodeModel >> menuItemNodeLlmAddNewConnectedNodeButton [ ^ GtWardleyMapNodeButtonWithLabelMenuItem new @@ -19,7 +19,7 @@ GtWardleyMapNodeModel >> menuItemNodeLlmAddNewConnectedNodeButton [ aContextMenuItem editorElement fireEvent: BrContextMenuHideWish new ] ] -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtWardleyMapNodeModel >> menuItemNodeLlmExplainItButton [ ^ GtWardleyMapNodeButtonWithLabelMenuItem new @@ -36,14 +36,14 @@ GtWardleyMapNodeModel >> menuItemNodeLlmExplainItButton [ aContextMenuItem editorElement fireEvent: BrContextMenuHideWish new ] ] -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtWardleyMapNodeModel >> menuItemNodeLlmLabel [ ^ GtWardleyMapLabelMenuItem new text: 'OpenAI:' ] -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtWardleyMapNodeModel >> menuItemNodeLlmProposeAlternativeNamesButton [ ^ GtWardleyMapNodeButtonWithLabelMenuItem new diff --git a/src/Gt4OpenAI/GtWardleyMapViewModel.extension.st b/src/Gt4OpenAI-GToolkit/GtWardleyMapViewModel.extension.st similarity index 82% rename from src/Gt4OpenAI/GtWardleyMapViewModel.extension.st rename to src/Gt4OpenAI-GToolkit/GtWardleyMapViewModel.extension.st index 2deb9a3..ce348fb 100644 --- a/src/Gt4OpenAI/GtWardleyMapViewModel.extension.st +++ b/src/Gt4OpenAI-GToolkit/GtWardleyMapViewModel.extension.st @@ -1,6 +1,6 @@ Extension { #name : #GtWardleyMapViewModel } -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } GtWardleyMapViewModel >> llm [ ^ self optionAt: #llm diff --git a/src/Gt4OpenAI/LeWardleyMapSnippetViewModel.extension.st b/src/Gt4OpenAI-GToolkit/LeWardleyMapSnippetViewModel.extension.st similarity index 91% rename from src/Gt4OpenAI/LeWardleyMapSnippetViewModel.extension.st rename to src/Gt4OpenAI-GToolkit/LeWardleyMapSnippetViewModel.extension.st index e60fe7b..a277b86 100644 --- a/src/Gt4OpenAI/LeWardleyMapSnippetViewModel.extension.st +++ b/src/Gt4OpenAI-GToolkit/LeWardleyMapSnippetViewModel.extension.st @@ -1,6 +1,6 @@ Extension { #name : #LeWardleyMapSnippetViewModel } -{ #category : #'*Gt4OpenAI' } +{ #category : #'*Gt4OpenAI-GToolkit' } LeWardleyMapSnippetViewModel >> gtActionInspectChatFor: anAction [ ^ anAction button diff --git a/src/Gt4OpenAI/GtOpenAIActionMessage.class.st b/src/Gt4OpenAI/GtOpenAIActionMessage.class.st index bb262bb..0febb22 100644 --- a/src/Gt4OpenAI/GtOpenAIActionMessage.class.st +++ b/src/Gt4OpenAI/GtOpenAIActionMessage.class.st @@ -5,19 +5,3 @@ Class { #classTraits : 'TGtActionMessage classTrait', #category : #Gt4OpenAI } - -{ #category : #'as yet unclassified' } -GtOpenAIActionMessage >> gtTextFor: aView [ - - - self textBlock isEmptyOrNil ifTrue: [ ^ aView empty ]. - - ^ aView textEditor - title: 'Text'; - priority: 1; - styler: (BlCompositeStyler new - stylers: {GtLlmMessageStyler new - threadMessageViewModel: (GtLlmNewThreadMessageViewModel new threadMessage: GtLlmNewThreadMessage new). - GtLlmThreadMessageStyler new annotations: self annotations}); - text: [ self textBlock ] -] diff --git a/src/Gt4OpenAI/GtOpenAIAssistantProvider.class.st b/src/Gt4OpenAI/GtOpenAIAssistantProvider.class.st index a47a75b..2ce5d43 100644 --- a/src/Gt4OpenAI/GtOpenAIAssistantProvider.class.st +++ b/src/Gt4OpenAI/GtOpenAIAssistantProvider.class.st @@ -248,10 +248,7 @@ GtOpenAIAssistantProvider >> sendAssistantMessage: aMessage [ chat signalRunHasUpdated. - future := (self runFuture - then: [ :aRun | - self updateMessages. - chat signalRunIsDone ]) await: GtOpenAIUtilities executionConfiguration + self executeWait ] { #category : #'as yet unclassified' } diff --git a/src/Gt4OpenAI/GtOpenAIBlogPostMessage.class.st b/src/Gt4OpenAI/GtOpenAIBlogPostMessage.class.st index 39a154b..117d2ed 100644 --- a/src/Gt4OpenAI/GtOpenAIBlogPostMessage.class.st +++ b/src/Gt4OpenAI/GtOpenAIBlogPostMessage.class.st @@ -3,17 +3,3 @@ Class { #superclass : #GtOpenAIActionMessage, #category : #Gt4OpenAI } - -{ #category : #'as yet unclassified' } -GtOpenAIBlogPostMessage >> gtDiffFor: aView [ - - - (self contentJson includesKey: 'Post') ifFalse: [ ^ aView empty ]. - ^ aView diff - title: 'Diff'; - priority: 2; - from: [ self chat serializer instance value asString ]; - to: [ self contentJson at: 'Post' ]; - actionButtonIcon: BrGlamorousVectorIcons accept - action: [ :b | self chat serializer instance updateContent: (self contentJson at: 'Post') ] -] diff --git a/src/Gt4OpenAI/GtOpenAIClient.class.st b/src/Gt4OpenAI/GtOpenAIClient.class.st index cac0ec0..838c243 100644 --- a/src/Gt4OpenAI/GtOpenAIClient.class.st +++ b/src/Gt4OpenAI/GtOpenAIClient.class.st @@ -36,11 +36,6 @@ GtOpenAIClient class >> initialize [ ApiKeyFile := self defaultApiKeyFile ] -{ #category : #accessing } -GtOpenAIClient class >> withApiKeyFromClipboard [ - ^ self new apiKey: Clipboard clipboardText -] - { #category : #accessing } GtOpenAIClient class >> withApiKeyFromFile [ ^ self new apiKey: self apiKeyFileContents @@ -78,7 +73,7 @@ GtOpenAIClient >> baseUrl: anObject [ { #category : #accessing } GtOpenAIClient >> checkForErrors: aResponse [ ((aResponse includesKey: 'error') - and: [ ((aResponse at: 'error') isKindOf: NeoJSONObject) + and: [ ((aResponse at: 'error') isKindOf: Collection) and: [ (aResponse at: 'error') includesKey: 'message' ] ]) ifTrue: [ ^ (GtOpenAIError from: (aResponse at: 'error')) signal ]. diff --git a/src/Gt4OpenAI/GtOpenAIEmbeddingsGroup.class.st b/src/Gt4OpenAI/GtOpenAIEmbeddingsGroup.class.st index 507258f..308f3b7 100644 --- a/src/Gt4OpenAI/GtOpenAIEmbeddingsGroup.class.st +++ b/src/Gt4OpenAI/GtOpenAIEmbeddingsGroup.class.st @@ -10,17 +10,3 @@ GtOpenAIEmbeddingsGroup class >> from: aList [ withAll: ((aList at: 'data') collect: [ :aModel | GtOpenAIEmbedding from: (aModel at: 'embedding') ]) ] - -{ #category : #accessing } -GtOpenAIEmbeddingsGroup >> gtEmbeddingsFor: aView [ - - ^ aView columnedList - title: 'Embeddings'; - priority: 1; - items: [ self items withIndexCollect: [ :anItem :anIndex | anIndex -> anItem ] ]; - column: 'Index' - text: [ :aPair | aPair key asRopedText foreground: BrGlamorousColors disabledButtonTextColor ] - width: 50; - column: 'Size' text: [ :aPair | aPair value size ]; - send: #value -] diff --git a/src/Gt4OpenAI/GtOpenAIFile.class.st b/src/Gt4OpenAI/GtOpenAIFile.class.st index 4cc51aa..2cd3a8f 100644 --- a/src/Gt4OpenAI/GtOpenAIFile.class.st +++ b/src/Gt4OpenAI/GtOpenAIFile.class.st @@ -61,20 +61,6 @@ GtOpenAIFile >> filename: anObject [ filename := anObject ] -{ #category : #'as yet unclassified' } -GtOpenAIFile >> gtFileFor: aView [ - - ^ aView explicit - title: 'File'; - priority: 1; - stencil: [ (self contents gtViewsFor: GtPhlowEmptyView new) - asElementDo: [ :e | - e - margin: (BlInsets all: 15); - background: Color white; - addAptitude: BrShadowAptitude ] ] -] - { #category : #accessing } GtOpenAIFile >> id [ ^ id diff --git a/src/Gt4OpenAI/GtOpenAIFineTuningJob.class.st b/src/Gt4OpenAI/GtOpenAIFineTuningJob.class.st index a3f4b46..3ffdfbc 100644 --- a/src/Gt4OpenAI/GtOpenAIFineTuningJob.class.st +++ b/src/Gt4OpenAI/GtOpenAIFineTuningJob.class.st @@ -128,42 +128,6 @@ GtOpenAIFineTuningJob >> gtEventsFor: aView [ actionUpdateButton ] -{ #category : #accessing } -GtOpenAIFineTuningJob >> gtUpdateActionFor: anAction [ - - self client ifNil: [ ^ anAction noAction ]. - - ^ anAction button - priority: 1; - tooltip: 'Update job'; - icon: BrGlamorousVectorIcons refresh; - action: [ :aButton | aButton phlow spawnObject: (self refresh) ] -] - -{ #category : #accessing } -GtOpenAIFineTuningJob >> gtViewLossFor: aView [ - - ^ aView explicit - title: 'Training loss'; - priority: 4; - stencil: [ | aData aChart | - aData := GtPlotterDataGroup new - values: ((self events reversed select: [ :anEvent | anEvent data isEmptyOrNil not ]) - collectWithIndex: [ :anEvent :anIndex | anIndex -> (anEvent data at: 'train_loss') ]); - background: BrGlamorousColors primaryBorderColor. - aChart := GtPlotterLineChart new. - aChart with: aData. - aChart valueX: #key. - aChart scaleX: GtPlotterLinearScale new. - aChart labelFormatX: [ :x | x asString ]. - aChart valueY: #value. - aChart scaleY: GtPlotterLinearScale new. - aChart labelFormatY: [ :x | x printShowingDecimalPlaces: 1 ]. - aChart ticksY: 4. - aChart asElement height: 300 ]; - actionUpdateButton -] - { #category : #accessing } GtOpenAIFineTuningJob >> id [ ^ id diff --git a/src/Gt4OpenAI/GtOpenAIProvider.class.st b/src/Gt4OpenAI/GtOpenAIProvider.class.st index ad72877..56b6b47 100644 --- a/src/Gt4OpenAI/GtOpenAIProvider.class.st +++ b/src/Gt4OpenAI/GtOpenAIProvider.class.st @@ -8,11 +8,6 @@ Class { #category : #Gt4OpenAI } -{ #category : #'as yet unclassified' } -GtOpenAIProvider class >> withApiKeyFromClipboard [ - ^ self new apiKey: Clipboard clipboardText -] - { #category : #'as yet unclassified' } GtOpenAIProvider class >> withApiKeyFromFile [ ^ self new apiKey: GtOpenAIClient apiKeyFileContents diff --git a/src/Gt4OpenAI/GtOpenAIThread.class.st b/src/Gt4OpenAI/GtOpenAIThread.class.st index d6b41ba..d2f14ec 100644 --- a/src/Gt4OpenAI/GtOpenAIThread.class.st +++ b/src/Gt4OpenAI/GtOpenAIThread.class.st @@ -31,38 +31,6 @@ GtOpenAIThread >> createdAt: anObject [ createdAt := anObject ] -{ #category : #accessing } -GtOpenAIThread >> gtMessagesFor: aView [ - - ^ aView forward - title: 'Messages'; - priority: 1; - object: [ self messages ]; - view: #gtMessagesFor:; - actionButtonIcon: BrGlamorousVectorIcons refresh - tooltip: 'Update' - action: [ :aButton :aTab | - self updateMessages. - aTab viewContentElement phlow update ] -] - -{ #category : #accessing } -GtOpenAIThread >> gtWriteFor: aView [ - - ^ aView textEditor - title: 'Write'; - priority: 2; - text: [ 'Write a message here' ]; - actionButtonIcon: BrGlamorousVectorIcons play - tooltip: 'Send' - action: [ :aButton | - aButton parent parent parent parent - allChildrenBreadthFirstDetect: [ :anElement | anElement isKindOf: BrEditor ] - ifFound: [ :anEditor | - self sendMessage: anEditor text asString. - anEditor text: '' ] ] -] - { #category : #accessing } GtOpenAIThread >> id [ ^ id diff --git a/src/Gt4OpenAI/GtOpenAIThreadRun.class.st b/src/Gt4OpenAI/GtOpenAIThreadRun.class.st index 927e94d..8a8d456 100644 --- a/src/Gt4OpenAI/GtOpenAIThreadRun.class.st +++ b/src/Gt4OpenAI/GtOpenAIThreadRun.class.st @@ -132,16 +132,6 @@ GtOpenAIThreadRun >> files [ withAll: (self fileIds collect: [ :aFileId | self client getFile: aFileId ]) ] ] -{ #category : #accessing } -GtOpenAIThreadRun >> gtActionReloadFor: anAction [ - - ^ anAction button - icon: BrGlamorousVectorIcons refresh; - tooltip: 'Reload'; - priority: 5; - action: [ :aButton | aButton phlow spawnObject: (self client getRun: self id forThread: self threadId) ] -] - { #category : #accessing } GtOpenAIThreadRun >> gtErrorFor: aView [ diff --git a/src/Gt4OpenAI/GtOpenAIUtilities.class.st b/src/Gt4OpenAI/GtOpenAIUtilities.class.st index eb561a1..a1e845c 100644 --- a/src/Gt4OpenAI/GtOpenAIUtilities.class.st +++ b/src/Gt4OpenAI/GtOpenAIUtilities.class.st @@ -3,10 +3,3 @@ Class { #superclass : #Object, #category : #Gt4OpenAI } - -{ #category : #executing } -GtOpenAIUtilities class >> executionConfiguration [ - ^ AsyncFutureExecutionConfiguration new - customGroup: #OpenAI; - lowPriority -]