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!