diff --git a/.azure/pipelines/build.yaml b/.azure/pipelines/build.yaml
index 300aef9d..98f8a28f 100644
--- a/.azure/pipelines/build.yaml
+++ b/.azure/pipelines/build.yaml
@@ -9,6 +9,31 @@ pr:
pool:
name: SkymanUbuntu2004Hosted
+parameters:
+- name: signNugetPackages
+ displayName: Sign NuGet packages
+ type: boolean
+ default: true
+- name: telemetryType
+ displayName: Telemetry to use
+ type: string
+ default: None
+ values:
+ - None
+ - Aria
+
+variables:
+- group: 'Azure AI CLI Telemetry configuration'
+- name: telemetry.type
+ # NOTE: Do NOT change the name of this variable without also updating the corresponding
+ # src\ai\.x\config\telemetry.config.json file. This name needs to be a JPath like
+ # expression to replace a specific value in that CLI telemetry JSON configuration in the
+ # FileTransform step in the BuildStage below
+ value: ${{ parameters.telemetryType }}
+- name: telemetry.aria.tenantId
+ # NOTE: Do NOT change the name of this variable without updating the telemetry JSON config
+ value: $(AriaTenantId_Release)
+
stages:
- stage: SetupStage
@@ -33,11 +58,13 @@ stages:
AICLISemVerVersion: $[ stageDependencies.SetupStage.SetupJob.outputs['Variables.AICLISemVerVersion']]
AICLINuPkgFileName: $[ stageDependencies.SetupStage.SetupJob.outputs['Variables.AICLINuPkgFileName']]
steps:
- - task: DotNetCoreCLI@2
- displayName: Restore packages
+ - task: FileTransform@1
+ displayName: 'Update telemetry configuration'
inputs:
- command: restore
- projects: 'src/ai/**/*.csproj'
+ folderPath: '$(Build.SourcesDirectory)/src/ai/.x/config'
+ fileType: json
+ targetFiles: telemetry.config.json
+ - task: NuGetAuthenticate@1
- task: DotNetCoreCLI@2
displayName: Build
inputs:
@@ -56,11 +83,12 @@ stages:
inputs:
packageType: 'sdk'
version: '2.1.x'
- - template: sign-nuget.yaml
- parameters:
- displayName: 'Sign AI CLI NuGet package'
- folderPath: '$(Build.ArtifactStagingDirectory)'
- pattern: '$(AICLINuPkgFileName)'
+ - ${{ if eq(parameters.signNugetPackages, true) }}:
+ - template: sign-nuget.yaml
+ parameters:
+ displayName: 'Sign AI CLI NuGet package'
+ folderPath: '$(Build.ArtifactStagingDirectory)'
+ pattern: '$(AICLINuPkgFileName)'
- task: Bash@3
displayName: 'Create installation script'
inputs:
diff --git a/.azure/pipelines/test_setup.yaml b/.azure/pipelines/test_setup.yaml
index 6e7645b1..1f569ed8 100644
--- a/.azure/pipelines/test_setup.yaml
+++ b/.azure/pipelines/test_setup.yaml
@@ -47,7 +47,7 @@ steps:
- bash: |
env | sort
which dotnet
- dotnet --version
+ dotnet --info
echo "TestResultsPath: $(TestResultsPath)"
mkdir $(TestResultsPath)
echo "LocalInputPath: $(LocalInputPath)"
@@ -62,6 +62,7 @@ steps:
# -----------------------------------------------------------------------------
# Build the YamlTestAdapter
# -----------------------------------------------------------------------------
+- task: NuGetAuthenticate@1
- task: DotNetCoreCLI@2
displayName: Build Test Adapters
inputs:
@@ -71,5 +72,5 @@ steps:
projects: '**/*adapter/*.csproj'
arguments:
-c $(BuildConfiguration)
- /p:Platform=x64
+ /p:Platform=AnyCPU
/p:LocalBinOutputPath="$(LocalBinOutputPath)"
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 53aba146..acbdac27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,5 @@
**/obj/*
ideas/website/node_modules/**
testresults/**
-**/launchSettings.json
\ No newline at end of file
+**/launchSettings.json
+*.user
\ No newline at end of file
diff --git a/.sscignore b/.sscignore
deleted file mode 100644
index a56e2d43..00000000
--- a/.sscignore
+++ /dev/null
@@ -1 +0,0 @@
-{ "cfs": ["CFS0013","CFS0011"] }
\ No newline at end of file
diff --git a/NuGet.config b/NuGet.config
new file mode 100644
index 00000000..123e09a1
--- /dev/null
+++ b/NuGet.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ai-cli.sln b/ai-cli.sln
index 665ad14e..69cd7b70 100644
--- a/ai-cli.sln
+++ b/ai-cli.sln
@@ -27,6 +27,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RecordedYamlTestAdapter", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "speech-extension", "src\extensions\speech_extension\speech-extension.csproj", "{CED7C805-0435-4BF7-A42F-9F3BBF14A18F}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "telemetry.aria", "src\telemetry\telemetry.aria.csproj", "{306A3CD6-91C2-450B-9995-79701CE63FE2}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{68834003-CCC2-44D7-9EA4-F9B6C65CFC99}"
+ ProjectSection(SolutionItems) = preProject
+ NuGet.config = NuGet.config
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -157,6 +164,18 @@ Global
{CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x64.Build.0 = Release|Any CPU
{CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x86.ActiveCfg = Release|Any CPU
{CED7C805-0435-4BF7-A42F-9F3BBF14A18F}.Release|x86.Build.0 = Release|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Debug|x64.Build.0 = Debug|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Debug|x86.Build.0 = Debug|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Release|x64.ActiveCfg = Release|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Release|x64.Build.0 = Release|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Release|x86.ActiveCfg = Release|Any CPU
+ {306A3CD6-91C2-450B-9995-79701CE63FE2}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ideas/notes/ai_init_flow.md b/ideas/notes/ai_init_flow.md
new file mode 100644
index 00000000..076b3ece
--- /dev/null
+++ b/ideas/notes/ai_init_flow.md
@@ -0,0 +1,320 @@
+# AI init flow
+
+This focuses on the UI that the user sees and will duplicate some shared code paths for clarity
+
+```mermaid
+flowchart
+ %% ===========================================
+ %% Subgraphs and node definitions
+ %% ===========================================
+ start([START])
+ done[[DONE]]
+
+ subgraph "VerifyProjectAsync()"
+ saved_verify_subs["`Verify subscription
+ *GET /subscriptions*`"]
+ saved_verify_project["`Verify project
+ NOTE: SAME AS Verify Project step below. See there for details`"]
+ saved_choose_saved_or_else{{Choose:
+ - Saved project
+ - Something else}}
+ end
+
+ subgraph DoInitRootMenuPick
+ top_level_choose{{"Choose:
+ - New AI Project
+ - Existing AI Project
+ - Standalone Resources
+ "}}
+
+ subgraph "DoInitRootProject(true, allowCreate, allowPick)"
+ subgraph "DoInitSubscriptionId(true)"
+ choose_subs{{"`Choose AI subscription
+ */subscriptions*`"}}
+ end
+ subgraph "DoInitProject(true, allowCreate, allowPick)"
+ subgraph "DoInitHubResource(true)"
+ newai_choose_res{{"`Choose AI resource
+ - Create new integrated
+ - Create new standalone
+ - Choose from existing
+ *../MachineLearningServices/workspaces*`"}}
+
+ subgraph "AiSdkConsoleGui.TryCreateAiHubResourceInteractive(values,subsId)"
+ newai_choose_region{{"`Choose Region
+ *GET ../locations*`"}}
+ newai_choose_resgrp{{"`Choose resource group
+ - Create new
+ - Existing
+ *GET ../resourcegroups*`"}}
+ newai_name_resgrp{{Choose resource group name}}
+ newai_create_resgrp["`Create resource group
+ TODO: unnecessarily makes REST Get regions call again
+ *PUT ../resourcegroups/{resGrp}*`"]
+ newai_choose_aires_name{{Choose AI resource name}}
+ newai_create_aires[Create AI resource]
+ end
+ end
+
+ subgraph "AiSdkConsoleGui.PickOrCreateAndConfigAiHubProject(...)"
+ newai_choose_proj_name{{Choose project name}}
+ newai_create_proj["`Create project
+ *PUT ../Microsoft.Resources/deployments/{projName}*`"]
+
+ existingai_choose_ai_proj{{"`Choose AI project
+ - ___ONLY___ Existing
+ *GET ../providers/Microsoft.MachineLearningServices/workspaces?kind=project*`"}}
+
+ verify_project["`Verify Project
+ *../Microsoft.MachineLearningServices/workspaces*
+ TODO: we already have HubId in calling method,
+ getting all is redundant
+ TODO: list connecitons already queries for single project
+ *../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}*
+ *../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}/connections*`"]
+ verify_ai_res["`Verify OpenAI resource
+ *../providers/Microsoft.CognitiveServices/accounts*`"]
+ verify_search_conn["`Verify Search Resource
+ *GET ../resourcegroups*
+ *GET ../resources?$filter=resourceType eq 'Microsoft.Search/searchServices'*
+ TODO: Should pass resource group to skip extra lookup?`"]
+
+ subgraph "AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(...)"
+ subgraph "AzCliConsoleGui.PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, 'Chat')"
+ choose_chat_deployment{{"`Choose AI chat deployment
+ - New
+ - Existing
+ - Skip
+ *../resourceGroups/{resGrp}/providers/Microsoft.CognitiveServices/accounts/{aiResName}/deployments*`"}}
+ choose_chat_model{{"`Choose AI chat model
+ This will filter out models without remamining usage
+ *GET ../providers/Microsoft.CognitiveServices/locations/{region}/models*
+ *GET ../providers/Microsoft.CognitiveServices/locations/{region}/usages*`"}}
+ name_chat_deployment{{Name AI chat deployment}}
+ create_chat_deployment["`Create AI chat deployment
+ *PUT*`"]
+ end
+ subgraph "AzCliConsoleGui.PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, 'Embeddings')"
+ choose_embed_deployment{{"`Choose AI embeddings deployment
+ - New
+ - Existing
+ - Skip
+ *../resourceGroups/{resGrp}/providers/Microsoft.CognitiveServices/accounts/{aiResName}/deployments*
+ TODO: Remove duplicated request`"}}
+ choose_embed_model{{"`Choose AI embedddings model`"}}
+ name_embed_deployment{{Name AI embeddings deployment}}
+ create_embed_deployment["`Create AI embeddings deployment
+ *PUT*`"]
+ end
+ subgraph "AzCliConsoleGui.PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, 'Evaluation')"
+ choose_eval_deployment{{"`Choose AI evaluation deployment
+ - New
+ - Existing
+ - Skip
+ *../resourceGroups/{resGrp}/providers/Microsoft.CognitiveServices/accounts/{aiResName}/deployments*
+ TODO: Remove duplicated request`"}}
+ choose_eval_model{{"`Choose AI evaluation model`"}}
+ name_eval_deployment{{Name AI evaluation deployment}}
+ create_eval_deployment["`Create AI evaluation deployment
+ *PUT*`"]
+ end
+
+ subgraph "AzCliConsoleGui.LoadCognitiveServicesResourceKeys"
+ verify_reskeys["`Verify Cognitive Services Resource keys
+ *POST ../resourceGroups/{regGrp}/providers/Microsoft.CognitiveServices/accounts/{aiServiceName}/listKeys*`"]
+ end
+
+ save_config_aiservces[Save AI Services config]
+ save_config["`Save other config
+ Excludes:
+ - services.endpoint
+ - services.key
+ - services.region
+ - speech.endpoint
+ - speech.key
+ - speech.region`"]
+ end
+
+ verify_searchkeys["`Verify search keys
+ *POST ../resourceGroups/{resGrp}/providers/Microsoft.Search/searchServices/{searchResName}/listAdminKeys*`"]
+ save_search["Save search config"]
+
+ subgraph "AiSdkConsoleGui.GetOrCreateAiHubProjectConnections(...)"
+ verify_hub_conn["`Verify hub connections
+ 1. Verify Default_AzureOpenAI connection:
+ *GET ../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}*
+ *GET ../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}/connections/Default_AzureOpenAI*
+ *POST ../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}/connections/Default_AzureOpenAI/listsecrets*
+ 2. Verify AzureAISearch connection:
+ *Get ../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}*
+ *Get ../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}/connections/AzureAISearch*
+ *POST ../resourceGroups/{resGrp}/providers/Microsoft.MachineLearningServices/workspaces/{hubName}/connections/AzureAISearch/listsecrets*
+ TODO We already have this information and have verified it earlier
+ - We have all connections already from Verify Project step
+ - Unnecessary triplicate call to get hub information
+ - Unnecessary duplicate call to /workspaces/{hubName}/connections/{connectionName}
+ - The listsecrets duplicates the information from the call without that so we can remove the intermediate step`"]
+ %% == "AiSdkConsoleGui.GetOrCreateAiHubProjectConnections(...)"
+ end
+
+ save_config_json["Save project JSON config"]
+ %% == "AiSdkConsoleGui.PickOrCreateAndConfigAiHubProject(...)"
+ end
+
+ %% == "DoInitProject(interactive, allowCreate, allowPick)"
+ end
+ %% == "DoInitRootProject(true, allowCreate, allowPick)"
+ end
+
+ subgraph "DoInitStandaloneResources"
+ standalone_choose_type{{"`Choose:
+ - AI Services v2 (OpenAI, speech, vision, search)
+ - AI Services v1 (speech, vision, language, search)
+ - Azure OpenAI
+ - Azure Search
+ - Azure Speech`"}}
+ standalone_choose_subs{{"`Choose subscription
+ NOTE: Same code as regular path`"}}
+ standalone_choose_resource{{"`Choose resource
+ - Create new
+ - Existing
+ *GET ../providers/Microsoft.CognitiveServices/accounts*`"}}
+ standalone_create_resource>"`Create standalone resource
+ TODO: INCOMPLETE`"]
+ standalone_choose_search_resource{{"`Choose AI search resource
+ *GET ../resources?$filter=resourceType eq 'Microsoft.Search%2FsearchServices'*`"}}
+ standalone_create_search_resource>"`Create search resource
+ TODO: INCOMPLETE`"]
+ standalone_choose_chat_deployment{{"`Choose chat deployment
+ NOTE: same as other but different resource name`"}}
+ standalone_choose_embed_deployment{{"`Choose embeddings deployment
+ NOTE: same as other but different resource name`"}}
+ standalone_choose_eval_deployment{{"`Choose evaluation deployment
+ NOTE: same as other but different resource name`"}}
+ standalone_verify_res_keys[Verify resource keys]
+ standalone_verify_search_keys["`Verify search keys
+ *PUT ../resourceGroups/{resgrp}/providers
+ /Microsoft.Search/searchServices/
+ {searchName}/listAdminKeys`"]
+ standalone_save_config_aiservices["`Save AI services config
+ NOTE: same as save_config_aiservces`"]
+ standalone_save_config["`Save config
+ NOTE: same as save_config`"]
+ standalone_save_config_cogsrv["Save Cognitive services config"]
+ standalone_save_config_openai["Save OpenAI config"]
+ standalone_save_config_search["Save search config"]
+ standalone_save_config_speech["Save speech config"]
+
+ %% == "DoInitStandaloneResources"
+ end
+
+ %% == "DoInitRootMenuPick"
+ end
+
+
+ %% ===========================================
+ %% Flow
+ %% ===========================================
+ start --> has_saved_config{Has saved
+ config?}
+
+ has_saved_config --Nothing saved--> top_level_choose
+ has_saved_config --Saved config--> saved_verify_subs
+ saved_verify_subs --> saved_verify_project
+ saved_verify_subs --Error--> top_level_choose
+ saved_verify_project --Error--> top_level_choose
+ saved_verify_project --> saved_choose_saved_or_else
+ saved_choose_saved_or_else --Something else--> top_level_choose
+ saved_choose_saved_or_else --"`Saved project
+ TODO: Why are we doing this again and not using saved values?`"--> choose_chat_deployment
+
+ top_level_choose --New AI project--> choose_subs
+ top_level_choose --Existing AI project--> choose_subs
+ top_level_choose --Standalone resources --> standalone_choose_type
+
+ choose_subs --New AI project--> newai_choose_res
+ choose_subs --Existing AI project--> existingai_choose_ai_proj
+
+ newai_choose_res --New integrated--> newai_choose_region
+ newai_choose_region --> newai_choose_resgrp
+ newai_choose_resgrp --> newai_name_resgrp
+
+ newai_name_resgrp --> newai_create_resgrp
+ newai_create_resgrp --> newai_choose_aires_name
+ newai_choose_aires_name --> newai_create_aires
+ newai_create_aires --> newai_choose_proj_name
+
+ newai_choose_res --Existing--> newai_choose_proj_name
+ newai_choose_proj_name --> newai_create_proj
+ newai_create_proj --> verify_project
+ verify_project --> verify_ai_res
+ verify_ai_res --> verify_search_conn
+ verify_search_conn --> choose_chat_deployment
+
+ existingai_choose_ai_proj --> verify_project
+
+ choose_chat_deployment --Existing OR skip--> choose_embed_deployment
+ choose_chat_deployment --Create new--> choose_chat_model
+ choose_chat_model --> name_chat_deployment
+ name_chat_deployment --> create_chat_deployment
+ create_chat_deployment --> choose_embed_deployment
+
+ choose_embed_deployment --Existing OR skip--> choose_eval_deployment
+ choose_embed_deployment --Create new--> choose_embed_model
+ choose_embed_model --> name_embed_deployment
+ name_embed_deployment --> create_embed_deployment
+ create_embed_deployment --> choose_eval_deployment
+
+ choose_eval_deployment --Existing OR skip--> verify_reskeys
+ choose_eval_deployment --Create new--> choose_eval_model
+ choose_eval_model --> name_eval_deployment
+ name_eval_deployment --> create_eval_deployment
+ create_eval_deployment --> verify_reskeys
+
+ verify_reskeys --Anything else--> save_config
+ verify_reskeys --AI services--> save_config_aiservces
+
+ save_config_aiservces --> verify_searchkeys
+ save_config --> verify_searchkeys
+
+ verify_searchkeys --> save_search
+ save_search --> verify_hub_conn
+ verify_hub_conn --> save_config_json
+ save_config_json--> done
+
+ newai_choose_res --"`New standalone ('OpenAI;AIServices')`"--> standalone_choose_resource
+
+ standalone_choose_type --All choices--> standalone_choose_subs
+ standalone_choose_subs --"`AI Services v2 ('AIServices')`"--> standalone_choose_resource
+ standalone_choose_subs --"`AI Services v1 ('CognitiveServices')`"--> standalone_choose_resource
+ standalone_choose_subs --"`Azure Open AI ('OpenAI;AIServices')`"--> standalone_choose_resource
+ standalone_choose_subs --Azure Search--> standalone_choose_search_resource
+ standalone_choose_subs --"`Azure Speech ('SpeechServices')`"--> standalone_choose_resource
+
+ standalone_choose_resource --Existing (AI services v2)--> standalone_choose_chat_deployment
+ standalone_choose_resource --Existing (AI services v1)--> standalone_verify_res_keys
+ standalone_choose_resource --Existing (Open AI)--> standalone_choose_chat_deployment
+ standalone_choose_resource --Existing (Azure Speech) --> standalone_verify_res_keys
+
+ standalone_choose_search_resource --Existing---> standalone_verify_search_keys
+ standalone_choose_search_resource --Create new--> standalone_create_search_resource
+
+ standalone_choose_chat_deployment --> standalone_choose_embed_deployment
+ standalone_choose_embed_deployment --> standalone_choose_eval_deployment
+ standalone_choose_eval_deployment --> standalone_verify_res_keys
+
+ standalone_verify_res_keys --AI Services v2--> standalone_save_config_aiservices
+ standalone_verify_res_keys --AI Services v1--> standalone_save_config_cogsrv
+ standalone_verify_res_keys --Open AI--> standalone_save_config
+ standalone_verify_search_keys --Azure Search--> standalone_save_config_search
+ standalone_verify_res_keys --Azure Speech--> standalone_save_config_speech
+
+ standalone_save_config_aiservices --> standalone_save_config_openai
+ standalone_save_config_cogsrv --> done
+ standalone_save_config --> standalone_save_config_openai
+ standalone_save_config_search --> done
+ standalone_save_config_speech --> done
+ standalone_save_config_openai --> done
+
+ standalone_choose_resource --Create new--> standalone_create_resource
+```
diff --git a/ideas/notes/ai_init_ui_flow_current.md b/ideas/notes/ai_init_ui_flow_current.md
new file mode 100644
index 00000000..0971d41c
--- /dev/null
+++ b/ideas/notes/ai_init_ui_flow_current.md
@@ -0,0 +1,124 @@
+# Current AI init flow
+
+```mermaid
+flowchart
+ start([START])
+ done([DONE])
+
+ start --> has_saved_config{Has saved config}
+ has_saved_config --config.json--> verify_saved_config[Verify saved config.json
+ - Verify subscription
+ - Verify AI project
+ - Verify AI hub resource]
+ verify_saved_config --> choose_saved_or_other{Choose:
+ - Saved project
+ - Something else}
+ verify_saved_config --Errors--> top_level_choose
+ choose_saved_or_other --Saved project--> choose_chat_deployment
+ choose_saved_or_other --Something else--> top_level_choose
+ has_saved_config --Nothing saved--> top_level_choose{{"Choose:
+ - New AI Project
+ - Existing AI Project
+ - Standalone Resources
+ "}}
+
+ top_level_choose --Create new--> choose_subs{{Choose subscription}}
+ top_level_choose --Existing AI project--> choose_subs
+ top_level_choose --Standalone--> standalone_choose_type{{"Choose type:
+ - AI services v2 (OpenAI, speech, vision, search)
+ - AI services v1 (Speech, vision, language, search)
+ - Azure OpenAI
+ - Azure Search
+ - Azure Speech"}}
+
+ standalone_choose_type --Any--> standalone_choose_subs{{Choose subscription}}
+ standalone_choose_subs --"AI services v2
+ (AIServices)"--> standalone_choose_res{{Choose resource
+ filtered based on type of standalone chosen}}
+ standalone_choose_subs --"AI services v1
+ (CognitiveServices)"---> standalone_choose_res
+ standalone_choose_subs --"Azure OpenAI
+ (OpenAI;AIServices)"--> standalone_choose_res
+ standalone_choose_subs --"Azure Speech
+ (SpeechServices)"--> standalone_choose_res
+ standalone_choose_subs --Azure Search--> standalone_choose_search_res{{Choose search resource}}
+
+ standalone_choose_res --Existing AI services v2--> choose_chat_deployment
+ standalone_choose_res --Existing OpenAI--> choose_chat_deployment
+ standalone_choose_res --Existing AI services v1--> load_cogsvc_keys
+ standalone_choose_res --Existing Azure Speech--> load_cogsvc_keys
+ standalone_choose_res --Create new--> create_standalone_res>Create standalone resource
+ TODO INCOMPLETE]
+
+ standalone_choose_search_res --Existing--> standalone_load_search_keys[Load search keys]
+ standalone_load_search_keys --> save_config
+ standalone_choose_search_res --Create new--> create_standalone_res_search>Create standalone search resource
+ TODO INCOMPLETE]
+
+ choose_subs --New AI project--> choose_ai_res{{Choose AI hub resource
+ - Create new integrated
+ - Create new standalone
+ - Existing}}
+ choose_subs --Existing AI project--> choose_existing_ai_proj{{Choose existing AI project}}
+
+ choose_ai_res --New integrated--> choose_region{{Choose Azure region}}
+ choose_ai_res --Existing--> choose_ai_proj_name{{Choose AI project}}
+ choose_ai_res --"New standalone
+ (OpenAI;AIServices)"--> standalone_choose_res
+
+ choose_region --> choose_res_group{{Choose resource group
+ - Create new
+ - Existing}}
+
+ choose_res_group --Create new--> choose_reg_group_name{{Choose resource group name}}
+ choose_res_group --Existing--> choose_ai_res_name{{Choose AI hub resource name}}
+
+ choose_reg_group_name --> create_res_group[Create resource group]
+ create_res_group --> choose_ai_res_name
+ choose_ai_res_name --> create_ai_res[Create AI hub resource]
+ create_ai_res --> choose_ai_proj_name{{Choose AI project name}}
+
+ choose_ai_proj_name --> create_ai_proj[Create AI project]
+ create_ai_proj --> verify_ai_proj
+
+ choose_existing_ai_proj --> verify_ai_proj[Verify AI project]
+ verify_ai_proj --> verify_ai_res[Verify AI hub resource]
+ verify_ai_res --> verify_ai_search_res[Verify AI search resource]
+ verify_ai_search_res --> choose_chat_deployment{{Choose chat deployment
+ - Create new
+ - Existing
+ - Skip}}
+
+ choose_chat_deployment --Existing OR skip --> choose_embed_deployment{{Choose embeddings deployment
+ - Create new
+ - Existing
+ - Skip}}
+ choose_chat_deployment --Create new--> choose_chat_model{{Choose chat model}}
+ choose_chat_model --> name_chat_deployment{{Name chat deployment}}
+ name_chat_deployment --> create_chat_deployment{{Create chat deployment}}
+ create_chat_deployment --> choose_embed_deployment
+
+ choose_embed_deployment --Existing OR skip--> choose_eval_deployment{{Choose evaluation deployment
+ - Create new
+ - Existing
+ - Skip}}
+ choose_embed_deployment --Create new--> choose_embed_model{{Choose embeddings model}}
+ choose_embed_model --> name_embed_deployment{{Name embeddings deployment}}
+ name_embed_deployment --> create_embed_deployment[Create embeddings deployment]
+ create_embed_deployment --> choose_eval_deployment
+
+ choose_eval_deployment --Existing OR skip --> load_cogsvc_keys[Load Cognitive services keys]
+ choose_eval_deployment --Create new--> choose_eval_model{{Choose evaluation model}}
+ choose_eval_model --> name_eval_deployment{{Name evaluation deployment}}
+ name_eval_deployment --> create_eval_deployment[Create evaluation deployment]
+ create_eval_deployment --> load_cogsvc_keys
+
+ load_cogsvc_keys --> save_config["`Save configuration
+ **Multuple variations
+ depending on type**`"]
+
+ save_config --AI Hub or project
+ but **NOT** standalone--> create_config_json[Create config.json]
+ save_config --> done
+ create_config_json --> done
+```
diff --git a/ideas/notes/ai_init_ui_flow_proposed.md b/ideas/notes/ai_init_ui_flow_proposed.md
new file mode 100644
index 00000000..60d88c9b
--- /dev/null
+++ b/ideas/notes/ai_init_ui_flow_proposed.md
@@ -0,0 +1,110 @@
+# New AI streamlined AI init flow
+
+```mermaid
+flowchart
+ start([START])
+ done([DONE])
+ failed([**FAILED**])
+
+ start --> has_saved_config{Has saved config}
+ has_saved_config --Has saved--> show_saved_config[Show saved config]
+ has_saved_config --Nothing saved--> choose_subs
+
+ show_saved_config --> choose_saved_or_other{Choose:
+ - Saved project
+ - Change
+ - Reset}
+
+ choose_saved_or_other --Reset--> reset_config[Reset saved config] --> done
+ choose_saved_or_other --Saved--> verify_config[Verify saved config.json
+ - Verify subscription
+ - Verify AI project
+ - Verify AI hub resource]
+ choose_saved_or_other --Change--> choose_subs{{Choose subscription}}
+
+ choose_subs --> choose_res{{"`Choose resource
+ - Create new
+ - Select from existing:
+ * Azure AI project (preferred)
+ * Azure AI hub resource,
+ * Azure AI services v2 (with Open AI)
+ * Azure OpenAI,
+ * Cognitive Services resource (aka Azure AI services v1)
+ * Speech resoure
+ * Search resource
+ ___________________________________________________________________
+ *NOTES:
+ - Since an AI hub resource will package up multiple resources into one, the list will be filtered to include just the hub resource
+ - Any previously saved options will be 'selected'*`"}}
+
+ choose_res --Existing Cognitive Services,
+ OR speech,
+ OR search--> verify_config
+ choose_res --Existing AI project,
+ OR Azure AI service (v2),
+ OR Azure OpenAI--> choose_chat_deployment{{Choose chat deployment
+ - New
+ - Existing
+ - Skip}}
+ choose_res --Existing AI hub resource--> choose_ai_proj{{Choose AI project
+ - New
+ - Existing}}
+ choose_res --New--> choose_res_type{{"Choose resource type
+ - [Recommended] Azure AI Hub resource
+ - Azure AI services (v2)
+ - Azure OpenAI
+ - Cognitive services
+ - Speech
+ - Source"}}
+
+ choose_ai_proj --Existing--> choose_chat_deployment
+ choose_ai_proj --New--> choose_ai_proj_name{{Choose AI project name}}
+ choose_ai_proj_name --> create_ai_proj[Create AI project]
+ create_ai_proj --> choose_chat_deployment
+
+ choose_chat_deployment --Existing OR skip --> choose_embed_deployment{{Choose embeddings deployment
+ - Create new
+ - Existing
+ - Skip}}
+ choose_chat_deployment --Create new--> choose_chat_model{{Choose chat model}}
+ choose_chat_model --> name_chat_deployment{{Name chat deployment}}
+ name_chat_deployment --> create_chat_deployment{{Create chat deployment}}
+ create_chat_deployment --> choose_embed_deployment
+
+ choose_embed_deployment --Existing OR skip--> choose_eval_deployment{{Choose evaluation deployment
+ - Create new
+ - Existing
+ - Skip}}
+ choose_embed_deployment --Create new--> choose_embed_model{{Choose embeddings model}}
+ choose_embed_model --> name_embed_deployment{{Name embeddings deployment}}
+ name_embed_deployment --> create_embed_deployment[Create embeddings deployment]
+ create_embed_deployment --> choose_eval_deployment
+
+ choose_eval_deployment --Existing OR skip --> verify_config
+ choose_eval_deployment --Create new--> choose_eval_model{{Choose evaluation model}}
+ choose_eval_model --> name_eval_deployment{{Name evaluation deployment}}
+ name_eval_deployment --> create_eval_deployment[Create evaluation deployment]
+ create_eval_deployment --> verify_config
+
+ choose_res_type --> choose_res_group{{Choose resource group
+ - Create new
+ - Existing}}
+ choose_res_group --Existing--> choose_res_name{{Choose resource name}}
+ choose_res_group --New--> choose_region{{Choose Azure region}}
+
+ choose_res_name --> create_res[Create resource]
+ choose_region --> choose_res_group_name{{Choose resource group name}}
+ choose_res_group_name --> create_res_group[Create resource group]
+ create_res_group --> choose_res_name
+
+ create_res --Azure AI hub--> choose_ai_proj_name
+ create_res --Azure AI services (v2)
+ OR Azure OpenAI--> choose_chat_deployment
+ create_res --Cognitive services
+ OR Speech
+ Or Search--> verify_config
+
+ verify_config --Valid--> save_config[Save configuration]
+ verify_config --Errors--> failed
+ save_config --> done
+```
diff --git a/src/ai/.x/config/telemetry.config.json b/src/ai/.x/config/telemetry.config.json
new file mode 100644
index 00000000..1e977fc6
--- /dev/null
+++ b/src/ai/.x/config/telemetry.config.json
@@ -0,0 +1,8 @@
+{
+ "telemetry": {
+ "type": "aria",
+ "aria": {
+ "tenantId": "0c1e132789d0471fa2185d5d98f57250-d20914c4-0625-446f-b444-36afc3c68eab-7293"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ai/NuGet.Config b/src/ai/NuGet.Config
deleted file mode 100644
index 2a1e0af7..00000000
--- a/src/ai/NuGet.Config
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/ai/Program_AI.cs b/src/ai/Program_AI.cs
index e93e73c7..82abe03d 100644
--- a/src/ai/Program_AI.cs
+++ b/src/ai/Program_AI.cs
@@ -4,46 +4,67 @@
//
using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
-using System.Reflection;
-using System.Runtime.InteropServices;
-using System.Text;
using System.Threading.Tasks;
-// using Azure.AI.OpenAI;
+using Azure.AI.Details.Common.CLI.Telemetry;
+using Azure.AI.Details.Common.CLI.Telemetry.Events;
+
namespace Azure.AI.Details.Common.CLI
{
public class AiProgram
{
- static int Main(string[] args)
+ static async Task Main(string[] args)
{
- var debug = args.Length > 0 && args[0] == "debug";
+ IProgramData data = null;
+ Stopwatch stopwatch = new Stopwatch();
+ int exitCode = int.MinValue;
- if (debug) StartStopWatch();
- var result = Program.Main(new AiProgramData(), args);
- if (debug) StopStopWatch();
+ try
+ {
+ bool isDebug = args.Length > 0 && args[0] == "debug";
+ if (isDebug)
+ {
+ Console.WriteLine($"StopWatch: Started at {DateTime.Now}");
+ }
- return result;
- }
+ stopwatch.Start();
- static void StartStopWatch()
- {
- Console.WriteLine($"StopWatch: Started at {DateTime.Now}");
- _stopwatch = new Stopwatch();
- _stopwatch.Start();
- }
+ data = new AiProgramData();
+ exitCode = Program.Main(data, args);
+ stopwatch.Stop();
- static void StopStopWatch()
- {
- _stopwatch.Stop();
- Console.WriteLine($"StopWatch: Stopped at {DateTime.Now} ({GetStopWatchElapsedAsString()})");
+ if (isDebug)
+ {
+ Console.WriteLine($"StopWatch: Stopped at {DateTime.Now} ({GetStopWatchElapsedAsString(stopwatch.Elapsed)})");
+ }
+
+ return exitCode;
+ }
+ catch (Exception)
+ {
+ exitCode = -1;
+ throw;
+ }
+ finally
+ {
+ if (data?.Telemetry != null)
+ {
+ data.Telemetry.LogEvent(new ExitedTelemetryEvent()
+ {
+ ExitCode = exitCode,
+ Elapsed = stopwatch.Elapsed
+ });
+
+ await data.Telemetry.DisposeAsync()
+ .ConfigureAwait(false);
+ }
+ }
}
- static string GetStopWatchElapsedAsString()
+ static string GetStopWatchElapsedAsString(TimeSpan elapsed)
{
- var elapsed = _stopwatch.Elapsed;
var elapsedMilliseconds = elapsed.TotalMilliseconds;
var elapsedSeconds = elapsed.TotalSeconds;
var elapsedMinutes = elapsed.TotalMinutes;
@@ -56,12 +77,19 @@ static string GetStopWatchElapsedAsString()
return elapsedString;
}
-
- static Stopwatch _stopwatch = null;
}
public class AiProgramData : IProgramData
{
+ private readonly Lazy _telemetry;
+
+ public AiProgramData()
+ {
+ _telemetry = new Lazy(
+ () => TelemetryHelpers.InstantiateFromConfig(this),
+ System.Threading.LazyThreadSafetyMode.ExecutionAndPublication);
+ }
+
#region name data
public string Name => "ai";
public string DisplayName => "Azure AI CLI";
@@ -247,5 +275,6 @@ public bool DisplayKnownErrors(ICommandValues values, Exception ex)
}
public IEventLoggerHelpers EventLoggerHelpers => new AiEventLoggerHelpers();
+ public ITelemetry Telemetry => _telemetry.Value;
}
}
diff --git a/src/ai/ai-cli.csproj b/src/ai/ai-cli.csproj
index cdced666..cc598f34 100644
--- a/src/ai/ai-cli.csproj
+++ b/src/ai/ai-cli.csproj
@@ -137,6 +137,7 @@
+
diff --git a/src/ai/commands/scenario_wizard_command.cs b/src/ai/commands/scenario_wizard_command.cs
index 01735cb9..f2654be4 100644
--- a/src/ai/commands/scenario_wizard_command.cs
+++ b/src/ai/commands/scenario_wizard_command.cs
@@ -116,7 +116,7 @@ private async Task ChatWithYourDataScenarioAsync(string scenario)
StartCommand();
var subscription = await AzCliConsoleGui.PickSubscriptionAsync(true, true);
- var openAiResource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(true, false, subscription.Id);
+ var openAiResource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(null, true, false, subscription.Id);
var cogSearchResource = await AzCliConsoleGui.PickOrCreateAndConfigCogSearchResource(false, subscription.Id, openAiResource.RegionLocation, openAiResource.Group);
// var aiHubResource = await AiSdkConsoleGui.PickOrCreateAiHubResource(_values, subscription.Id);
// var aiHubProject = AiSdkConsoleGui.PickOrCreateAndConfigAiHubProject(true, true, _values, subscription.Id, aiHubResource.Id, openAiResource.Group, openAiResource.Endpoint, openAiResource.Key, cogSearchResource.Endpoint, cogSearchResource.Key);
diff --git a/src/ai/helpers/telemetry_helper.cs b/src/ai/helpers/telemetry_helper.cs
new file mode 100644
index 00000000..92622f19
--- /dev/null
+++ b/src/ai/helpers/telemetry_helper.cs
@@ -0,0 +1,111 @@
+using System;
+using System.Text;
+using System.Text.Json;
+using Azure.AI.Details.Common.CLI.Telemetry;
+
+#if RELEASE
+ #pragma warning disable CS0168 // Variable is declared but never used
+#endif
+
+namespace Azure.AI.Details.Common.CLI
+{
+ class TelemetryHelpers
+ {
+ private static readonly JsonSerializerOptions JSON_OPTIONS = new()
+ {
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase
+ };
+
+ internal static ITelemetry Instantiate(TelemetryConfig config, IProgramData programData)
+ {
+ try
+ {
+ switch (config.Type)
+ {
+ case "none":
+ default:
+ return NoOpTelemetry.Instance;
+ case "aria":
+ return new AriaTelemetry(config.Aria.TenantId, programData);
+ }
+ }
+ catch (Exception ex)
+ {
+#if DEBUG
+ ErrorHelpers.WriteLineMessage(
+ "WARNING:", "Failed to instantiate telemetry", ex.Message);
+#endif
+ return NoOpTelemetry.Instance;
+ }
+ }
+
+ internal static ITelemetry InstantiateFromConfig(IProgramData programData, string telemetryConfig = "telemetry.config.json", INamedValues values = null)
+ {
+ // ignore failures
+ TryParseConfigFile(telemetryConfig, values, out TelemetryConfig config);
+
+ return Instantiate(config, programData);
+ }
+
+ internal static bool TryParseConfigFile(string fileName, INamedValues values, out TelemetryConfig config)
+ {
+ config = new TelemetryConfig();
+
+ try
+ {
+ if (string.IsNullOrWhiteSpace(fileName))
+ {
+ return false;
+ }
+
+ /*
+ * NOTE:
+ * =====================
+ * The checked in telemetry.config.json is only used while debugging. As part of the CI/CD pipeline
+ * this is modified to use a different configuration using the FileTransform Azure DevOps task. This
+ * works by substituing JSON values using variables in JPath format. See here for more information:
+ * https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/file-transform-v2
+ */
+ string path = FileHelpers.FindFileInConfigPath(fileName, values);
+ if (string.IsNullOrWhiteSpace(path))
+ {
+ return false;
+ }
+
+ string jsonConfig = FileHelpers.ReadAllText(path, Encoding.UTF8);
+ var wrapper = JsonSerializer.Deserialize(jsonConfig, JSON_OPTIONS);
+ config = wrapper.Telemetry;
+ return true;
+ }
+ catch (Exception ex)
+ {
+#if DEBUG
+ ErrorHelpers.WriteLineMessage(
+ "WARNING:", "Failed to load telemetry config", ex.Message);
+#endif
+ return false;
+ }
+ }
+
+ public readonly struct TelemetryConfig
+ {
+ public string Type { get; init; }
+
+ public AriaTelemetryConfig Aria { get; init; }
+
+ public readonly struct AriaTelemetryConfig
+ {
+ public string TenantId { get; init; }
+ }
+ }
+
+ private readonly struct TelemetryConfigWrapper
+ {
+ public TelemetryConfig Telemetry { get; init; }
+ }
+ }
+}
+
+#if RELEASE
+ #pragma warning restore CS0168 // Variable is declared but never used
+#endif
diff --git a/src/common/IProgramData.cs b/src/common/IProgramData.cs
index dfa02a16..504f8386 100644
--- a/src/common/IProgramData.cs
+++ b/src/common/IProgramData.cs
@@ -3,8 +3,7 @@
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
-using System;
-// using Azure.AI.OpenAI;
+using Azure.AI.Details.Common.CLI.Telemetry;
namespace Azure.AI.Details.Common.CLI
{
@@ -50,5 +49,7 @@ public interface IProgramData
bool DisplayKnownErrors(ICommandValues values, Exception ex);
IEventLoggerHelpers EventLoggerHelpers { get; }
+
+ ITelemetry Telemetry { get; }
}
}
diff --git a/src/common/Program.cs b/src/common/Program.cs
index 0eb74797..1b43d448 100644
--- a/src/common/Program.cs
+++ b/src/common/Program.cs
@@ -3,15 +3,11 @@
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
using System.Reflection;
-using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
+using Azure.AI.Details.Common.CLI.Telemetry;
+using Azure.AI.Details.Common.CLI.Telemetry.Events;
using System.Threading.Tasks;
namespace Azure.AI.Details.Common.CLI
@@ -27,6 +23,8 @@ public static int Main(IProgramData data, string[] mainArgs)
{
_data = data;
+ Program.Telemetry.LogEvent(new LaunchedTelemetryEvent());
+
var screen = ConsoleGui.Screen.Current;
Console.OutputEncoding = Encoding.UTF8;
Console.CancelKeyPress += (s, e) =>
@@ -41,7 +39,7 @@ public static int Main(IProgramData data, string[] mainArgs)
ICommandValues values = new CommandValues();
INamedValueTokens tokens = new CmdLineTokenSource(mainArgs, values);
- var exitCode = ParseCommand(tokens, values);
+ int exitCode = ParseCommand(tokens, values);
if (exitCode == 0 && !values.DisplayHelpRequested())
{
if (!values.DisplayVersionRequested() && !values.DisplayUpdateRequested())
@@ -396,14 +394,47 @@ private static void TryCatchErrorOrException(ICommandValues values, Action actio
private static bool RunCommand(ICommandValues values)
{
- bool passed = false;
+ string errorInfo = null;
+ var outcome = Outcome.Unknown;
- TryCatchErrorOrException(values, () =>
+ try
+ {
+ bool success = CommandRunDispatcher.DispatchRunCommand(values);
+ if (success)
+ {
+ outcome = Outcome.Success;
+ }
+ else
+ {
+ outcome = Outcome.Failed;
+ errorInfo = $"Failed while running '{values.GetCommand()}' command";
+ }
+ }
+ catch (OperationCanceledException ex)
{
- passed = CommandRunDispatcher.DispatchRunCommand(values);
- });
+ errorInfo = "Timed out";
+ outcome = Outcome.TimedOut;
- return passed;
+ DisplayErrorOrException(values, ex);
+ }
+ catch (Exception ex)
+ {
+ errorInfo = ex.Message;
+ outcome = Outcome.Failed;
+
+ DisplayErrorOrException(values, ex);
+ }
+ finally
+ {
+ _data?.Telemetry?.LogEvent(new CommandTelemetryEvent()
+ {
+ Type = values.GetCommand("unknown"),
+ Outcome = outcome,
+ ErrorInfo = errorInfo
+ });
+ }
+
+ return outcome == Outcome.Success;
}
private static IProgramData _data;
@@ -448,5 +479,7 @@ private static bool RunCommand(ICommandValues values)
public static bool DisplayKnownErrors(ICommandValues values, Exception ex) => _data != null && _data.DisplayKnownErrors(values, ex);
public static IEventLoggerHelpers EventLoggerHelpers => _data?.EventLoggerHelpers;
+
+ public static ITelemetry Telemetry => _data.Telemetry;
}
}
diff --git a/src/common/Telemetry/Events/CommandTelemetryEvent.cs b/src/common/Telemetry/Events/CommandTelemetryEvent.cs
new file mode 100644
index 00000000..cbbad801
--- /dev/null
+++ b/src/common/Telemetry/Events/CommandTelemetryEvent.cs
@@ -0,0 +1,18 @@
+#nullable enable
+
+using System.Diagnostics;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry.Events
+{
+ [DebuggerDisplay("{Name}: {Outcome} {Type}")]
+ public readonly struct CommandTelemetryEvent : ITelemetryEvent
+ {
+ public string Name => "Command";
+
+ public string Type { get; init; }
+
+ public Outcome Outcome { get; init; }
+
+ public string? ErrorInfo { get; init; }
+ }
+}
diff --git a/src/common/Telemetry/Events/ExitedTelemetryEvent.cs b/src/common/Telemetry/Events/ExitedTelemetryEvent.cs
new file mode 100644
index 00000000..985e895d
--- /dev/null
+++ b/src/common/Telemetry/Events/ExitedTelemetryEvent.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry.Events
+{
+ [DebuggerDisplay("{Name}: {ExitCode}")]
+ public readonly struct ExitedTelemetryEvent : ITelemetryEvent
+ {
+ public string Name => "exited";
+
+ public int ExitCode { get; init; }
+
+ public TimeSpan? Elapsed { get; init; }
+ }
+}
diff --git a/src/common/Telemetry/Events/InitTelemetryEvent.cs b/src/common/Telemetry/Events/InitTelemetryEvent.cs
new file mode 100644
index 00000000..27f169b6
--- /dev/null
+++ b/src/common/Telemetry/Events/InitTelemetryEvent.cs
@@ -0,0 +1,119 @@
+using System.Diagnostics;
+using System.Text;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry.Events
+{
+ ///
+ /// What step of the init command we are in
+ ///
+ public enum InitStage
+ {
+ ///
+ /// The user has made a selection
+ ///
+ Choice,
+
+ ///
+ /// The user has chosen a subscription
+ ///
+ Subscription,
+
+ ///
+ /// The user has chosen a resource. Refer to the property to see
+ /// which kind of resource was selected
+ ///
+ Resource,
+
+ ///
+ /// (Optional) The user has chosen an AI project
+ ///
+ Project,
+
+ ///
+ /// (Optional) The user has made a choice regarding a chat deployment.
+ /// property to see what was chosen (e.g. new, existing, skip)
+ ///
+ Chat,
+
+ ///
+ /// (Optional) The user has made a choice regarding an embedding deployment.
+ /// property to see what was chosen (e.g. new, existing, skip)
+ ///
+ Embeddings,
+
+ ///
+ /// (Optional) The user has made a choice regarding an evaluation deployment.
+ /// property to see what was chosen (e.g. new, existing, skip)
+ ///
+ Evaluation,
+
+ ///
+ /// (Optional) Connections have been verified or new ones have been created
+ ///
+ Connections,
+
+ ///
+ /// (Optional) We have successfully saved the configuration
+ ///
+ Save
+ }
+
+ ///
+ /// Represents details about the init command. This is used to generate (pseudo-)funnels in the dashboards to get an
+ /// idea of where end users are encountering issues or giving up
+ ///
+ [DebuggerDisplay("{Name}: {Stage} {Outcome} {Selected}")]
+ public readonly struct InitTelemetryEvent : ITelemetryEvent
+ {
+ ///
+ /// Creates a new instance
+ ///
+ ///
+ public InitTelemetryEvent(InitStage stage)
+ {
+ Stage = stage;
+ }
+
+ ///
+ /// The name of this event
+ ///
+ public string Name => "init.stage";
+
+ ///
+ /// The stage in the init process
+ ///
+ public InitStage Stage { get; }
+
+ ///
+ /// A unique identifier for this particular run of the init command. This can be used to uniquely identify
+ /// a single sequence of events
+ ///
+ public string RunId { get; init; }
+
+ ///
+ /// The type of init run we are doing. Due to subtle differences in the various options, there are currently
+ /// 3 kinds: new, existing, standalone_{resType}
+ ///
+ public string RunType { get; init; }
+
+ ///
+ /// The outcome of this step
+ ///
+ public Outcome Outcome { get; init; }
+
+ ///
+ /// (Optional) Some additional information about what was selected (e.g. new, existing, skipped)
+ ///
+ public string Selected { get; init; }
+
+ ///
+ /// How long the user spent in that particular stage
+ ///
+ public double DurationInMs { get; init; }
+
+ ///
+ /// (Optional) Any error information encountered that lead to a failed outcome
+ ///
+ public string Error { get; init; }
+ }
+}
diff --git a/src/common/Telemetry/Events/LaunchedTelemetryEvent.cs b/src/common/Telemetry/Events/LaunchedTelemetryEvent.cs
new file mode 100644
index 00000000..4cf013ef
--- /dev/null
+++ b/src/common/Telemetry/Events/LaunchedTelemetryEvent.cs
@@ -0,0 +1,10 @@
+using System.Diagnostics;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry.Events
+{
+ [DebuggerDisplay("{Name}")]
+ public readonly struct LaunchedTelemetryEvent : ITelemetryEvent
+ {
+ public string Name => "launched";
+ }
+}
diff --git a/src/common/Telemetry/Events/VerifySavedConfigTelemetryEvent.cs b/src/common/Telemetry/Events/VerifySavedConfigTelemetryEvent.cs
new file mode 100644
index 00000000..5b04a8d4
--- /dev/null
+++ b/src/common/Telemetry/Events/VerifySavedConfigTelemetryEvent.cs
@@ -0,0 +1,18 @@
+using System.Diagnostics;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry.Events
+{
+ [DebuggerDisplay("{Name}: {Outcome} {Detail}")]
+ public struct VerifySavedConfigTelemetryEvent : ITelemetryEvent
+ {
+ public string Name => "verify_saved";
+
+ public Outcome Outcome { get; init; }
+
+ public string Detail { get; init; }
+
+ public string Error { get; init; }
+
+ public double DurationInMs { get; init; }
+ }
+}
diff --git a/src/common/Telemetry/ITelemetry.cs b/src/common/Telemetry/ITelemetry.cs
new file mode 100644
index 00000000..80497b90
--- /dev/null
+++ b/src/common/Telemetry/ITelemetry.cs
@@ -0,0 +1,326 @@
+using System.Diagnostics;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry
+{
+ ///
+ /// Bases interface for telemetry events
+ ///
+ public interface ITelemetryEvent
+ {
+ ///
+ /// The name of the telemetry event (e.g. init.stage)
+ ///
+ string Name { get; }
+ }
+
+ ///
+ /// The base interface for telemetry implementations
+ ///
+ public interface ITelemetry : IAsyncDisposable
+ {
+ ///
+ /// Logs a telemetry event
+ ///
+ /// The event to log
+ void LogEvent(ITelemetryEvent evt);
+ }
+
+ ///
+ /// Helper methods to make working with telemetry easier
+ ///
+ [DebuggerStepThrough]
+ public static class TelemetryExtensions
+ {
+ #region delegates
+
+ ///
+ /// Creates a telemetry event
+ ///
+ /// The outcome of the function or work
+ /// Any caught exceptions. This can be null
+ /// How long the function or work took
+ /// The telemetry event to raise, or null to not raise an event
+ public delegate ITelemetryEvent CreateTelemetryEvent(
+ Outcome outcome, Exception exception, TimeSpan duration);
+
+ ///
+ /// Creates a telemetry event
+ ///
+ ///
+ /// The outcome of the function or work
+ /// The result of the function or work
+ /// Any caught exceptions. This can be null
+ /// How long the function or work took
+ /// The telemetry event to raise, or null to not raise an event
+ public delegate ITelemetryEvent CreateTelemetryEvent(
+ Outcome outcome, TResult result, Exception exception, TimeSpan duration);
+
+ #endregion
+
+ #region Async wrappers
+
+ ///
+ /// Wraps an asynchronous task with telemetry
+ ///
+ /// The telemetry instance to use
+ /// The async function to call
+ /// The method to call to create the telemetry event
+ /// Asynchronous task
+ public static Task WrapAsync(
+ this ITelemetry telemetry,
+ Func doWorkAsync,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ return WrapResultAsync(
+ telemetry,
+ async () =>
+ {
+ await doWorkAsync().ConfigureAwait(false);
+ return (Outcome.Success, true);
+ },
+ Wrap(createTelemetryEvent));
+ }
+
+ ///
+ /// Wraps an asynchronous task with telemetry. The task can return outcome
+ ///
+ /// The telemetry instance to use
+ /// The async function to call
+ /// The method to call to create the telemetry event
+ /// Asynchronous task
+ public static async Task WrapAsync(
+ this ITelemetry telemetry,
+ Func> doWorkAsync,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var (outcome, _) = await WrapResultAsync(
+ telemetry,
+ async () =>
+ {
+ var outcome = await doWorkAsync()
+ .ConfigureAwait(false);
+ return (outcome, true);
+ },
+ Wrap(createTelemetryEvent))
+ .ConfigureAwait(false);
+
+ return outcome;
+ }
+
+ ///
+ /// Wraps an asynchronous task with telemetry. The task can return a result
+ ///
+ /// The type of the result
+ /// The telemetry instance to use
+ /// The async function to call
+ /// The method to call to create the telemetry event
+ /// Asynchronous task
+ public static async Task WrapAsync(
+ this ITelemetry telemetry,
+ Func> doWorkAsync,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var (_, result) = await WrapResultAsync(
+ telemetry,
+ async () =>
+ {
+ var result = await doWorkAsync().ConfigureAwait(false);
+ return (Outcome.Success, result);
+ },
+ createTelemetryEvent)
+ .ConfigureAwait(false);
+
+ return result;
+ }
+
+ ///
+ /// Wraps an asynchronous task with telemetry. The task can return an outcome, and a result
+ ///
+ /// The type of the result
+ /// The telemetry instance to use
+ /// The async function to call
+ /// The method to call to create the telemetry event
+ /// Asynchronous task
+ public static async Task<(Outcome, TResult)> WrapResultAsync(
+ this ITelemetry telemetry,
+ Func> doWorkAsync,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var outcome = Outcome.Unknown;
+ TResult res = default;
+ Exception exception = null;
+
+ var stopwatch = Stopwatch.StartNew();
+ try
+ {
+ (outcome, res) = await doWorkAsync().ConfigureAwait(false);
+ return (outcome, res);
+ }
+ catch (Exception ex)
+ {
+ exception = FlattenException(ex);
+ outcome = ToOutcome(ex);
+ throw;
+ }
+ finally
+ {
+ stopwatch.Stop();
+ SendEvent(telemetry, () => createTelemetryEvent(outcome, res, exception, stopwatch.Elapsed));
+ }
+ }
+
+ #endregion
+
+ #region Non-async wrappers
+
+ ///
+ /// Wraps some work with telemetry
+ ///
+ /// The telemetry instance to use
+ /// The work to do
+ /// The method to call to create the telemetry event
+ public static void Wrap(
+ this ITelemetry telemetry,
+ Action doWork,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var (outcome, _) = WrapResult(
+ telemetry,
+ () =>
+ {
+ doWork();
+ return (Outcome.Success, true);
+ },
+ Wrap(createTelemetryEvent));
+ }
+
+ ///
+ /// Wraps some work with telemetry
+ ///
+ /// The telemetry instance to use
+ /// The work to do
+ /// The method to call to create the telemetry event
+ /// The returned outcome from the work
+ public static Outcome Wrap(
+ this ITelemetry telemetry,
+ Func doWork,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var (outcome, _) = WrapResult(
+ telemetry,
+ () =>
+ {
+ var outcome = doWork();
+ return (outcome, true);
+ },
+ Wrap(createTelemetryEvent));
+
+ return outcome;
+ }
+
+ ///
+ /// Wraps some work with telemetry
+ ///
+ ///
+ /// The telemetry instance to use
+ /// The work to do
+ /// The method to call to create the telemetry event
+ /// The returned result from the work
+ public static TResult Wrap(
+ this ITelemetry telemetry,
+ Func doWork,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var (_, result) = WrapResult(
+ telemetry,
+ () =>
+ {
+ var result = doWork();
+ return (Outcome.Success, result);
+ },
+ createTelemetryEvent);
+
+ return result;
+ }
+
+ ///
+ /// Wraps some work with telemetry
+ ///
+ ///
+ /// The telemetry instance to use
+ /// The work to do
+ /// The method to call to create the telemetry event
+ /// The returned outcome, and result from the work
+ public static (Outcome, TResult) WrapResult(
+ this ITelemetry telemetry,
+ Func<(Outcome, TResult)> doWork,
+ CreateTelemetryEvent createTelemetryEvent)
+ {
+ var outcome = Outcome.Unknown;
+ TResult res = default;
+ Exception exception = null;
+
+ var stopwatch = Stopwatch.StartNew();
+ try
+ {
+ (outcome, res) = doWork();
+ return (outcome, res);
+ }
+ catch (Exception ex)
+ {
+ exception = FlattenException(ex);
+ outcome = ToOutcome(ex);
+ throw;
+ }
+ finally
+ {
+ stopwatch.Stop();
+ SendEvent(telemetry, () => createTelemetryEvent(outcome, res, exception, stopwatch.Elapsed));
+ }
+ }
+
+ #endregion
+
+ #region helper methods
+
+ private static CreateTelemetryEvent Wrap(CreateTelemetryEvent creator) =>
+ (Outcome outcome, TResult _, Exception ex, TimeSpan duration) => creator(outcome, ex, duration);
+
+ private static Exception FlattenException(Exception ex)
+ {
+ // special case for AggregateExceptions that wrap only a single exception. This can happen for
+ // example if we call Task<>.Result. We unwrap here for clearer and simpler exception reporting
+ if (ex is AggregateException aex && aex.InnerExceptions.Count == 1)
+ {
+ return aex.InnerExceptions[0];
+ }
+ else
+ {
+ return ex;
+ }
+ }
+
+ private static Outcome ToOutcome(Exception ex) =>
+ ex switch
+ {
+ OperationCanceledException => Outcome.Canceled,
+ TimeoutException => Outcome.TimedOut,
+ _ => Outcome.Failed
+
+ };
+
+ private static void SendEvent(ITelemetry telemetry, Func creator)
+ {
+ if (telemetry != null)
+ {
+ ITelemetryEvent evt = creator();
+ if (evt != null)
+ {
+ telemetry.LogEvent(evt);
+ }
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/src/common/Telemetry/NoOpTelemetry.cs b/src/common/Telemetry/NoOpTelemetry.cs
new file mode 100644
index 00000000..16d5d589
--- /dev/null
+++ b/src/common/Telemetry/NoOpTelemetry.cs
@@ -0,0 +1,19 @@
+namespace Azure.AI.Details.Common.CLI.Telemetry
+{
+ public class NoOpTelemetry : ITelemetry
+ {
+ private NoOpTelemetry() { }
+
+ public static ITelemetry Instance { get; } = new NoOpTelemetry();
+
+ public ValueTask DisposeAsync()
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ public void LogEvent(ITelemetryEvent evt)
+ {
+ // Nothing to see here, move along...
+ }
+ }
+}
diff --git a/src/common/Telemetry/Outcome.cs b/src/common/Telemetry/Outcome.cs
new file mode 100644
index 00000000..ebf31675
--- /dev/null
+++ b/src/common/Telemetry/Outcome.cs
@@ -0,0 +1,30 @@
+namespace Azure.AI.Details.Common.CLI.Telemetry
+{
+ public enum Outcome
+ {
+ ///
+ /// Outcome was unknown (should not happen)
+ ///
+ Unknown,
+
+ ///
+ /// Success
+ ///
+ Success,
+
+ ///
+ /// Failure due to one or more errors
+ ///
+ Failed,
+
+ ///
+ /// Canceled by the user
+ ///
+ Canceled,
+
+ ///
+ /// Took too long and was aborted
+ ///
+ TimedOut
+ }
+}
diff --git a/src/common/Telemetry/PiiAttribute.cs b/src/common/Telemetry/PiiAttribute.cs
new file mode 100644
index 00000000..a18bbad6
--- /dev/null
+++ b/src/common/Telemetry/PiiAttribute.cs
@@ -0,0 +1,22 @@
+namespace Azure.AI.Details.Common.CLI.Telemetry
+{
+ public enum PiiKind
+ {
+ None,
+ UserId,
+ IP4Address,
+ IP6Address,
+ Uri
+ }
+
+ [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
+ public class PiiAttribute : Attribute
+ {
+ public PiiAttribute(PiiKind kind)
+ {
+ Kind = kind;
+ }
+
+ public PiiKind Kind { get; set; }
+ }
+}
diff --git a/src/common/common.csproj b/src/common/common.csproj
index c6467632..ea206fe9 100644
--- a/src/common/common.csproj
+++ b/src/common/common.csproj
@@ -4,6 +4,7 @@
net8.0
enable
Azure.AI.CLI.Common
+ Azure.AI.Details.Common.CLI
@@ -13,6 +14,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreateAiHubResource.cs b/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreateAiHubResource.cs
index 6b2b70d7..d9a58799 100644
--- a/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreateAiHubResource.cs
+++ b/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreateAiHubResource.cs
@@ -18,10 +18,10 @@ public partial class AiSdkConsoleGui
{
public static async Task PickAiHubResource(ICommandValues values, string subscription)
{
- return await PickOrCreateAiHubResource(false, values, subscription);
+ return (await PickOrCreateAiHubResource(false, values, subscription)).Item1;
}
- public static async Task PickOrCreateAiHubResource(ICommandValues values, string subscription)
+ public static async Task<(AiHubResourceInfo, bool)> PickOrCreateAiHubResource(ICommandValues values, string subscription)
{
return await PickOrCreateAiHubResource(true, values, subscription);
}
@@ -32,7 +32,7 @@ public static async Task CreateAiHubResource(ICommandValues v
return FinishPickOrCreateAiHubResource(values, resource);
}
- private static async Task PickOrCreateAiHubResource(bool allowCreate, ICommandValues values, string subscription)
+ private static async Task<(AiHubResourceInfo, bool)> PickOrCreateAiHubResource(bool allowCreate, ICommandValues values, string subscription)
{
ConsoleHelpers.WriteLineWithHighlight($"\n`AZURE AI RESOURCE`");
Console.Write("\rName: *** Loading choices ***");
@@ -70,7 +70,7 @@ private static async Task PickOrCreateAiHubResource(bool allo
var picked = ListBoxPicker.PickIndexOf(choices.ToArray());
if (picked < 0)
{
- throw new ApplicationException($"CANCELED: No resource selected");
+ throw new OperationCanceledException($"CANCELED: No resource selected");
}
Console.WriteLine($"\rName: {choices[picked]}");
@@ -88,7 +88,7 @@ private static async Task PickOrCreateAiHubResource(bool allo
var sku = values.GetOrDefault("init.service.cognitiveservices.resource.sku", Program.CognitiveServiceResourceSku);
var yes = values.GetOrDefault("init.service.cognitiveservices.terms.agree", false);
- var openAiResource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(true, true, subscription, regionFilter, groupFilter, resourceFilter, kind, sku, yes);
+ var openAiResource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(values, true, true, subscription, regionFilter, groupFilter, resourceFilter, kind, sku, yes);
values.Reset("service.openai.deployments.picked", "true");
ResourceGroupNameToken.Data().Set(values, openAiResource.Group);
@@ -106,7 +106,7 @@ private static async Task PickOrCreateAiHubResource(bool allo
resource = await TryCreateAiHubResourceInteractive(values, subscription);
}
- return FinishPickOrCreateAiHubResource(values, resource);
+ return (FinishPickOrCreateAiHubResource(values, resource), createNewHub);
}
private static async Task TryCreateAiHubResourceInteractive(ICommandValues values, string subscription)
diff --git a/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreate_AiHubProject.cs b/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreate_AiHubProject.cs
index 1fa0529e..48e2071d 100644
--- a/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreate_AiHubProject.cs
+++ b/src/common/details/ai_python_generative_sdk/AiSdkConsoleGui_PickOrCreate_AiHubProject.cs
@@ -3,31 +3,47 @@
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Collections.Generic;
-using Newtonsoft.Json.Linq;
-using Azure.AI.Details.Common.CLI.ConsoleGui;
-using System.Text.Json;
-using System.IO;
using System.Text;
+using System.Text.Json;
+using Azure.AI.Details.Common.CLI.ConsoleGui;
+using Azure.AI.Details.Common.CLI.Telemetry;
+using Azure.AI.Details.Common.CLI.Telemetry.Events;
+using Newtonsoft.Json.Linq;
namespace Azure.AI.Details.Common.CLI
{
public partial class AiSdkConsoleGui
{
- public static async Task PickOrCreateAndConfigAiHubProject(bool allowCreate, bool allowPick, bool allowSkipDeployments, bool allowSkipSearch, ICommandValues values, string subscription, string resourceId, string groupName, string openAiEndpoint, string openAiKey, string searchEndpoint, string searchKey)
+ public static AiHubProjectInfo PickOrCreateAiHubProject(bool allowCreate, bool allowPick, ICommandValues values, string subscription, string resourceId, out bool createdProject)
{
- var createdProject = false;
- var project = allowCreate && allowPick
- ? PickOrCreateAiHubProject(values, subscription, resourceId, out createdProject)
- : allowCreate
- ? CreateAiHubProject(values, subscription, resourceId)
- : allowPick
- ? PickAiHubProject(values, subscription, resourceId)
- : throw new ApplicationException($"CANCELED: No project selected");
+ createdProject = false;
+ if (allowCreate && allowPick)
+ return PickOrCreateAiHubProject(values, subscription, resourceId, out createdProject);
+ else if (allowCreate)
+ {
+ createdProject = true;
+ return CreateAiHubProject(values, subscription, resourceId);
+ }
+ else if (allowPick)
+ return PickAiHubProject(values, subscription, resourceId);
+ else
+ throw new ApplicationException($"CANCELED: No project selected");
+ }
+ public static async Task ConfigAiHubProject(
+ ICommandValues values,
+ AiHubProjectInfo project,
+ bool createdProject,
+ bool allowSkipDeployments,
+ bool allowSkipSearch,
+ string subscription,
+ string resourceId,
+ string groupName,
+ string openAiEndpoint,
+ string openAiKey,
+ string searchEndpoint,
+ string searchKey)
+ {
var createdOrPickedSearch = false;
if (!createdProject)
{
@@ -47,13 +63,13 @@ public static async Task PickOrCreateAndConfigAiHubProject(boo
}
else if (!string.IsNullOrEmpty(openai?.Name))
{
- var (chatDeployment, embeddingsDeployment, evaluationDeployment, keys) = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments("AZURE OPENAI RESOURCE", true, allowSkipDeployments, subscription, openai.Value);
+ var (chatDeployment, embeddingsDeployment, evaluationDeployment, keys) = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(values, "AZURE OPENAI RESOURCE", true, allowSkipDeployments, subscription, openai.Value);
openAiEndpoint = openai.Value.Endpoint;
openAiKey = keys.Key1;
}
else
{
- var openAiResource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(true, allowSkipDeployments, subscription);
+ var openAiResource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(values, true, allowSkipDeployments, subscription);
openAiEndpoint = openAiResource.Endpoint;
openAiKey = openAiResource.Key;
}
@@ -77,8 +93,28 @@ public static async Task PickOrCreateAndConfigAiHubProject(boo
}
}
- GetOrCreateAiHubProjectConnections(values, createdProject || createdOrPickedSearch, subscription, project.Group, project.Name, openAiEndpoint, openAiKey, searchEndpoint, searchKey);
- CreateAiHubProjectConfigJsonFile(subscription, project.Group, project.Name);
+ Program.Telemetry.Wrap(
+ () => GetOrCreateAiHubProjectConnections(values, createdProject || createdOrPickedSearch, subscription, project.Group, project.Name, openAiEndpoint, openAiKey, searchEndpoint, searchKey),
+ (outcome, ex, duration) => new InitTelemetryEvent(InitStage.Connections)
+ {
+ Outcome = outcome,
+ // TODO set selected?
+ RunId = values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = values.GetOrDefault("telemetry.init.run_type", null),
+ DurationInMs = duration.TotalMilliseconds,
+ Error = ex?.Message
+ });
+
+ Program.Telemetry.Wrap(
+ () => CreateAiHubProjectConfigJsonFile(subscription, project.Group, project.Name),
+ (outcome, ex, duration) => new InitTelemetryEvent(InitStage.Save)
+ {
+ Outcome = outcome,
+ RunId = values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = values.GetOrDefault("telemetry.init.run_type", null),
+ DurationInMs = duration.TotalMilliseconds,
+ Error = ex?.Message
+ });
return project;
}
diff --git a/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs b/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs
index 2c0f67a2..606ee52f 100644
--- a/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs
+++ b/src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs
@@ -3,18 +3,15 @@
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Collections.Generic;
using Azure.AI.Details.Common.CLI.ConsoleGui;
namespace Azure.AI.Details.Common.CLI
{
public partial class AzCliConsoleGui
{
- public static async Task PickOrCreateCognitiveServicesResourceDeployment(bool interactive, bool allowSkipDeployment, string deploymentExtra, string subscriptionId, string groupName, string resourceRegionLocation, string resourceName, string deploymentFilter)
+ public static async Task<(AzCli.CognitiveServicesDeploymentInfo?,bool)> PickOrCreateCognitiveServicesResourceDeployment(bool interactive, bool allowSkipDeployment, string deploymentExtra, string subscriptionId, string groupName, string resourceRegionLocation, string resourceName, string deploymentFilter)
{
+ bool createdNew = false;
ConsoleHelpers.WriteLineWithHighlight($"\n`AZURE OPENAI DEPLOYMENT ({deploymentExtra.ToUpper()})`");
var createNewItem = !string.IsNullOrEmpty(deploymentFilter)
@@ -22,10 +19,12 @@ public partial class AzCliConsoleGui
: interactive ? "(Create new)" : null;
var deployment = await FindCognitiveServicesResourceDeployment(interactive, allowSkipDeployment, deploymentExtra, subscriptionId, groupName, resourceName, deploymentFilter, createNewItem);
- if (deployment == null && allowSkipDeployment) return null;
-
+ if (deployment == null && allowSkipDeployment)
+ return (null, createdNew);
+
if (deployment != null && deployment.Value.Name == null)
{
+ createdNew = true;
deployment = await TryCreateCognitiveServicesResourceDeployment(interactive, deploymentExtra, subscriptionId, groupName, resourceRegionLocation, resourceName, deploymentFilter);
}
@@ -34,7 +33,7 @@ public partial class AzCliConsoleGui
throw new ApplicationException($"CANCELED: No deployment selected");
}
- return deployment.Value;
+ return (deployment, createdNew);
}
public static async Task FindCognitiveServicesResourceDeployment(bool interactive, bool allowSkipDeployment, string deploymentExtra, string subscriptionId, string groupName, string resourceName, string deploymentFilter, string allowCreateDeploymentOption)
diff --git a/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_AiServicesKind.cs b/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_AiServicesKind.cs
index c7ade7ce..a7ba4f49 100644
--- a/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_AiServicesKind.cs
+++ b/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_AiServicesKind.cs
@@ -19,7 +19,7 @@ namespace Azure.AI.Details.Common.CLI
{
public partial class AzCliConsoleGui
{
- public static async Task PickOrCreateAndConfigCognitiveServicesAiServicesKindResource(bool interactive, bool allowSkipDeployments, string subscriptionId, string regionFilter = null, string groupFilter = null, string resourceFilter = null, string kinds = null, string sku = null, bool yes = false)
+ public static async Task PickOrCreateAndConfigCognitiveServicesAiServicesKindResource(INamedValues values, bool interactive, bool allowSkipDeployments, string subscriptionId, string regionFilter = null, string groupFilter = null, string resourceFilter = null, string kinds = null, string sku = null, bool yes = false)
{
kinds ??= "AIServices";
var sectionHeader = "AI SERVICES";
@@ -27,7 +27,7 @@ public partial class AzCliConsoleGui
var regionLocation = !string.IsNullOrEmpty(regionFilter) ? await AzCliConsoleGui.PickRegionLocationAsync(interactive, regionFilter) : new AzCli.AccountRegionLocationInfo();
var resource = await AzCliConsoleGui.PickOrCreateCognitiveResource(sectionHeader, interactive, subscriptionId, regionLocation.Name, groupFilter, resourceFilter, kinds, sku, yes);
- var (chatDeployment, embeddingsDeployment, evaluationDeployment, keys) = await PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(sectionHeader, interactive, allowSkipDeployments, subscriptionId, resource);
+ var (chatDeployment, embeddingsDeployment, evaluationDeployment, keys) = await PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(values, sectionHeader, interactive, allowSkipDeployments, subscriptionId, resource);
return new AzCli.CognitiveServicesResourceInfoEx
{
@@ -38,9 +38,9 @@ public partial class AzCliConsoleGui
RegionLocation = resource.RegionLocation,
Endpoint = resource.Endpoint,
Key = keys.Key1,
- ChatDeployment = chatDeployment.HasValue ? chatDeployment.Value.Name : null,
- EmbeddingsDeployment = embeddingsDeployment.HasValue ? embeddingsDeployment.Value.Name : null,
- EvaluationDeployment = evaluationDeployment.HasValue ? evaluationDeployment.Value.Name : null
+ ChatDeployment = chatDeployment?.Name,
+ EmbeddingsDeployment = embeddingsDeployment?.Name,
+ EvaluationDeployment = evaluationDeployment?.Name
};
}
}
diff --git a/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_OpenAiKind.cs b/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_OpenAiKind.cs
index 1b69e166..d2bb8141 100644
--- a/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_OpenAiKind.cs
+++ b/src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_OpenAiKind.cs
@@ -14,12 +14,15 @@
using System.Net;
using Newtonsoft.Json.Linq;
using Azure.AI.Details.Common.CLI.ConsoleGui;
+using Azure.AI.Details.Common.CLI.Telemetry;
+using Azure.AI.Details.Common.CLI.Telemetry.Events;
namespace Azure.AI.Details.Common.CLI
{
public partial class AzCliConsoleGui
{
public static async Task PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(
+ INamedValues values,
bool interactive,
bool allowSkipDeployments,
string subscriptionId,
@@ -40,6 +43,7 @@ public partial class AzCliConsoleGui
var resource = await AzCliConsoleGui.PickOrCreateCognitiveResource(sectionHeader, interactive, subscriptionId, regionLocation.Name, groupFilter, resourceFilter, kinds, sku, yes);
var (chatDeployment, embeddingsDeployment, evaluationDeployment, keys) = await PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(
+ values,
sectionHeader,
interactive,
allowSkipDeployments,
@@ -66,6 +70,7 @@ public partial class AzCliConsoleGui
public static async Task<(AzCli.CognitiveServicesDeploymentInfo?, AzCli.CognitiveServicesDeploymentInfo?, AzCli.CognitiveServicesDeploymentInfo?, AzCli.CognitiveServicesKeyInfo)>
PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(
+ INamedValues values,
string sectionHeader,
bool interactive,
bool allowSkipDeployments,
@@ -75,9 +80,25 @@ public partial class AzCliConsoleGui
string embeddingsDeploymentFilter = null,
string evaluationsDeploymentFilter = null)
{
- var chatDeployment = await AzCliConsoleGui.PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, "Chat", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, chatDeploymentFilter);
- var embeddingsDeployment = await AzCliConsoleGui.PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, "Embeddings", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, embeddingsDeploymentFilter);
- var evaluationDeployment = await AzCliConsoleGui.PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, "Evaluation", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, evaluationsDeploymentFilter);
+ bool createdNew = false;
+ AzCli.CognitiveServicesDeploymentInfo? chatDeployment = null, embeddingsDeployment = null, evaluationDeployment = null;
+ var token = CancellationToken.None;
+
+ (chatDeployment, createdNew) = await Program.Telemetry.WrapAsync(
+ () => PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, "Chat", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, chatDeploymentFilter),
+ (outcome, res, ex, timeTaken) => CreateInitDeploymentTelemetryEvent(values, InitStage.Chat, outcome, ex, timeTaken, res))
+ .ConfigureAwait(false);
+
+ (embeddingsDeployment, createdNew) = await Program.Telemetry.WrapAsync(
+ () => PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, "Embeddings", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, embeddingsDeploymentFilter),
+ (outcome, res,ex, timeTaken) => CreateInitDeploymentTelemetryEvent(values, InitStage.Embeddings, outcome, ex, timeTaken, res))
+ .ConfigureAwait(false);
+
+ (evaluationDeployment, createdNew) = await Program.Telemetry.WrapAsync(
+ () => PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipDeployments, "Evaluation", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, evaluationsDeploymentFilter),
+ (outcome, res, ex, timeTaken) => CreateInitDeploymentTelemetryEvent(values, InitStage.Evaluation, outcome, ex, timeTaken, res))
+ .ConfigureAwait(false);
+
var keys = await AzCliConsoleGui.LoadCognitiveServicesResourceKeys(sectionHeader, subscriptionId, resource);
if (resource.Kind == "AIServices")
@@ -91,5 +112,18 @@ public partial class AzCliConsoleGui
return (chatDeployment, embeddingsDeployment, evaluationDeployment, keys);
}
+
+ private static ITelemetryEvent CreateInitDeploymentTelemetryEvent(INamedValues values, InitStage stage, Outcome outcome, Exception ex, TimeSpan duration, (AzCli.CognitiveServicesDeploymentInfo? deployment, bool createdNew) result) =>
+ values == null ? null : new InitTelemetryEvent(stage)
+ {
+ Outcome = outcome,
+ DurationInMs = duration.TotalMilliseconds,
+ Error = ex?.Message,
+ Selected = result.deployment == null
+ ? ex == null ? "skip" : "new"
+ : result.createdNew ? "new" : "existing",
+ RunId = values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = values.GetOrDefault("telemetry.init.run_type", null),
+ };
}
}
diff --git a/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs b/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs
index 62929d72..e7bab2d9 100644
--- a/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs
+++ b/src/common/details/azcli/AzCliConsoleGui_SubscriptionPicker.cs
@@ -53,9 +53,25 @@ public static async Task PickSubscriptionIdAsync(bool allowInteractiveLo
return subscription.Value;
}
- public static async Task ValidateSubscriptionAsync(bool allowInteractiveLogin, string subscriptionFilter, string subscriptionLabel)
+ public static async Task ValidateSubscriptionAsync(bool allowInteractiveLogin, string subscriptionId)
{
- return await FindSubscriptionAsync(allowInteractiveLogin, false, subscriptionFilter, subscriptionLabel);
+ var allSubscriptions = await LoginHelpers.GetResponseOnLogin(allowInteractiveLogin, "subscription", AzCli.ListAccounts, " SUBSCRIPTION");
+ var subscription = allSubscriptions
+ .Payload
+ .FirstOrDefault(subs => string.Equals(subs.Id, subscriptionId, StringComparison.OrdinalIgnoreCase));
+
+ bool found = !string.IsNullOrWhiteSpace(subscription.Id);
+ if (found)
+ {
+ Console.WriteLine($"{subscription.Name} ({subscription.Id})");
+ CacheSubscriptionUserName(subscription);
+ return subscription;
+ }
+ else
+ {
+ ConsoleHelpers.WriteLineWithHighlight($"`#e_;WARNING: Could not find subscription {subscriptionId}!`");
+ return null;
+ }
}
private static async Task FindSubscriptionAsync(bool allowInteractiveLogin, bool allowInteractivePickSubscription, string subscriptionFilter = null, string subscriptionLabel = "Subscription")
@@ -90,10 +106,11 @@ public static async Task PickSubscriptionIdAsync(bool allowInteractiveLo
if (subscriptions.Count() == 0)
{
- ConsoleHelpers.WriteLineError(response.Payload.Count() > 0
- ? "*** No matching subscriptions found ***"
- : "*** No subscriptions found ***");
- return null;
+ string error = response.Payload.Count() > 0
+ ? "No matching subscriptions found"
+ : "No subscriptions found";
+ ConsoleHelpers.WriteLineError($"*** {error} ***");
+ throw new ApplicationException(error);
}
else if (subscriptions.Count() == 1)
{
@@ -104,10 +121,11 @@ public static async Task PickSubscriptionIdAsync(bool allowInteractiveLo
}
else if (!allowInteractivePickSubscription)
{
- ConsoleHelpers.WriteLineError("*** More than 1 subscription found ***");
+ string error = "More than 1 subscription found";
+ ConsoleHelpers.WriteLineError($"*** { error } ***");
Console.WriteLine();
DisplaySubscriptions(subscriptions, " ");
- return null;
+ throw new ApplicationException(error);
}
return ListBoxPickSubscription(subscriptions);
@@ -121,7 +139,7 @@ public static async Task PickSubscriptionIdAsync(bool allowInteractiveLo
var picked = ListBoxPicker.PickIndexOf(list, defaultIndex);
if (picked < 0)
{
- return null;
+ throw new OperationCanceledException("User canceled");
}
var subscription = subscriptions[picked];
diff --git a/src/common/details/commands/init_command.cs b/src/common/details/commands/init_command.cs
index 7cf3a756..ebcb5488 100644
--- a/src/common/details/commands/init_command.cs
+++ b/src/common/details/commands/init_command.cs
@@ -16,6 +16,8 @@
using System.Net;
using Newtonsoft.Json.Linq;
using Azure.AI.Details.Common.CLI.ConsoleGui;
+using Azure.AI.Details.Common.CLI.Telemetry;
+using Azure.AI.Details.Common.CLI.Telemetry.Events;
namespace Azure.AI.Details.Common.CLI
{
@@ -57,6 +59,7 @@ private async Task DoCommand(string command)
DisplayInitServiceBanner();
var interactive = _values.GetOrDefault("init.service.interactive", true);
+ var runId = _values.GetOrAdd("telemetry.init.run_id", Guid.NewGuid);
switch (command)
{
@@ -109,23 +112,61 @@ private async Task DoInitRootAsync()
private async Task DoInitRootVerifyConfigFileAsync(bool interactive, string fileName)
{
- ParseConfigJson(fileName, out string subscription, out string groupName, out string projectName);
+ string detail = null;
- var (hubName, openai, search) = await VerifyProjectAsync(interactive, subscription, groupName, projectName);
- if (openai != null && search != null)
+ bool? useSaved = await Program.Telemetry.WrapAsync(async () =>
{
- await DoInitRootConfirmVerifiedProjectResources(interactive, subscription, projectName, hubName, openai.Value, search.Value);
- }
- else
+ bool success = ParseConfigJson(fileName, out string subscription, out string groupName, out string projectName);
+ if (success)
+ {
+ var (hubName, openai, search) = await VerifyProjectAsync(interactive, subscription, groupName, projectName);
+ if (openai != null && search != null)
+ {
+ bool? useSaved = await DoInitRootConfirmVerifiedProjectResources(
+ interactive, subscription, projectName, hubName, openai.Value, search.Value);
+
+ detail = useSaved.HasValue
+ ? useSaved == true ? "saved_config" : "something_else"
+ : null;
+
+ return useSaved;
+ }
+ else
+ {
+ detail = "invalid_config";
+ return null;
+ }
+ }
+ else
+ {
+ detail = "invalid_json";
+ return null;
+ }
+ },
+ (outcome, useSaved, ex, duration) => new VerifySavedConfigTelemetryEvent()
+ {
+ Outcome = useSaved == null ? Outcome.Failed : outcome,
+ Detail = detail,
+ DurationInMs = duration.TotalMilliseconds,
+ Error = ex?.Message,
+ })
+ .ConfigureAwait(false);
+
+ if (useSaved != true)
{
await DoInitRootMenuPick();
}
}
- private async Task<(string, AzCli.CognitiveServicesResourceInfo?, AzCli.CognitiveSearchResourceInfo?)> VerifyProjectAsync(bool interactive, string subscription, string groupName, string projectName)
+ private async Task<(string, AzCli.CognitiveServicesResourceInfo?, AzCli.CognitiveSearchResourceInfo?)> VerifyProjectAsync(bool interactive, string subscriptionId, string groupName, string projectName)
{
Console.WriteLine($" PROJECT: {projectName}");
- var validated = await AzCliConsoleGui.ValidateSubscriptionAsync(interactive, subscription, " SUBSCRIPTION");
+
+ var validated = await AzCliConsoleGui.ValidateSubscriptionAsync(interactive, subscriptionId);
+ if (validated == null)
+ {
+ return (null, null, null);
+ }
ConsoleHelpers.WriteLineWithHighlight("\n `ATTACHED SERVICES AND RESOURCES`\n");
@@ -135,7 +176,7 @@ private async Task DoInitRootVerifyConfigFileAsync(bool interactive, string file
var (hubName, openai, search) = await AiSdkConsoleGui.VerifyResourceConnections(_values, validated?.Id, groupName, projectName);
if (openai != null && search != null)
{
- Console.Write(new string(' ', message.Length + 2) + "\r");
+ Console.Write($"\r{new string(' ', message.Length)}\r");
return (hubName, openai, search);
}
else
@@ -146,11 +187,10 @@ private async Task DoInitRootVerifyConfigFileAsync(bool interactive, string file
}
}
- private async Task DoInitRootConfirmVerifiedProjectResources(bool interactive, string subscription, string projectName, string resourceName, AzCli.CognitiveServicesResourceInfo openaiResource, AzCli.CognitiveSearchResourceInfo searchResource)
+ private async Task DoInitRootConfirmVerifiedProjectResources(bool interactive, string subscription, string projectName, string resourceName, AzCli.CognitiveServicesResourceInfo openaiResource, AzCli.CognitiveSearchResourceInfo searchResource)
{
ConsoleHelpers.WriteLineWithHighlight($" AI RESOURCE: {resourceName}");
ConsoleHelpers.WriteLineWithHighlight($" AI SEARCH RESOURCE: {searchResource.Name}");
- // Console.WriteLine();
ConsoleHelpers.WriteLineWithHighlight($" AZURE OPENAI RESOURCE: {openaiResource.Name}");
// TODO: If there's a way to get the deployments, get them, and do this... Print correct stuff here...
@@ -163,24 +203,24 @@ private async Task DoInitRootConfirmVerifiedProjectResources(bool interactive, s
Console.Write($"{label}: ");
var choices = new string[] { $"PROJECT: {projectName}", $" OR: (Initialize something else)" };
- var picked = ListBoxPicker.PickIndexOf(choices.ToArray());
+ int picked = ListBoxPicker.PickIndexOf(choices.ToArray());
+
if (picked < 0)
{
Console.WriteLine($"\r{label}: CANCELED (no selection)");
- return;
+ return null;
}
else if (picked > 0)
{
Console.Write(new string(' ', label.Length + 2) + "\r");
Console.WriteLine(" Initializing something else...\n");
- await DoInitRootMenuPick();
- return;
+ return false;
}
else
{
Console.Write("\r" + new string(' ', label.Length + 2) + "\r");
- var (chatDeployment, embeddingsDeployment, evaluationDeployment, keys) = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments("AZURE OPENAI RESOURCE", interactive, true, subscription, openaiResource);
+ await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(null, "AZURE OPENAI RESOURCE", interactive, true, subscription, openaiResource);
var searchKeys = await AzCliConsoleGui.LoadSearchResourceKeys(subscription, searchResource);
ConfigSetHelpers.ConfigSearchResource(searchResource.Endpoint, searchKeys.Key1);
@@ -188,6 +228,8 @@ private async Task DoInitRootConfirmVerifiedProjectResources(bool interactive, s
ConfigSetHelpers.ConfigSet("@subscription", subscription);
ConfigSetHelpers.ConfigSet("@project", projectName);
ConfigSetHelpers.ConfigSet("@group", openaiResource.Group);
+
+ return true;
}
}
@@ -212,7 +254,7 @@ private bool ParseConfigJson(string fileName, out string subscription, out strin
return !string.IsNullOrEmpty(subscription) && !string.IsNullOrEmpty(groupName) && !string.IsNullOrEmpty(projectName);
}
- private async Task DoInitRootMenuPick()
+ private async ValueTask DoInitRootMenuPick()
{
var interactive = true;
@@ -223,36 +265,45 @@ private async Task DoInitRootMenuPick()
var label = " Initialize";
Console.Write($"{label}: ");
- var choiceToPart = new Dictionary
- {
- // ["AI Project"] = "init-root-project-select-or-create",
- ["New AI Project"] = "init-root-project-create",
- ["Existing AI Project"] = "init-root-project-select",
- ["Standalone resources"] = "init-root-standalone-select-or-create",
- };
- var partToLabelDisplay = new Dictionary()
+
+ var choices = new[]
{
- // ["init-root-project-select-or-create"] = "AI Project",
- ["init-root-project-create"] = "New AI Project",
- ["init-root-project-select"] = "Existing AI Project",
- ["init-root-standalone-select-or-create"] = null
+ new { DisplayName = "New AI Project", Value = "init-root-project-create", Metadata = "new" },
+ new { DisplayName = "Existing AI Project", Value = "init-root-project-select", Metadata = "existing" },
+ new { DisplayName = "Standalone resources", Value = "init-root-standalone-select-or-create", Metadata = "standalone" },
};
- var choices = choiceToPart.Keys.ToArray();
- var picked = ListBoxPicker.PickIndexOf(choices.ToArray());
- if (picked < 0)
+ int selected = -1;
+
+ var outcome = Program.Telemetry.Wrap(() =>
{
- Console.WriteLine($"\r{label}: CANCELED (no selection)");
- return;
+ selected = ListBoxPicker.PickIndexOf(choices.Select(e => e.DisplayName).ToArray());
+ if (selected < 0)
+ {
+ Console.WriteLine($"\r{label}: CANCELED (no selection)");
+ return Outcome.Canceled;
+ }
+
+ Console.Write($"\r{label.Trim()}: {choices.ElementAtOrDefault(selected)?.DisplayName}\n");
+ _values.Reset("telemetry.init.run_type", choices.ElementAtOrDefault(selected)?.Metadata);
+
+ return Outcome.Success;
+ },
+ (outcome, ex, timeTaken) => choices.ElementAtOrDefault(selected)?.Metadata == "standalone"
+ ? null
+ : new InitTelemetryEvent(InitStage.Choice)
+ {
+ Outcome = outcome,
+ RunId = _values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = _values.GetOrDefault("telemetry.init.run_type", null),
+ DurationInMs = timeTaken.TotalMilliseconds,
+ Error = ex?.Message
+ });
+
+ if (outcome == Outcome.Success)
+ {
+ await DoInitServiceParts(interactive, choices.ElementAtOrDefault(selected)?.Value);
}
-
- var part = choiceToPart[choices[picked]];
- var display = partToLabelDisplay[part];
-
- Console.Write(display == null
- ? new string(' ', label.Length + 2) + "\r"
- : $"\r{label.Trim()}: {display}\n");
- await DoInitServiceParts(interactive, part.Split(';').ToArray());
}
private async Task DoInitStandaloneResources(bool interactive)
@@ -267,39 +318,43 @@ private async Task DoInitStandaloneResources(bool interactive)
var label = " Initialize";
Console.Write($"{label}: ");
- var choiceToPart = new Dictionary
- {
- ["Azure AI Services (v2)"] = "init-root-cognitiveservices-ai-services-kind-create-or-select",
- ["Azure AI Services (v1)"] = "init-root-cognitiveservices-cognitiveservices-kind-create-or-select",
- ["Azure OpenAI"] = "init-root-openai-create-or-select",
- ["Azure Search"] = "init-root-search-create-or-select",
- ["Azure Speech"] = "init-root-speech-create-or-select"
- };
- var partToLabelDisplay = new Dictionary()
+ var choices = new[]
{
- ["init-root-cognitiveservices-ai-services-kind-create-or-select"] = "Azure AI Services (v2)",
- ["init-root-cognitiveservices-cognitiveservices-kind-create-or-select"] = "Azure AI Services (v1)",
- ["init-root-openai-create-or-select"] = "Azure OpenAI",
- ["init-root-search-create-or-select"] = "Azure Search",
- ["init-root-speech-create-or-select"] = "Azure Speech"
+ new { DisplayName = "Azure AI Services (v2)", Value = "init-root-cognitiveservices-ai-services-kind-create-or-select", Metadata = "aiservices" },
+ new { DisplayName = "Azure AI Services (v1)", Value = "init-root-cognitiveservices-cognitiveservices-kind-create-or-select", Metadata ="cognitiveservices" },
+ new { DisplayName = "Azure OpenAI", Value = "init-root-openai-create-or-select", Metadata = "openai" },
+ new { DisplayName = "Azure Search", Value = "init-root-search-create-or-select", Metadata = "search" },
+ new { DisplayName = "Azure Speech", Value = "init-root-speech-create-or-select", Metadata = "speech" }
};
-
- var choices = choiceToPart.Keys.ToArray();
-
- var picked = ListBoxPicker.PickIndexOf(choices.ToArray());
- if (picked < 0)
+ int picked = -1;
+ var outcome = Program.Telemetry.Wrap(() =>
+ {
+ picked = ListBoxPicker.PickIndexOf(choices.Select(e => e.DisplayName).ToArray());
+ if (picked < 0)
+ {
+ Console.WriteLine("\rInitialize: CANCELED (no selection)");
+ return Outcome.Canceled;
+ }
+
+ Console.WriteLine($"\rInitialize: {choices.ElementAtOrDefault(picked)?.DisplayName}");
+ return Outcome.Success;
+ },
+ (outcome, ex, timeTaken) => new InitTelemetryEvent(InitStage.Choice)
+ {
+ Outcome = outcome,
+ RunId = _values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = _values.GetOrDefault("telemetry.init.run_type", null),
+ Selected = choices.ElementAtOrDefault(picked)?.Metadata,
+ DurationInMs = timeTaken.TotalMilliseconds,
+ Error = ex?.Message
+ });
+
+ if (outcome == Outcome.Success)
{
- Console.WriteLine("\rInitialize: CANCELED (no selection)");
- return;
+ await DoInitServiceParts(true, choices.ElementAtOrDefault(picked)?.Value);
}
-
- var part = choiceToPart[choices[picked]];
- var display = partToLabelDisplay[part];
- Console.WriteLine($"\rInitialize: {display}");
-
- await DoInitServiceParts(true, part.Split(';', StringSplitOptions.RemoveEmptyEntries));
}
private async Task DoInitServiceParts(bool interactive, params string[] operations)
@@ -337,11 +392,25 @@ private async Task DoInitServiceParts(bool interactive, params string[] operatio
}
}
- private async Task DoInitSubscriptionId(bool interactive)
+ private Task DoInitSubscriptionId(bool interactive)
{
- var subscriptionFilter = SubscriptionToken.Data().GetOrDefault(_values, "");
- var subscriptionId = await AzCliConsoleGui.PickSubscriptionIdAsync(interactive, interactive, subscriptionFilter);
- SubscriptionToken.Data().Set(_values, subscriptionId);
+ return Program.Telemetry.WrapAsync(
+ async () =>
+ {
+ var subscriptionFilter = SubscriptionToken.Data().GetOrDefault(_values, "");
+ string subscriptionId = await AzCliConsoleGui.PickSubscriptionIdAsync(interactive, interactive, subscriptionFilter);
+ SubscriptionToken.Data().Set(_values, subscriptionId);
+ return subscriptionId;
+ },
+ (outcome, subscriptionId, ex, timeTaken) => new InitTelemetryEvent(InitStage.Subscription)
+ {
+ Outcome = outcome,
+ //Selected = subscriptionId, // TODO PRIVACY REVIEW: can include this?
+ RunId = _values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = _values.GetOrDefault("telemetry.init.run_type", null),
+ DurationInMs = timeTaken.TotalMilliseconds,
+ Error = ex?.Message
+ });
}
private async Task DoInitRootHubResource(bool interactive)
@@ -352,10 +421,23 @@ private async Task DoInitRootHubResource(bool interactive)
await DoInitHubResource(interactive);
}
- private async Task DoInitHubResource(bool interactive)
+ private Task DoInitHubResource(bool interactive)
{
- var subscription = SubscriptionToken.Data().GetOrDefault(_values, "");
- var aiHubResource = await AiSdkConsoleGui.PickOrCreateAiHubResource(_values, subscription);
+ return Program.Telemetry.WrapAsync(
+ () =>
+ {
+ var subscription = SubscriptionToken.Data().GetOrDefault(_values, "");
+ return AiSdkConsoleGui.PickOrCreateAiHubResource(_values, subscription);
+ },
+ (outcome, res, ex, timeTaken) => new InitTelemetryEvent(InitStage.Resource)
+ {
+ Outcome = outcome,
+ RunId = _values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = _values.GetOrDefault("telemetry.init.run_type", null),
+ Selected = res.Item2 ? "new" : "existing",
+ DurationInMs = timeTaken.TotalMilliseconds,
+ Error = ex?.Message
+ });
}
private async Task DoInitRootProject(bool interactive, bool allowCreate = true, bool allowPick = true)
@@ -382,7 +464,42 @@ private async Task DoInitProject(bool interactive, bool allowCreate = true, bool
var searchEndpoint = _values.GetOrDefault("service.search.endpoint", null);
var searchKey = _values.GetOrDefault("service.search.key", null);
- var project = await AiSdkConsoleGui.PickOrCreateAndConfigAiHubProject(allowCreate, allowPick, allowSkipDeployments, allowSkipSearch, _values, subscription, resourceId, groupName, openAiEndpoint, openAiKey, searchEndpoint, searchKey);
+ // Special case for "existing" AI project. The UI skips presenting the user with a choice of AI hub resource
+ // since they directly choose a project. So we add back this missing telemetry event here
+ if (!allowCreate && allowPick)
+ {
+ Program.Telemetry.LogEvent(new InitTelemetryEvent(InitStage.Resource)
+ {
+ Outcome = Outcome.Success,
+ Selected = "project",
+ DurationInMs = 0,
+ RunId = _values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = _values.GetOrDefault("telemetry.init.run_type", null)
+ });
+ }
+
+ bool createdNew = false;
+ AiHubProjectInfo project = Program.Telemetry.Wrap(
+ () => AiSdkConsoleGui.PickOrCreateAiHubProject(allowCreate, allowPick, _values, subscription, resourceId, out createdNew),
+ (outcome, project, ex, timeTaken) => new InitTelemetryEvent(InitStage.Project)
+ {
+ Outcome = outcome,
+ Selected = createdNew ? "new" : "existing",
+ RunId = _values.GetOrDefault("telemetry.init.run_id", null),
+ RunType = _values.GetOrDefault("telemetry.init.run_type", null),
+ DurationInMs = timeTaken.TotalMilliseconds,
+ Error = ex?.Message
+ });
+
+ // TODO FIXME: There was a bug in the what used to one method call that was split into two. Namely when allowCreate == true and allowPick == false,
+ // createdNew would not be correctly to true. The ConfigAiHubProject relies on this bug so restore this broken behaviour here.
+ // This will be fixed in a future re-factor/simplification of this code
+ if (allowCreate && !allowPick)
+ {
+ createdNew = false;
+ }
+
+ await AiSdkConsoleGui.ConfigAiHubProject(_values, project, createdNew, allowSkipDeployments, allowSkipSearch, subscription, resourceId, groupName, openAiEndpoint, openAiKey, searchEndpoint, searchKey);
ProjectNameToken.Data().Set(_values, project.Name);
_values.Reset("service.project.id", project.Id);
@@ -408,7 +525,7 @@ private async Task DoInitOpenAi(bool interactive, bool allowSkipDeployments = tr
var embeddingsDeploymentFilter = _values.GetOrDefault("init.embeddings.model.deployment.name", "");
var evaluationsDeploymentFilter = _values.GetOrDefault("init.evaluation.model.deployment.name", "");
- var resource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(interactive, allowSkipDeployments, subscriptionId, regionFilter, groupFilter, resourceFilter, kind, sku, yes, chatDeploymentFilter, embeddingsDeploymentFilter, evaluationsDeploymentFilter);
+ var resource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(_values, interactive, allowSkipDeployments, subscriptionId, regionFilter, groupFilter, resourceFilter, kind, sku, yes, chatDeploymentFilter, embeddingsDeploymentFilter, evaluationsDeploymentFilter);
_values.Reset("service.openai.deployments.picked", "true");
SubscriptionToken.Data().Set(_values, subscriptionId);
@@ -439,7 +556,7 @@ private async Task DoInitCognitiveServicesAIServicesKind(bool interactive, bool
var sku = _values.GetOrDefault("init.service.cognitiveservices.resource.sku", Program.CognitiveServiceResourceSku);
var yes = _values.GetOrDefault("init.service.cognitiveservices.terms.agree", false);
- var resource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesAiServicesKindResource(interactive, allowSkipDeployments, subscriptionId, regionFilter, groupFilter, resourceFilter, kind, sku, yes);
+ var resource = await AzCliConsoleGui.PickOrCreateAndConfigCognitiveServicesAiServicesKindResource(_values, interactive, allowSkipDeployments, subscriptionId, regionFilter, groupFilter, resourceFilter, kind, sku, yes);
SubscriptionToken.Data().Set(_values, subscriptionId);
_values.Reset("service.resource.region.name", resource.RegionLocation);
diff --git a/src/common/details/helpers/file_helpers.cs b/src/common/details/helpers/file_helpers.cs
index fbaddedb..4351303a 100644
--- a/src/common/details/helpers/file_helpers.cs
+++ b/src/common/details/helpers/file_helpers.cs
@@ -1376,7 +1376,7 @@ private static string GetGlobalConfigDotDir(bool mustExist = true, bool createIf
return CheckDotDirectory(GetAppDataDir(), mustExist, createIfDoesnt);
}
- private static string GetUserConfigDotDir(bool mustExist = true, bool createIfDoesnt = false)
+ internal static string GetUserConfigDotDir(bool mustExist = true, bool createIfDoesnt = false)
{
return CheckDotDirectory(GetAppUserDir(), mustExist, createIfDoesnt);
}
diff --git a/src/common/details/helpers/login_helpers.cs b/src/common/details/helpers/login_helpers.cs
index 68c6e34f..bc00af19 100644
--- a/src/common/details/helpers/login_helpers.cs
+++ b/src/common/details/helpers/login_helpers.cs
@@ -13,10 +13,12 @@ public class LoginHelpers
{
public static async Task> GetResponseOnLogin(bool allowInteractiveLogin, string label, Func>> getResponse, string titleLabel = "Name")
{
- Console.Write($"\r{titleLabel}: *** Loading choices ***");
+ string message = $"\r{titleLabel}: *** Loading choices ***";
+ Console.Write(message);
+
var response = await getResponse();
- Console.Write($"\r{titleLabel}: ");
+ Console.Write($"\r{new string(' ', message.Length)}\r{titleLabel}: ");
if (string.IsNullOrEmpty(response.Output.StdOutput) && !string.IsNullOrEmpty(response.Output.StdError))
{
if (LoginHelpers.HasLoginError(response.Output.StdError))
diff --git a/src/common/details/named_values/named_values.cs b/src/common/details/named_values/named_values.cs
index 52c5547b..7cb7542d 100644
--- a/src/common/details/named_values/named_values.cs
+++ b/src/common/details/named_values/named_values.cs
@@ -8,6 +8,8 @@
using System.Linq;
using System.Text;
using System.IO;
+using System.ComponentModel;
+using System.Xml.Linq;
namespace Azure.AI.Details.Common.CLI
{
@@ -56,6 +58,25 @@ public static string DemandGetOrDefault(this INamedValues values, string name, s
return value;
}
+ public static TVal GetOrAdd(this INamedValues values, string name, Func creator)
+ {
+ var converter = TypeDescriptor.GetConverter(typeof(TVal));
+
+ // TODO Should we have a TryGet pattern instead to avoid double lookups?
+ if (values.Contains(name, true))
+ {
+ string stringValue = values[name];
+ return (TVal)converter.ConvertFromInvariantString(stringValue);
+ }
+ else
+ {
+ TVal val = creator();
+ string stringValue = converter.ConvertToInvariantString(val);
+ values.Add(name, stringValue);
+ return val;
+ }
+ }
+
public static string ReplaceValues(this string s, INamedValues values)
{
if (s == null || !s.Contains("{") || !s.Contains("}")) return s;
diff --git a/src/telemetry/AriaEventSerializer.cs b/src/telemetry/AriaEventSerializer.cs
new file mode 100644
index 00000000..e2f98ef2
--- /dev/null
+++ b/src/telemetry/AriaEventSerializer.cs
@@ -0,0 +1,114 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
+//
+
+using Microsoft.Applications.Events;
+using System.Reflection;
+using AriaPii = Microsoft.Applications.Events.PiiKind;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry
+{
+ [System.Diagnostics.DebuggerStepThrough]
+ internal class AriaEventSerializer
+ {
+ public EventProperties Serialize(ITelemetryEvent evt)
+ {
+ if (evt == null)
+ {
+ throw new ArgumentNullException(nameof(evt));
+ }
+
+ var eventData = new EventProperties();
+ eventData.Name = evt.Name;
+
+ // TODO this could be optimized by generating and caching the dynamic code to do this generation
+ // instead of needing to use reflection each time
+
+ var publicProps = evt.GetType()
+ .GetProperties(BindingFlags.Public | BindingFlags.Instance)
+ .Where(p => p.CanRead && p.Name != "Name");
+
+ foreach (var prop in publicProps)
+ {
+ string name = prop.Name;
+ AriaPii pii = ToAriaPII(prop.GetCustomAttribute(true)?.Kind ?? PiiKind.None);
+ object? value = prop.GetValue(evt);
+
+ switch (value)
+ {
+ case null:
+ // do nothing
+ break;
+
+ case string strValue:
+ eventData.SetProperty(name, strValue, pii);
+ break;
+
+ case bool boolValue:
+ eventData.SetProperty(name, boolValue, pii);
+ break;
+
+ case DateTime dtValue:
+ eventData.SetProperty(name, dtValue, pii);
+ break;
+
+ case DateTimeOffset dtValue:
+ eventData.SetProperty(name, dtValue.UtcDateTime, pii);
+ break;
+
+ case Guid guidValue:
+ eventData.SetProperty(name, guidValue, pii);
+ break;
+
+ case sbyte:
+ case short:
+ case int:
+ case byte:
+ case ushort:
+ case uint:
+ case long:
+ eventData.SetProperty(name, Convert.ToInt64(value), pii);
+ break;
+
+ case float:
+ case double:
+ case ulong:
+ eventData.SetProperty(name, Convert.ToDouble(value), pii);
+ break;
+
+ case Enum enumValue:
+ eventData.SetProperty(name, value.ToString(), pii);
+ break;
+
+ default:
+ // don't know how to handle this type so try to use the generic TypeConverter to get a string
+ var conv = System.ComponentModel.TypeDescriptor.GetConverter(prop.PropertyType);
+ string? strVal = conv.ConvertToInvariantString(value);
+ if (strVal != null)
+ {
+ eventData.SetProperty(name, strVal, pii);
+ }
+ break;
+ }
+ }
+
+ return eventData;
+ }
+
+ private static AriaPii ToAriaPII(PiiKind kind)
+ {
+ switch (kind)
+ {
+ case PiiKind.None: return AriaPii.None;
+ case PiiKind.UserId: return AriaPii.Identity;
+ case PiiKind.IP4Address: return AriaPii.IPv4Address;
+ case PiiKind.IP6Address: return AriaPii.IPv6Address;
+ case PiiKind.Uri: return AriaPii.Uri;
+
+ // better to err on the side of caution and assume a higher PII
+ default: return AriaPii.Identity;
+ }
+ }
+ }
+}
diff --git a/src/telemetry/AriaTelemetry.cs b/src/telemetry/AriaTelemetry.cs
new file mode 100644
index 00000000..248a0315
--- /dev/null
+++ b/src/telemetry/AriaTelemetry.cs
@@ -0,0 +1,139 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
+//
+
+using System.Text;
+using System.Text.Json;
+using Microsoft.Applications.Events;
+
+namespace Azure.AI.Details.Common.CLI.Telemetry
+{
+ ///
+ /// An implementation that uses Aria for telemetry. See for more information about Aria
+ ///
+ /// This creates and maintains a JSON file in the .config user profile directory to store some information between
+ /// runs for Aria. For example, a GUID is generated and used as the user ID for now the first time this code is run
+ public class AriaTelemetry : ITelemetry
+ {
+ private ILogger _logger;
+ private AriaEventSerializer _serializer;
+ private readonly string _userAgent;
+ private readonly AriaUserTelemetryConfig _userConfig;
+
+ public AriaTelemetry(string tenantToken, IProgramData programData)
+ {
+ if (string.IsNullOrWhiteSpace(tenantToken))
+ {
+ throw new ArgumentNullException(nameof(tenantToken));
+ }
+
+ EVTStatus status = LogManager.Start();
+ ValidateStatus(status);
+
+ _logger = LogManager.GetLogger(tenantToken, out status);
+ ValidateStatus(status);
+
+ _serializer = new AriaEventSerializer();
+ _userAgent = programData?.TelemetryUserAgent ?? string.Empty;
+ _userConfig = GetOrCreateUserConfig();
+
+ // set common event properties
+ _logger.SetContext("UserId", _userConfig.UserId, Microsoft.Applications.Events.PiiKind.Identity);
+ if (programData?.TelemetryUserAgent != null)
+ {
+ _logger.SetContext("UserAgent", _userAgent);
+ }
+ }
+
+ public void LogEvent(ITelemetryEvent evt)
+ {
+ if (evt == null)
+ {
+ return;
+ }
+
+ EventProperties eventProps = _serializer.Serialize(evt);
+ _logger.LogEvent(eventProps);
+ }
+
+ public async ValueTask DisposeAsync()
+ {
+ await LogManager.UploadNowAsync()
+ .ConfigureAwait(false);
+
+ LogManager.Teardown();
+ }
+
+ private static void ValidateStatus(EVTStatus status)
+ {
+ if (status == EVTStatus.OK || status == EVTStatus.AlreadyStarted)
+ {
+ // success
+ }
+ else
+ {
+ throw new ApplicationException("Failed to start Aria telemetry. ErrorCode: " + status);
+ }
+ }
+
+ private static AriaUserTelemetryConfig GetOrCreateUserConfig()
+ {
+ var encoding = new UTF8Encoding(false, true);
+
+ string ariaUserConfig = Path.Combine(
+ FileHelpers.GetUserConfigDotDir(false),
+ "config",
+ "telemetry.user.aria.json");
+
+ AriaUserTelemetryConfig? config = null;
+ bool dirty = false;
+ try
+ {
+ if (File.Exists(ariaUserConfig))
+ {
+ config = JsonSerializer.Deserialize(
+ File.ReadAllText(ariaUserConfig, encoding));
+ }
+
+ if (config == null)
+ {
+ dirty = true;
+ config = new AriaUserTelemetryConfig()
+ {
+ UserId = string.Empty
+ };
+ }
+
+ if (!Guid.TryParse(config.UserId, out _))
+ {
+ dirty = true;
+ config.UserId = Guid.NewGuid().ToString("D");
+ }
+
+ if (dirty)
+ {
+ FileHelpers.WriteAllText(
+ ariaUserConfig,
+ JsonSerializer.Serialize(config),
+ encoding);
+ }
+
+ return config;
+ }
+ catch (Exception)
+ {
+ return config ?? new AriaUserTelemetryConfig()
+ {
+ UserId = "00000000-0000-0000-0000-000000000000"
+ };
+ }
+ }
+
+ private class AriaUserTelemetryConfig
+ {
+ public required string UserId { get; set; }
+ public DateTimeOffset Timestamp { get; set; } = DateTimeOffset.UtcNow;
+ }
+ }
+}
diff --git a/src/telemetry/telemetry.aria.csproj b/src/telemetry/telemetry.aria.csproj
new file mode 100644
index 00000000..dcb1897a
--- /dev/null
+++ b/src/telemetry/telemetry.aria.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net8.0
+ enable
+ enable
+ Azure.AI.Details.Common.CLI.Telemetry
+ Azure.AI.CLI.Common.Telemetry.Aria
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/ai_chat_tests.yaml b/tests/ai_chat_tests.yaml
index 8934f30e..643a663c 100644
--- a/tests/ai_chat_tests.yaml
+++ b/tests/ai_chat_tests.yaml
@@ -73,11 +73,11 @@
value: /test.txt
input: |
Create a file named "test.txt" with the following content: "Hello, World!"
- What files are in the current directory?
+ What text files are in the current directory?
Show me what's in the file "test.txt"
expect: |
assistant-function: CreateFileAndSaveText
- assistant-function: FindAllFilesInCurrentDirectory
+ assistant-function: FindAllFilesMatchingPattern
test.txt
Hello, World!
diff --git a/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json b/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json
index 26d785ab..4eeec7c4 100644
--- a/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json
+++ b/tests/recordings/yaml.ai_chat_tests.TestCases.test ai chat built in functions.json
@@ -1,5 +1,95 @@
{
"Entries": [
+ {
+ "RequestUri": "https://fakeendpoint/v3-flatcontainer/azure.ai.cli/index.json",
+ "RequestMethod": "GET",
+ "RequestHeaders": {
+ "Connection": "close",
+ "X-Forwarded-For": "127.0.0.1",
+ "X-Forwarded-Proto": "https",
+ "X-Real-IP": "127.0.0.1"
+ },
+ "RequestBody": null,
+ "StatusCode": 200,
+ "ResponseHeaders": {
+ "Accept-Ranges": "bytes",
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Expose-Headers": "x-ms-request-id,Server,x-ms-version,Content-Type,Cache-Control,Last-Modified,ETag,x-ms-lease-status,x-ms-blob-type,Content-Length,Date,Transfer-Encoding",
+ "Cache-Control": "no-store",
+ "Connection": "close",
+ "Content-Length": "289",
+ "Content-Type": "application/json",
+ "Date": "Tue, 12 Mar 2024 01:03:12 GMT",
+ "ETag": "0x8DC2F70EE1F211A",
+ "Last-Modified": "Sat, 17 Feb 2024 04:28:45 GMT",
+ "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
+ "x-azure-ref": "20240312T010312Z-gsc99wtxs54adbdwpz68rg1mhg00000004d0000000012t9y",
+ "X-Cache": "PRIVATE_NOSTORE",
+ "X-Content-Type-Options": "nosniff",
+ "x-fd-int-roxy-purgeid": "0",
+ "x-ms-blob-type": "BlockBlob",
+ "x-ms-lease-status": "unlocked",
+ "x-ms-request-id": "1a93fdbd-d01e-005c-6f19-74e8af000000",
+ "x-ms-version": "2009-09-19"
+ },
+ "ResponseBody": {
+ "versions": [
+ "1.0.0-preview-20231115.3",
+ "1.0.0-preview-20231116.1",
+ "1.0.0-preview-20231205.4",
+ "1.0.0-preview-20231208.1",
+ "1.0.0-preview-20231214.1",
+ "1.0.0-preview-20240207.1",
+ "1.0.0-preview-20240215.1",
+ "1.0.0-preview-20240216.1"
+ ]
+ }
+ },
+ {
+ "RequestUri": "https://fakeendpoint/v3-flatcontainer/azure.ai.cli/index.json",
+ "RequestMethod": "GET",
+ "RequestHeaders": {
+ "Connection": "close",
+ "X-Forwarded-For": "127.0.0.1",
+ "X-Forwarded-Proto": "https",
+ "X-Real-IP": "127.0.0.1"
+ },
+ "RequestBody": null,
+ "StatusCode": 200,
+ "ResponseHeaders": {
+ "Accept-Ranges": "bytes",
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Expose-Headers": "x-ms-request-id,Server,x-ms-version,Content-Type,Cache-Control,Last-Modified,ETag,x-ms-lease-status,x-ms-blob-type,Content-Length,Date,Transfer-Encoding",
+ "Cache-Control": "no-store",
+ "Connection": "close",
+ "Content-Length": "289",
+ "Content-Type": "application/json",
+ "Date": "Tue, 12 Mar 2024 01:03:12 GMT",
+ "ETag": "0x8DC2F70EE1F211A",
+ "Last-Modified": "Sat, 17 Feb 2024 04:28:45 GMT",
+ "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
+ "x-azure-ref": "20240312T010312Z-m6rvsf5d4x4r58fkrx97ugq5f00000000cfg000000018049",
+ "X-Cache": "PRIVATE_NOSTORE",
+ "X-Content-Type-Options": "nosniff",
+ "x-fd-int-roxy-purgeid": "0",
+ "x-ms-blob-type": "BlockBlob",
+ "x-ms-lease-status": "unlocked",
+ "x-ms-request-id": "bc032441-201e-0015-7b19-74aa44000000",
+ "x-ms-version": "2009-09-19"
+ },
+ "ResponseBody": {
+ "versions": [
+ "1.0.0-preview-20231115.3",
+ "1.0.0-preview-20231116.1",
+ "1.0.0-preview-20231205.4",
+ "1.0.0-preview-20231208.1",
+ "1.0.0-preview-20231214.1",
+ "1.0.0-preview-20240207.1",
+ "1.0.0-preview-20240215.1",
+ "1.0.0-preview-20240216.1"
+ ]
+ }
+ },
{
"RequestUri": "https://fakeendpoint/openai/deployments/gpt-4-32k-0613/chat/completions?api-version=2023-12-01-preview",
"RequestMethod": "POST",
@@ -12,7 +102,7 @@
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "6a37607f-3fa1-46d7-b460-f7dbc28d3b25",
+ "x-ms-client-request-id": "d229c621-fb99-414e-8452-1b9799ff33f5",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -414,45 +504,46 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "d76ae776-7ed2-4401-8d20-bf6ab3df7cd2",
- "azureml-model-session": "d027-20240123024829",
+ "apim-request-id": "386c478f-3ddf-4da7-a8f3-991361f08c5e",
+ "azureml-model-session": "d063-20240306214519",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:24:56 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:13 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "6a37607f-3fa1-46d7-b460-f7dbc28d3b25",
+ "x-ms-client-request-id": "d229c621-fb99-414e-8452-1b9799ff33f5",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
"x-ratelimit-remaining-requests": "48",
"x-ratelimit-remaining-tokens": "49968",
- "X-Request-ID": "5bfeb8aa-4e5e-48ca-a789-ad5b5cb3dd26"
+ "X-Request-ID": "cfbd615f-b66c-435e-a4de-681435a63f16"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022CreateFileAndSaveText\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022,\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022text\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022Hello\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022,\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 World\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022!\\\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsZOBdlS19LY96saHRHepv1p7X7\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068295,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\u0022,\u0022name\u0022:\u0022CreateFileAndSaveText\u0022},\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022,\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022text\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022Hello\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022,\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 World\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022!\\\u0022\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205392,\u0022id\u0022:\u0022chatcmpl-91kpsq6DBZJZN43BZ2Bf8KI367cfJ\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
},
@@ -468,7 +559,7 @@
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "8f6d6e3c-3bf7-4988-8391-bc59eb52d513",
+ "x-ms-client-request-id": "7b653b2f-58c1-4fd3-af4d-33223033139f",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -883,44 +974,46 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "d9e04ab9-bba5-4657-9d41-cb7a0dca7b00",
- "azureml-model-session": "d031-20240123065239",
+ "apim-request-id": "7480e34b-8c80-4f6b-9ce0-34106d69bd09",
+ "azureml-model-session": "d067-20240307012949",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:24:58 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:14 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "8f6d6e3c-3bf7-4988-8391-bc59eb52d513",
+ "x-ms-client-request-id": "7b653b2f-58c1-4fd3-af4d-33223033139f",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
- "x-ratelimit-remaining-requests": "48",
+ "x-ratelimit-remaining-requests": "47",
"x-ratelimit-remaining-tokens": "49952",
- "X-Request-ID": "9b6623e5-9bea-47dd-85a8-10957af2a75b"
+ "X-Request-ID": "11766b45-0551-4bd4-9293-d48abaff5216"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 have\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 created\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 named\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 with\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsbzUcxUnIt2UYySOrl3L3Qw1e6\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068297,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022I\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 have\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 successfully\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 created\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 a\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 named\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 with\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205395,\u0022id\u0022:\u0022chatcmpl-91kpvOuns2KUv2MUYGBWVOTZDDiEa\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
},
@@ -931,12 +1024,12 @@
"Accept": "application/json",
"api-key": "00000000-0000-0000-0000-000000000000",
"Connection": "close",
- "Content-Length": "6070",
+ "Content-Length": "6088",
"Content-Type": "application/json",
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "1337ba00-c464-4bb4-8270-fabd726bf88c",
+ "x-ms-client-request-id": "8a18235b-e5b8-445b-8d05-81aad8446fee",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -964,11 +1057,11 @@
"role": "function"
},
{
- "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
+ "content": "I have successfully created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
"role": "assistant"
},
{
- "content": "What files are in the current directory?",
+ "content": "What text files are in the current directory?",
"role": "user"
}
],
@@ -1359,27 +1452,36 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "298d0078-3018-4c63-b05f-8dba7eda968b",
- "azureml-model-session": "d032-20240123075009",
+ "apim-request-id": "f8486160-ad03-4dd8-b5d8-8b0a9547f81e",
+ "azureml-model-session": "d061-20240306200608",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:24:59 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:16 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "1337ba00-c464-4bb4-8270-fabd726bf88c",
+ "x-ms-client-request-id": "8a18235b-e5b8-445b-8d05-81aad8446fee",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
- "x-ratelimit-remaining-requests": "47",
+ "x-ratelimit-remaining-requests": "46",
"x-ratelimit-remaining-tokens": "49936",
- "X-Request-ID": "822a0ed0-e4f7-4525-b303-72137dfc91ad"
+ "X-Request-ID": "5c61d939-9897-4c7b-8ad2-72b3e34529f7"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsd3prB1yAKAF1GdANEEitkZAyY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068299,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022FindAllFilesInCurrentDirectory\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsd3prB1yAKAF1GdANEEitkZAyY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068299,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsd3prB1yAKAF1GdANEEitkZAyY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068299,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\u0022,\u0022name\u0022:\u0022FindAllFilesMatchingPattern\u0022},\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022pattern\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022*.\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022txt\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205396,\u0022id\u0022:\u0022chatcmpl-91kpwDsOWVNFSSdQ7w6mdWimyjA1H\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
},
@@ -1390,12 +1492,12 @@
"Accept": "application/json",
"api-key": "00000000-0000-0000-0000-000000000000",
"Connection": "close",
- "Content-Length": "6262",
+ "Content-Length": "6318",
"Content-Type": "application/json",
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "e0fca20c-940b-460b-b8e8-b408d197fe4c",
+ "x-ms-client-request-id": "a8b00f9b-68e6-4e1b-9e16-555366894a2a",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -1423,23 +1525,23 @@
"role": "function"
},
{
- "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
+ "content": "I have successfully created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
"role": "assistant"
},
{
- "content": "What files are in the current directory?",
+ "content": "What text files are in the current directory?",
"role": "user"
},
{
"content": "",
"function_call": {
- "name": "FindAllFilesInCurrentDirectory",
- "arguments": "{}"
+ "name": "FindAllFilesMatchingPattern",
+ "arguments": "{\n \u0022pattern\u0022: \u0022*.txt\u0022\n}"
},
"role": "assistant"
},
{
- "name": "FindAllFilesInCurrentDirectory",
+ "name": "FindAllFilesMatchingPattern",
"content": "./test.txt",
"role": "function"
}
@@ -1831,38 +1933,39 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "24ba9fef-4493-4587-908d-10b79a391a73",
- "azureml-model-session": "d027-20240123024829",
+ "apim-request-id": "de853390-317b-4b4e-998d-f521d94b8a50",
+ "azureml-model-session": "d065-20240306232947",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:25:00 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:19 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "e0fca20c-940b-460b-b8e8-b408d197fe4c",
+ "x-ms-client-request-id": "a8b00f9b-68e6-4e1b-9e16-555366894a2a",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
"x-ratelimit-remaining-requests": "46",
"x-ratelimit-remaining-tokens": "49920",
- "X-Request-ID": "751270d6-a6ef-40f1-bd9b-76f07a9473fa"
+ "X-Request-ID": "6beb0e20-7c49-48e3-949a-ca30df8c01fb"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 only\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 current\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 directory\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsegq9o4mrlUgPrSO94xyb4GRdf\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068300,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 text\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 in\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 current\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 directory\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022.\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205399,\u0022id\u0022:\u0022chatcmpl-91kpzb7kwE1PKIH3vRCImSJcXZJO9\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
},
@@ -1873,12 +1976,12 @@
"Accept": "application/json",
"api-key": "00000000-0000-0000-0000-000000000000",
"Connection": "close",
- "Content-Length": "6440",
+ "Content-Length": "6496",
"Content-Type": "application/json",
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "6087aa84-7e9e-477a-beca-83fcebbfca00",
+ "x-ms-client-request-id": "27befb4d-d82c-4614-90aa-1959860451ea",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -1906,28 +2009,28 @@
"role": "function"
},
{
- "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
+ "content": "I have successfully created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
"role": "assistant"
},
{
- "content": "What files are in the current directory?",
+ "content": "What text files are in the current directory?",
"role": "user"
},
{
"content": "",
"function_call": {
- "name": "FindAllFilesInCurrentDirectory",
- "arguments": "{}"
+ "name": "FindAllFilesMatchingPattern",
+ "arguments": "{\n \u0022pattern\u0022: \u0022*.txt\u0022\n}"
},
"role": "assistant"
},
{
- "name": "FindAllFilesInCurrentDirectory",
+ "name": "FindAllFilesMatchingPattern",
"content": "./test.txt",
"role": "function"
},
{
- "content": "The only file in the current directory is \u0022test.txt\u0022.",
+ "content": "The text file in the current directory is \u0022test.txt\u0022.",
"role": "assistant"
},
{
@@ -2322,36 +2425,37 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "0b27c083-5de7-41cf-ab69-2326f6ffaa6a",
- "azureml-model-session": "d033-20240123084552",
+ "apim-request-id": "6236c7d1-f93c-4e58-bfe5-980290435052",
+ "azureml-model-session": "d064-20240306223759",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:25:01 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:20 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "6087aa84-7e9e-477a-beca-83fcebbfca00",
+ "x-ms-client-request-id": "27befb4d-d82c-4614-90aa-1959860451ea",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
"x-ratelimit-remaining-requests": "45",
"x-ratelimit-remaining-tokens": "49904",
- "X-Request-ID": "8bd62cea-0767-4184-afd0-eb060c70b140"
+ "X-Request-ID": "8b9314f1-b23f-4fe7-93d5-a690ce5df680"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022,\u0022function_call\u0022:{\u0022name\u0022:\u0022ReadTextFromFile\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\\n\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsfgnG6D1BfPzDoIj3HHrCuKeZY\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068301,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\u0022,\u0022name\u0022:\u0022ReadTextFromFile\u0022},\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022{\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022fileName\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022:\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022 \\\u0022\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022test\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022.txt\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022\\\u0022\\n\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022function_call\u0022:{\u0022arguments\u0022:\u0022}\u0022}},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022function_call\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205400,\u0022id\u0022:\u0022chatcmpl-91kq01IF8rTgzD6npaOV2mh0vEbGk\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
},
@@ -2362,12 +2466,12 @@
"Accept": "application/json",
"api-key": "00000000-0000-0000-0000-000000000000",
"Connection": "close",
- "Content-Length": "6655",
+ "Content-Length": "6711",
"Content-Type": "application/json",
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "175259e2-c460-42de-b360-2d0b49bb31d8",
+ "x-ms-client-request-id": "388db860-f1dd-4a8d-bb1e-94a11449076c",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -2395,28 +2499,28 @@
"role": "function"
},
{
- "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
+ "content": "I have successfully created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
"role": "assistant"
},
{
- "content": "What files are in the current directory?",
+ "content": "What text files are in the current directory?",
"role": "user"
},
{
"content": "",
"function_call": {
- "name": "FindAllFilesInCurrentDirectory",
- "arguments": "{}"
+ "name": "FindAllFilesMatchingPattern",
+ "arguments": "{\n \u0022pattern\u0022: \u0022*.txt\u0022\n}"
},
"role": "assistant"
},
{
- "name": "FindAllFilesInCurrentDirectory",
+ "name": "FindAllFilesMatchingPattern",
"content": "./test.txt",
"role": "function"
},
{
- "content": "The only file in the current directory is \u0022test.txt\u0022.",
+ "content": "The text file in the current directory is \u0022test.txt\u0022.",
"role": "assistant"
},
{
@@ -2824,41 +2928,43 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "f464ea1a-136e-4fef-9d91-d4aaf4c2e6de",
- "azureml-model-session": "d029-20240123045238",
+ "apim-request-id": "6c702729-6691-4d82-b698-41a0a41531de",
+ "azureml-model-session": "d060-20240306191904",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:25:04 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:22 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "175259e2-c460-42de-b360-2d0b49bb31d8",
+ "x-ms-client-request-id": "388db860-f1dd-4a8d-bb1e-94a11449076c",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
"x-ratelimit-remaining-requests": "44",
"x-ratelimit-remaining-tokens": "49888",
- "X-Request-ID": "e2bb4666-f74c-451d-ab21-6a11f45343f1"
+ "X-Request-ID": "ac450622-6249-41fe-b05a-269c72ad97e9"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smshKWJdtKLboay3Ey5fBpJcGaDd\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068303,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022The\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 content\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 of\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 the\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 file\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022test\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022.txt\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022\\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022:\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 \\\u0022\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022Hello\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 World\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022!\\\u0022.\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205402,\u0022id\u0022:\u0022chatcmpl-91kq21SJV6YQosjeoNR2A8QBtSX7z\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
},
@@ -2869,12 +2975,12 @@
"Accept": "application/json",
"api-key": "00000000-0000-0000-0000-000000000000",
"Connection": "close",
- "Content-Length": "6798",
+ "Content-Length": "6855",
"Content-Type": "application/json",
"User-Agent": "azsdk-net-AI.OpenAI/1.0.0-beta.13 (.NET 8.0.2; Microsoft Windows 10.0.22631)",
"X-Forwarded-For": "127.0.0.1",
"X-Forwarded-Proto": "https",
- "x-ms-client-request-id": "b4a06586-5d86-4f9c-83b9-b1dbe5eb89df",
+ "x-ms-client-request-id": "e0c0f50b-d21e-4290-9228-0a5f6c4af221",
"x-ms-return-client-request-id": "true",
"X-Real-IP": "127.0.0.1"
},
@@ -2902,28 +3008,28 @@
"role": "function"
},
{
- "content": "I have created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
+ "content": "I have successfully created a file named \u0022test.txt\u0022 with the content \u0022Hello, World!\u0022.",
"role": "assistant"
},
{
- "content": "What files are in the current directory?",
+ "content": "What text files are in the current directory?",
"role": "user"
},
{
"content": "",
"function_call": {
- "name": "FindAllFilesInCurrentDirectory",
- "arguments": "{}"
+ "name": "FindAllFilesMatchingPattern",
+ "arguments": "{\n \u0022pattern\u0022: \u0022*.txt\u0022\n}"
},
"role": "assistant"
},
{
- "name": "FindAllFilesInCurrentDirectory",
+ "name": "FindAllFilesMatchingPattern",
"content": "./test.txt",
"role": "function"
},
{
- "content": "The only file in the current directory is \u0022test.txt\u0022.",
+ "content": "The text file in the current directory is \u0022test.txt\u0022.",
"role": "assistant"
},
{
@@ -2944,7 +3050,7 @@
"role": "function"
},
{
- "content": "The content of the file \u0022test.txt\u0022 is \u0022Hello, World!\u0022.",
+ "content": "The content of the file \u0022test.txt\u0022 is: \u0022Hello, World!\u0022.",
"role": "assistant"
},
{
@@ -3339,35 +3445,47 @@
"StatusCode": 200,
"ResponseHeaders": {
"Access-Control-Allow-Origin": "*",
- "apim-request-id": "8130c8fc-122b-4371-9eaf-60b1e1b87405",
- "azureml-model-session": "d034-20240123094448",
+ "apim-request-id": "840be0d6-69f3-4f74-8ee7-04aa42769005",
+ "azureml-model-session": "d066-20240307003746",
"Cache-Control": "must-revalidate, no-cache",
"Connection": "close",
"Content-Type": "text/event-stream",
- "Date": "Fri, 16 Feb 2024 07:25:05 GMT",
+ "Date": "Tue, 12 Mar 2024 01:03:24 GMT",
"Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
"Transfer-Encoding": "chunked",
"x-accel-buffering": "no",
"X-Content-Type-Options": "nosniff",
- "x-ms-client-request-id": "b4a06586-5d86-4f9c-83b9-b1dbe5eb89df",
+ "x-ms-client-request-id": "e0c0f50b-d21e-4290-9228-0a5f6c4af221",
+ "x-ms-rai-invoked": "true",
"x-ms-region": "East US 2",
- "x-ratelimit-remaining-requests": "43",
+ "x-ratelimit-remaining-requests": "44",
"x-ratelimit-remaining-tokens": "49872",
- "X-Request-ID": "f292b865-8dd4-4e5b-bf5b-1e08e3b0e4c6"
+ "X-Request-ID": "69c385c9-1afd-4147-b0e3-03cf29354049"
},
"ResponseBody": [
- "data: {\u0022id\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022created\u0022:0,\u0022model\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}],\u0022choices\u0022:[]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022content_filter_results\u0022:{}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022Sure\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 how\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 can\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 I\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 assist\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022 further\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:null,\u0022index\u0022:0,\u0022delta\u0022:{\u0022content\u0022:\u0022?\u0022},\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
- "data: {\u0022id\u0022:\u0022chatcmpl-8smsjghwpRqrILNSOGUsH3tMJnBAx\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022created\u0022:1708068305,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022choices\u0022:[{\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0,\u0022delta\u0022:{},\u0022content_filter_results\u0022:{}}]}\n\n",
+ "data: {\u0022choices\u0022:[],\u0022created\u0022:0,\u0022id\u0022:\u0022\u0022,\u0022model\u0022:\u0022\u0022,\u0022object\u0022:\u0022\u0022,\u0022prompt_filter_results\u0022:[{\u0022prompt_index\u0022:0,\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}}}]}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{\u0022role\u0022:\u0022assistant\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022I\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022\u0027m\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 sorry\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022,\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 but\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 it\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 seems\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 like\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 your\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 message\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 is\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 empty\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022.\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 Could\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 you\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 please\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 provide\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 more\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022 details\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{\u0022hate\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022self_harm\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022sexual\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022},\u0022violence\u0022:{\u0022filtered\u0022:false,\u0022severity\u0022:\u0022safe\u0022}},\u0022delta\u0022:{\u0022content\u0022:\u0022?\u0022},\u0022finish_reason\u0022:null,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
+ "data: {\u0022choices\u0022:[{\u0022content_filter_results\u0022:{},\u0022delta\u0022:{},\u0022finish_reason\u0022:\u0022stop\u0022,\u0022index\u0022:0}],\u0022created\u0022:1710205404,\u0022id\u0022:\u0022chatcmpl-91kq4LbZ8R4RnyH7nHJcrNRLCSltM\u0022,\u0022model\u0022:\u0022gpt-4-32k\u0022,\u0022object\u0022:\u0022chat.completion.chunk\u0022,\u0022system_fingerprint\u0022:null}\n\n",
"data: [DONE]\n\n"
]
}
diff --git a/tests/test3.yaml b/tests/test3.yaml
index 759917d1..04a58941 100644
--- a/tests/test3.yaml
+++ b/tests/test3.yaml
@@ -19,12 +19,12 @@
command: ai chat --interactive --built-in-functions
input: |
Create a file named "test.txt" with the following content: "Hello, World!"
- What files are in the current directory?
+ What text files are in the current directory?
Show me what's in the file "test.txt"
exit
expect: |
assistant-function: CreateFileAndSaveText
- assistant-function: FindAllFilesInCurrentDirectory
+ assistant-function: FindAllFilesMatchingPattern
test.txt
Hello, World!