thread.run.step.delta  function error

Hi,
Thanks for your codes.
When I run it, there's a bug, output:
{"id":"step_euW1AwmD9GCR8MNEDiQrhFf0","object":"thread.run.step.delta","delta":{"step_details":{"type":"tool_calls","tool_calls":[{"index":0,"id":"call_H38Y41KBneAlPFBrnrbwbx9j","type":"function","function":{"name":"§HANGUP","arguments":"","output":null}}]}}}
See the function name is "§HANGUP" output. But the name should be "HANGUP“. How the "§" comes? it comes up random. Some time dose not appear. Sometimes dose.

@hlzhangxt thanks for using simple-openai. Please, could you share your complete request data?

Here:
"object": "list",
"data": [
{
"id": "run_TejmGUzKan9410MFWbprOWY4",
"object": "thread.run",
"created_at":<PHONE_NUMBER>,
"assistant_id": "asst_avZFQkOkE9w3JLhhdg0HZ3Fh",
"thread_id": "thread_zagAsFg661WW04IkqzNoU43j",
"status": "completed",
"started_at":<PHONE_NUMBER>,
"expires_at": null,
"cancelled_at": null,
"failed_at": null,
"completed_at":<PHONE_NUMBER>,
"required_action": null,
"last_error": null,
"model": "gpt-4-0125-preview",
"instructions": "You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible!  If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to;  Ask the building address and unit#.\r\n     After you got the building address from the tenant, the  address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant.  And also retrieve the building code.  \r\n     But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n     And after you get the super  name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this?  Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions:  \r\n     Reported on what date?\r\n    What happened after it was reported\r\n   Asks Was this condition ever inspected?\r\n10.  Ask Can I conference in the super right now to help schedule an appointment?\r\n     If the tenant agrees,  let the tenant on hold please, then start calling( invoke conference super function)  the super into the conference.\r\n      or else say good bye and goodwill to end the conversation.",
"tools": [
{
"type": "function",
"function": {
"name": "HANGUP",
"description": "while caller or called person wants to end the conversation, hangup to disconnect the call",
"parameters": {
"type": "object",
"properties": {}
}
}
},
{
"type": "function",
"function": {
"name": "GETSUPER",
"description": "After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.",
"parameters": {
"type": "object",
"properties": {
"building_addr": {
"type": "string",
"description": "the confimed building address from the file attached, for example: 61 Main Street"
},
"building_code": {
"type": "string",
"description": "the building code retrieved from the attached building json file "
},
"tenant_name": {
"type": "string",
"description": "the tenant name the tenant provided"
},
"unit_no": {
"type": "string",
"description": "the unit number the tenant provided"
}
}
}
}
},
{
"type": "function",
"function": {
"name": "CONFSUPER",
"description": "After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference",
"parameters": {
"type": "object",
"properties": {}
}
}
},
{
"type": "function",
"function": {
"name": "SAVEAPPOINTMENTDATE",
"description": "After confirmed the appointment date and time with the super and the tenant, invoke this function to save them",
"parameters": {
"type": "object",
"properties": {
"appmtdate": {
"type": "string",
"description": "the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"
},
"appmttime": {
"type": "string",
"description": "the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"
}
}
}
}
},
{
"type": "function",
"function": {
"name": "SETSPANISHLANG",
"description": "If you have detected that the tenant speaks Spanish, invoke this function",
"parameters": {
"type": "object",
"properties": {}
}
}
},
{
"type": "retrieval"
}
],
"file_ids": [
"file-dSM5gE19t8hmlDFewYq8Ool6"
],
"metadata": {},
"temperature": 1.0,
"usage": {
"prompt_tokens": 1430,
"completion_tokens": 26,
"total_tokens": 1456
}
}
],
"first_id": "run_TejmGUzKan9410MFWbprOWY4",
"last_id": "run_TejmGUzKan9410MFWbprOWY4",
"has_more": false
}

And also, to process the function request, I code:
private void processFunction(io.github.sashirestela.openai.domain.assistant.ThreadRunStep.Function functionTool,
String threadId, io.github.sashirestela.openai.domain.assistant.ThreadRunStep.ToolCall toolCall,
BaseAgiScript agi) {
String funname = functionTool.getName().trim();
	if (funname.startsWith("§"))
		funname = funname.substring(1);
	String funargs = functionTool.getArguments();
	if (funargs.trim().equals(""))
		funargs = "{}";

	ChatFunctionCall cfc = new ChatFunctionCall(funname, funargs);

	System.out.print("\n\rfunctioncall stream arguments = " + cfc.getArguments());

	// var result;
	// = new HashMap<String,String>();
	ToolOutput tooloutput = ToolOutput.of(toolCall.getId(), "OK");

	Object result = null;
	try {
		result = functionExecutor.execute(cfc);

		tooloutput = ToolOutput.of(toolCall.getId(), JSON.toJSONString(result));

		// ToolOutputs.add(tooloutput);
		System.out.print("\n\rtooloutput = " + tooloutput.getOutput());

		// var runId = runStepDelta.getId();
		System.out.print("\n\rrun id = " + runId);
		System.out.print("\n\rthread id = " + threadId);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		tooloutput = ToolOutput.of(toolCall.getId(), e.toString());
	} finally {
		ToolOutputSubmission tosm = ToolOutputSubmission.builder().toolOutput(tooloutput).stream(true).build();
		var re = openAI.threads().submitToolOutputsStream(threadId, runId, tosm).join(); // System.out.print("\n\rafter

		processResponse(re, agi, threadId);
	}

	try {
		if (result != null)
			runFurtherAgi(cfc, result, agi);
	} catch (AgiException e1) {
		// TODO Auto-generated
		e1.printStackTrace();
	}
}

See I have to create a chatFunction from Function to run it.
The function name and parameters  I have to make some changes.

@hlzhangxt I've tried your code several times but I cannot replicate the issue.
This is the code:
package io.github.sashirestela.openai.playground;

import com.fasterxml.jackson.annotation.JsonPropertyDescription;

import io.github.sashirestela.openai.SimpleOpenAI;
import io.github.sashirestela.openai.domain.assistant.AssistantFunction;
import io.github.sashirestela.openai.domain.assistant.AssistantRequest;
import io.github.sashirestela.openai.domain.assistant.AssistantTool;
import io.github.sashirestela.openai.domain.assistant.Events;
import io.github.sashirestela.openai.domain.assistant.TextContent;
import io.github.sashirestela.openai.domain.assistant.ThreadMessageDelta;
import io.github.sashirestela.openai.domain.assistant.ThreadMessageRequest;
import io.github.sashirestela.openai.domain.assistant.ThreadRequest;
import io.github.sashirestela.openai.domain.assistant.ThreadRunRequest;
import io.github.sashirestela.openai.domain.chat.tool.ChatFunction;
import io.github.sashirestela.openai.function.Functional;

public class ReplicateFunctionNameIssue {

    public static void main(String[] args) {
        var openai = SimpleOpenAI.builder().apiKey(System.getenv("OPENAI_API_KEY")).build();
        var assistantService = openai.assistants();
        var threadService = openai.threads();

        var assistant = assistantService.create(AssistantRequest.builder()
                .model("gpt-4-0125-preview")
                .name("Nova Assistant")
                .instructions(
                        "You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.")
                .tool(AssistantTool.builder().function(AssistantFunction.function(ChatFunction.builder()
                        .name("HANGUP")
                        .description(
                                "while caller or called person wants to end the conversation, hangup to disconnect the call")
                        .functionalClass(HANGUP.class)
                        .build())).build())
                .tool(AssistantTool.builder().function(AssistantFunction.function(ChatFunction.builder()
                        .name("GETSUPER")
                        .description(
                                "After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.")
                        .functionalClass(GETSUPER.class)
                        .build())).build())
                .tool(AssistantTool.builder().function(AssistantFunction.function(ChatFunction.builder()
                        .name("CONFSUPER")
                        .description(
                                "After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference")
                        .functionalClass(CONFSUPER.class)
                        .build())).build())
                .tool(AssistantTool.builder().function(AssistantFunction.function(ChatFunction.builder()
                        .name("SAVEAPPOINTMENTDATE")
                        .description(
                                "After confirmed the appointment date and time with the super and the tenant, invoke this function to save them")
                        .functionalClass(SAVEAPPOINTMENTDATE.class)
                        .build())).build())
                .tool(AssistantTool.builder().function(AssistantFunction.function(ChatFunction.builder()
                        .name("SETSPANISHLANG")
                        .description(
                                "If you have detected that the tenant speaks Spanish, invoke this function")
                        .functionalClass(SETSPANISHLANG.class)
                        .build())).build())
                .tool(AssistantTool.RETRIEVAL)
                .build()).join();
        var assistantId = assistant.getId();
        System.out.println("Assistant was created with id: " + assistantId);

        var thread = threadService.create(ThreadRequest.builder()
                .message(ThreadMessageRequest.builder()
                        .role("user")
                        .content("Hi, can you help me?")
                        .build())
                .build()).join();
        var threadId = thread.getId();
        System.out.println("Thread was created with id: " + threadId);

        var stream = threadService.createRunStream(threadId, ThreadRunRequest.builder()
                .assistantId(assistantId)
                .build()).join();
        System.out.println("-".repeat(80));
        stream.filter(event -> event.getName().equals(Events.THREAD_MESSAGE_DELTA))
                .map(event -> ((TextContent) ((ThreadMessageDelta) event.getData())
                        .getDelta().getContent().get(0)).getValue())
                .forEach(System.out::print);
        System.out.println();

        var threadRun = threadService.getRunList(threadId).join();
        threadRun.forEach(System.out::println);

        var deletedThread = threadService.delete(threadId).join();
        var deletedAssistant = assistantService.delete(assistantId).join();

        System.out.println("Thread was deleted: " + deletedThread.getDeleted());
        System.out.println("Assistant was deleted: " + deletedAssistant.getDeleted());
    }

    public static class HANGUP implements Functional {

        @Override
        public Object execute() {
            return "DONE";
        }

    }

    public static class GETSUPER implements Functional {

        @JsonPropertyDescription("the confimed building address from the file attached, for example: 61 Main Street")
        public String building_addr;

        @JsonPropertyDescription("the building code retrieved from the attached building json file ")
        public String building_code;

        @JsonPropertyDescription("the tenant name the tenant provided")
        public String tenant_name;

        @JsonPropertyDescription("the unit number the tenant provided")
        public String unit_no;

        @Override
        public Object execute() {
            return "DONE";
        }

    }

    public static class CONFSUPER implements Functional {

        @Override
        public Object execute() {
            return "DONE";
        }

    }

    public static class SAVEAPPOINTMENTDATE implements Functional {

        @JsonPropertyDescription("the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy")
        public String appmtdate;

        @JsonPropertyDescription("the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours")
        public String appmttime;

        @Override
        public Object execute() {
            return "DONE";
        }

    }

    public static class SETSPANISHLANG implements Functional {

        @Override
        public Object execute() {
            return "DONE";
        }

    }

}

This is the log result, where you can check in the line 246 the function name is correct:
2024-04-13 01:30:05.156+0000 [main] DEBUG io.github.sashirestela.cleverclient.CleverClient - CleverClient has been created.
2024-04-13 01:30:05.335+0000 [main] DEBUG io.github.sashirestela.cleverclient.metadata.InterfaceMetadataStore - The interface Assistants was saved
2024-04-13 01:30:05.337+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Created Instance : Assistants
2024-04-13 01:30:05.356+0000 [main] DEBUG io.github.sashirestela.cleverclient.metadata.InterfaceMetadataStore - The interface Threads was saved
2024-04-13 01:30:05.360+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Created Instance : Threads
2024-04-13 01:30:06.238+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Assistants.create()
2024-04-13 01:30:06.355+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Http Call : POST https://api.openai.com/v1/assistants
2024-04-13 01:30:06.356+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Headers : {Authorization = **********, Content-Type = application/json, OpenAI-Beta = assistants=v1}
2024-04-13 01:30:06.356+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Body : {"model":"gpt-4-0125-preview","name":"Nova Assistant","instructions":"You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.","tools":[{"type":"function","function":{"description":"while caller or called person wants to end the conversation, hangup to disconnect the call","name":"HANGUP","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"description":"After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.","name":"GETSUPER","parameters":{"type":"object","properties":{"building_addr":{"type":"string","description":"the confimed building address from the file attached, for example: 61 Main Street"},"building_code":{"type":"string","description":"the building code retrieved from the attached building json file "},"tenant_name":{"type":"string","description":"the tenant name the tenant provided"},"unit_no":{"type":"string","description":"the unit number the tenant provided"}}}}},{"type":"function","function":{"description":"After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference","name":"CONFSUPER","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"description":"After confirmed the appointment date and time with the super and the tenant, invoke this function to save them","name":"SAVEAPPOINTMENTDATE","parameters":{"type":"object","properties":{"appmtdate":{"type":"string","description":"the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"},"appmttime":{"type":"string","description":"the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"}}}}},{"type":"function","function":{"description":"If you have detected that the tenant speaks Spanish, invoke this function","name":"SETSPANISHLANG","parameters":{"type":"object","properties":{}}}},{"type":"retrieval"}]}
2024-04-13 01:30:06.369+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSenderFactory - Created Sender : HttpAsyncCustomSender
2024-04-13 01:30:06.437+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Received Response
2024-04-13 01:30:07.112+0000 [Thread-0] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response Code : 200
2024-04-13 01:30:07.113+0000 [Thread-0] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : {
  "id": "asst_bazEBg1hiaKZZcYd5nxjyWEE",
  "object": "assistant",
  "created_at":<PHONE_NUMBER>,
  "name": "Nova Assistant",
  "description": null,
  "model": "gpt-4-0125-preview",
  "instructions": "You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.",
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "HANGUP",
        "description": "while caller or called person wants to end the conversation, hangup to disconnect the call",
        "parameters": {
          "type": "object",
          "properties": {}
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "GETSUPER",
        "description": "After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.",
        "parameters": {
          "type": "object",
          "properties": {
            "building_addr": {
              "type": "string",
              "description": "the confimed building address from the file attached, for example: 61 Main Street"
            },
            "building_code": {
              "type": "string",
              "description": "the building code retrieved from the attached building json file "
            },
            "tenant_name": {
              "type": "string",
              "description": "the tenant name the tenant provided"
            },
            "unit_no": {
              "type": "string",
              "description": "the unit number the tenant provided"
            }
          }
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "CONFSUPER",
        "description": "After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference",
        "parameters": {
          "type": "object",
          "properties": {}
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "SAVEAPPOINTMENTDATE",
        "description": "After confirmed the appointment date and time with the super and the tenant, invoke this function to save them",
        "parameters": {
          "type": "object",
          "properties": {
            "appmtdate": {
              "type": "string",
              "description": "the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"
            },
            "appmttime": {
              "type": "string",
              "description": "the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"
            }
          }
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "SETSPANISHLANG",
        "description": "If you have detected that the tenant speaks Spanish, invoke this function",
        "parameters": {
          "type": "object",
          "properties": {}
        }
      }
    },
    {
      "type": "retrieval"
    }
  ],
  "file_ids": [],
  "metadata": {}
}
2024-04-13 01:30:07.150+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Threads.create()
2024-04-13 01:30:07.154+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Http Call : POST https://api.openai.com/v1/threads
2024-04-13 01:30:07.154+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Headers : {Authorization = **********, Content-Type = application/json, OpenAI-Beta = assistants=v1}
2024-04-13 01:30:07.154+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Body : {"messages":[{"role":"user","content":"Hi, can you help me?"}]}
2024-04-13 01:30:07.155+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSenderFactory - Created Sender : HttpAsyncCustomSender
2024-04-13 01:30:07.155+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Received Response
2024-04-13 01:30:07.335+0000 [Thread-1] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response Code : 200
2024-04-13 01:30:07.335+0000 [Thread-1] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : {
  "id": "thread_EyZhVYluMGpdpcVqu5coBIDB",
  "object": "thread",
  "created_at":<PHONE_NUMBER>,
  "metadata": {}
}
2024-04-13 01:30:07.338+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Threads.createRunStream()
2024-04-13 01:30:07.341+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Threads.__createRunStream()
2024-04-13 01:30:07.344+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Http Call : POST https://api.openai.com/v1/threads/thread_EyZhVYluMGpdpcVqu5coBIDB/runs
2024-04-13 01:30:07.344+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Headers : {Authorization = **********, Content-Type = application/json, OpenAI-Beta = assistants=v1}
2024-04-13 01:30:07.344+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Body : {"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","stream":true}
2024-04-13 01:30:07.344+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSenderFactory - Created Sender : HttpAsyncStreamEventSender
2024-04-13 01:30:07.345+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Received Response
2024-04-13 01:30:07.762+0000 [Thread-2] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response Code : 200
2024-04-13 01:30:07.764+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.created
2024-04-13 01:30:07.765+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"run_E86HuCZzkeZwlhJWXPYTptKV","object":"thread.run","created_at":1712971807,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","status":"queued","started_at":null,"expires_at":1712972407,"cancelled_at":null,"failed_at":null,"completed_at":null,"required_action":null,"last_error":null,"model":"gpt-4-0125-preview","instructions":"You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.","tools":[{"type":"function","function":{"name":"HANGUP","description":"while caller or called person wants to end the conversation, hangup to disconnect the call","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"GETSUPER","description":"After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.","parameters":{"type":"object","properties":{"building_addr":{"type":"string","description":"the confimed building address from the file attached, for example: 61 Main Street"},"building_code":{"type":"string","description":"the building code retrieved from the attached building json file "},"tenant_name":{"type":"string","description":"the tenant name the tenant provided"},"unit_no":{"type":"string","description":"the unit number the tenant provided"}}}}},{"type":"function","function":{"name":"CONFSUPER","description":"After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"SAVEAPPOINTMENTDATE","description":"After confirmed the appointment date and time with the super and the tenant, invoke this function to save them","parameters":{"type":"object","properties":{"appmtdate":{"type":"string","description":"the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"},"appmttime":{"type":"string","description":"the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"}}}}},{"type":"function","function":{"name":"SETSPANISHLANG","description":"If you have detected that the tenant speaks Spanish, invoke this function","parameters":{"type":"object","properties":{}}}},{"type":"retrieval"}],"file_ids":[],"metadata":{},"temperature":1.0,"max_completion_tokens":null,"max_prompt_tokens":null,"truncation_strategy":{"type":"auto","last_messages":null},"incomplete_details":null,"usage":null,"response_format":"auto","tool_choice":"auto"}
2024-04-13 01:30:07.774+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:07.774+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.queued
2024-04-13 01:30:07.775+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"run_E86HuCZzkeZwlhJWXPYTptKV","object":"thread.run","created_at":1712971807,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","status":"queued","started_at":null,"expires_at":1712972407,"cancelled_at":null,"failed_at":null,"completed_at":null,"required_action":null,"last_error":null,"model":"gpt-4-0125-preview","instructions":"You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.","tools":[{"type":"function","function":{"name":"HANGUP","description":"while caller or called person wants to end the conversation, hangup to disconnect the call","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"GETSUPER","description":"After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.","parameters":{"type":"object","properties":{"building_addr":{"type":"string","description":"the confimed building address from the file attached, for example: 61 Main Street"},"building_code":{"type":"string","description":"the building code retrieved from the attached building json file "},"tenant_name":{"type":"string","description":"the tenant name the tenant provided"},"unit_no":{"type":"string","description":"the unit number the tenant provided"}}}}},{"type":"function","function":{"name":"CONFSUPER","description":"After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"SAVEAPPOINTMENTDATE","description":"After confirmed the appointment date and time with the super and the tenant, invoke this function to save them","parameters":{"type":"object","properties":{"appmtdate":{"type":"string","description":"the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"},"appmttime":{"type":"string","description":"the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"}}}}},{"type":"function","function":{"name":"SETSPANISHLANG","description":"If you have detected that the tenant speaks Spanish, invoke this function","parameters":{"type":"object","properties":{}}}},{"type":"retrieval"}],"file_ids":[],"metadata":{},"temperature":1.0,"max_completion_tokens":null,"max_prompt_tokens":null,"truncation_strategy":{"type":"auto","last_messages":null},"incomplete_details":null,"usage":null,"response_format":"auto","tool_choice":"auto"}
2024-04-13 01:30:07.776+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:07.899+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.in_progress
2024-04-13 01:30:07.899+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"run_E86HuCZzkeZwlhJWXPYTptKV","object":"thread.run","created_at":1712971807,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","status":"in_progress","started_at":1712971807,"expires_at":1712972407,"cancelled_at":null,"failed_at":null,"completed_at":null,"required_action":null,"last_error":null,"model":"gpt-4-0125-preview","instructions":"You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.","tools":[{"type":"function","function":{"name":"HANGUP","description":"while caller or called person wants to end the conversation, hangup to disconnect the call","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"GETSUPER","description":"After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.","parameters":{"type":"object","properties":{"building_addr":{"type":"string","description":"the confimed building address from the file attached, for example: 61 Main Street"},"building_code":{"type":"string","description":"the building code retrieved from the attached building json file "},"tenant_name":{"type":"string","description":"the tenant name the tenant provided"},"unit_no":{"type":"string","description":"the unit number the tenant provided"}}}}},{"type":"function","function":{"name":"CONFSUPER","description":"After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"SAVEAPPOINTMENTDATE","description":"After confirmed the appointment date and time with the super and the tenant, invoke this function to save them","parameters":{"type":"object","properties":{"appmtdate":{"type":"string","description":"the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"},"appmttime":{"type":"string","description":"the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"}}}}},{"type":"function","function":{"name":"SETSPANISHLANG","description":"If you have detected that the tenant speaks Spanish, invoke this function","parameters":{"type":"object","properties":{}}}},{"type":"retrieval"}],"file_ids":[],"metadata":{},"temperature":1.0,"max_completion_tokens":null,"max_prompt_tokens":null,"truncation_strategy":{"type":"auto","last_messages":null},"incomplete_details":null,"usage":null,"response_format":"auto","tool_choice":"auto"}
2024-04-13 01:30:07.901+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.484+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.step.created
2024-04-13 01:30:09.484+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"step_oHgc7BArwfmsUQNsaBrOSiYL","object":"thread.run.step","created_at":1712971809,"run_id":"run_E86HuCZzkeZwlhJWXPYTptKV","assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","type":"message_creation","status":"in_progress","cancelled_at":null,"completed_at":null,"expires_at":1712972407,"failed_at":null,"last_error":null,"step_details":{"type":"message_creation","message_creation":{"message_id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf"}},"usage":null}
2024-04-13 01:30:09.500+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.500+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.step.in_progress
2024-04-13 01:30:09.500+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"step_oHgc7BArwfmsUQNsaBrOSiYL","object":"thread.run.step","created_at":1712971809,"run_id":"run_E86HuCZzkeZwlhJWXPYTptKV","assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","type":"message_creation","status":"in_progress","cancelled_at":null,"completed_at":null,"expires_at":1712972407,"failed_at":null,"last_error":null,"step_details":{"type":"message_creation","message_creation":{"message_id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf"}},"usage":null}
2024-04-13 01:30:09.501+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.522+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.created
2024-04-13 01:30:09.523+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message","created_at":1712971809,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","run_id":"run_E86HuCZzkeZwlhJWXPYTptKV","status":"in_progress","incomplete_details":null,"incomplete_at":null,"completed_at":null,"role":"assistant","content":[],"file_ids":[],"metadata":{}}
2024-04-13 01:30:09.538+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.538+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.in_progress
2024-04-13 01:30:09.538+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message","created_at":1712971809,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","run_id":"run_E86HuCZzkeZwlhJWXPYTptKV","status":"in_progress","incomplete_details":null,"incomplete_at":null,"completed_at":null,"role":"assistant","content":[],"file_ids":[],"metadata":{}}
2024-04-13 01:30:09.538+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.551+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.551+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":"Hello","annotations":[]}}]}}
2024-04-13 01:30:09.563+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.563+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.563+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":"!"}}]}}
2024-04-13 01:30:09.564+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.574+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.574+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" Of"}}]}}
2024-04-13 01:30:09.574+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.590+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.590+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" course"}}]}}
2024-04-13 01:30:09.591+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.604+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.604+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":","}}]}}
2024-04-13 01:30:09.604+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.620+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.620+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" I"}}]}}
2024-04-13 01:30:09.620+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.634+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.634+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":"'m"}}]}}
2024-04-13 01:30:09.634+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.651+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.651+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" here"}}]}}
2024-04-13 01:30:09.651+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.663+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.663+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" to"}}]}}
2024-04-13 01:30:09.664+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.675+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.675+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" help"}}]}}
2024-04-13 01:30:09.675+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.688+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.688+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":"."}}]}}
2024-04-13 01:30:09.688+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.701+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.701+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" How"}}]}}
2024-04-13 01:30:09.701+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.714+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.714+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" are"}}]}}
2024-04-13 01:30:09.714+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.726+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.726+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" you"}}]}}
2024-04-13 01:30:09.726+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.747+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.747+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" doing"}}]}}
2024-04-13 01:30:09.747+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.755+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.755+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":" today"}}]}}
2024-04-13 01:30:09.756+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.763+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.delta
2024-04-13 01:30:09.763+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message.delta","delta":{"content":[{"index":0,"type":"text","text":{"value":"?"}}]}}
2024-04-13 01:30:09.764+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.799+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.message.completed
2024-04-13 01:30:09.799+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf","object":"thread.message","created_at":1712971809,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","run_id":"run_E86HuCZzkeZwlhJWXPYTptKV","status":"completed","incomplete_details":null,"incomplete_at":null,"completed_at":1712971809,"role":"assistant","content":[{"type":"text","text":{"value":"Hello! Of course, I'm here to help. How are you doing today?","annotations":[]}}],"file_ids":[],"metadata":{}}
2024-04-13 01:30:09.800+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:09.890+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.step.completed
2024-04-13 01:30:09.890+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"step_oHgc7BArwfmsUQNsaBrOSiYL","object":"thread.run.step","created_at":1712971809,"run_id":"run_E86HuCZzkeZwlhJWXPYTptKV","assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","type":"message_creation","status":"completed","cancelled_at":null,"completed_at":1712971809,"expires_at":1712972407,"failed_at":null,"last_error":null,"step_details":{"type":"message_creation","message_creation":{"message_id":"msg_vYdgNDBi7nO6SKOV1HXAlLYf"}},"usage":{"prompt_tokens":1357,"completion_tokens":19,"total_tokens":1376}}
2024-04-13 01:30:09.891+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:10.079+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: thread.run.completed
2024-04-13 01:30:10.080+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: {"id":"run_E86HuCZzkeZwlhJWXPYTptKV","object":"thread.run","created_at":1712971807,"assistant_id":"asst_bazEBg1hiaKZZcYd5nxjyWEE","thread_id":"thread_EyZhVYluMGpdpcVqu5coBIDB","status":"completed","started_at":1712971807,"expires_at":null,"cancelled_at":null,"failed_at":null,"completed_at":1712971809,"required_action":null,"last_error":null,"model":"gpt-4-0125-preview","instructions":"You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.","tools":[{"type":"function","function":{"name":"HANGUP","description":"while caller or called person wants to end the conversation, hangup to disconnect the call","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"GETSUPER","description":"After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.","parameters":{"type":"object","properties":{"building_addr":{"type":"string","description":"the confimed building address from the file attached, for example: 61 Main Street"},"building_code":{"type":"string","description":"the building code retrieved from the attached building json file "},"tenant_name":{"type":"string","description":"the tenant name the tenant provided"},"unit_no":{"type":"string","description":"the unit number the tenant provided"}}}}},{"type":"function","function":{"name":"CONFSUPER","description":"After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference","parameters":{"type":"object","properties":{}}}},{"type":"function","function":{"name":"SAVEAPPOINTMENTDATE","description":"After confirmed the appointment date and time with the super and the tenant, invoke this function to save them","parameters":{"type":"object","properties":{"appmtdate":{"type":"string","description":"the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"},"appmttime":{"type":"string","description":"the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"}}}}},{"type":"function","function":{"name":"SETSPANISHLANG","description":"If you have detected that the tenant speaks Spanish, invoke this function","parameters":{"type":"object","properties":{}}}},{"type":"retrieval"}],"file_ids":[],"metadata":{},"temperature":1.0,"max_completion_tokens":null,"max_prompt_tokens":null,"truncation_strategy":{"type":"auto","last_messages":null},"incomplete_details":null,"usage":{"prompt_tokens":1357,"completion_tokens":19,"total_tokens":1376},"response_format":"auto","tool_choice":"auto"}
2024-04-13 01:30:10.080+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:10.096+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : event: done
2024-04-13 01:30:10.096+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : data: [DONE]
2024-04-13 01:30:10.096+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response :
2024-04-13 01:30:10.096+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Threads.getRunList()
2024-04-13 01:30:10.098+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Threads.getRunList()
2024-04-13 01:30:10.102+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Http Call : GET https://api.openai.com/v1/threads/thread_EyZhVYluMGpdpcVqu5coBIDB/runs
2024-04-13 01:30:10.102+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Headers : {Authorization = **********, OpenAI-Beta = assistants=v1}
2024-04-13 01:30:10.102+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Body : (Empty)
2024-04-13 01:30:10.103+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSenderFactory - Created Sender : HttpAsyncGenericSender
2024-04-13 01:30:10.103+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Received Response
2024-04-13 01:30:10.287+0000 [Thread-3] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response Code : 200
2024-04-13 01:30:10.287+0000 [Thread-3] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : {
  "object": "list",
  "data": [
    {
      "id": "run_E86HuCZzkeZwlhJWXPYTptKV",
      "object": "thread.run",
      "created_at":<PHONE_NUMBER>,
      "assistant_id": "asst_bazEBg1hiaKZZcYd5nxjyWEE",
      "thread_id": "thread_EyZhVYluMGpdpcVqu5coBIDB",
      "status": "completed",
      "started_at":<PHONE_NUMBER>,
      "expires_at": null,
      "cancelled_at": null,
      "failed_at": null,
      "completed_at":<PHONE_NUMBER>,
      "required_action": null,
      "last_error": null,
      "model": "gpt-4-0125-preview",
      "instructions": "You are a Heights Digital Repair Assistant working for the Heights Real Estate Company . Your name is Nova. You are now answering the tenant call for repair issue. Please response as soon as possible and as short as possible! If you can not get responses from the tenant for more than 2 times, please hangup to end the conversation.\r\nIf the tenant speaks a non-English language, You should speak the tenant's language too. After you answered the tenant call, you do the following steps(Please note that you can skip any step if you had already got the answer information of the step) :\r\n1, Answers with greeting; Ask how are they doing with standard reply.\r\n2, Ask who are they speaking to; Ask the building address and unit#.\r\n After you got the building address from the tenant, the address maybe not exactly same with address in the attached building address json file. So you need to retrieve the right address in the file and confim it with the tenant. And also retrieve the building code. \r\n But if you can not get the right address in the file, ask tenant to speak the address again to check and confirm.\r\n And after you get the super name by invoking the getsuper function, you should tell the tenant the super name.\r\n3, Asks name of person they are speaking to.\r\n4, Confirm identity of person spoken to.\r\n5, Asks what is the service issue.\r\n6, Asks What type of repair is this? Electrical, plumbing, painting or something else?\r\n7, Asks When did problem start.\r\n8, Asks Was this reported to the super. \r\n9, If it was reported to the super then asks the following questions: \r\n Reported on what date?\r\n What happened after it was reported\r\n Asks Was this condition ever inspected?\r\n10. Ask Can I conference in the super right now to help schedule an appointment?\r\n If the tenant agrees, let the tenant on hold please, then start calling( invoke conference super function) the super into the conference.\r\n or else say good bye and goodwill to end the conversation.",
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "HANGUP",
            "description": "while caller or called person wants to end the conversation, hangup to disconnect the call",
            "parameters": {
              "type": "object",
              "properties": {}
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "GETSUPER",
            "description": "After retrieved building address confrimed with the tenant ,the building code from the attached building json file and the unit number with the tenant name the tenant provided, invoke this function to get super's details including name and phone number, and also return the building address, building code and unit number with the tenant name.",
            "parameters": {
              "type": "object",
              "properties": {
                "building_addr": {
                  "type": "string",
                  "description": "the confimed building address from the file attached, for example: 61 Main Street"
                },
                "building_code": {
                  "type": "string",
                  "description": "the building code retrieved from the attached building json file "
                },
                "tenant_name": {
                  "type": "string",
                  "description": "the tenant name the tenant provided"
                },
                "unit_no": {
                  "type": "string",
                  "description": "the unit number the tenant provided"
                }
              }
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "CONFSUPER",
            "description": "After the tenant agrees that we make an appointment with the super, then we invoke this function to call super to let the super join the conference",
            "parameters": {
              "type": "object",
              "properties": {}
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "SAVEAPPOINTMENTDATE",
            "description": "After confirmed the appointment date and time with the super and the tenant, invoke this function to save them",
            "parameters": {
              "type": "object",
              "properties": {
                "appmtdate": {
                  "type": "string",
                  "description": "the appointment date confirmed with the super and the tenant, the format is mm/dd/yyyy"
                },
                "appmttime": {
                  "type": "string",
                  "description": "the appointment time confirmed with the super and the tenant, the format is hh:mm in 24 hours"
                }
              }
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "SETSPANISHLANG",
            "description": "If you have detected that the tenant speaks Spanish, invoke this function",
            "parameters": {
              "type": "object",
              "properties": {}
            }
          }
        },
        {
          "type": "retrieval"
        }
      ],
      "file_ids": [],
      "metadata": {},
      "temperature": 1.0,
      "max_completion_tokens": null,
      "max_prompt_tokens": null,
      "truncation_strategy": {
        "type": "auto",
        "last_messages": null
      },
      "incomplete_details": null,
      "usage": {
        "prompt_tokens": 1357,
        "completion_tokens": 19,
        "total_tokens": 1376
      },
      "response_format": "auto",
      "tool_choice": "auto"
    }
  ],
  "first_id": "run_E86HuCZzkeZwlhJWXPYTptKV",
  "last_id": "run_E86HuCZzkeZwlhJWXPYTptKV",
  "has_more": false
}
2024-04-13 01:30:10.348+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Threads.delete()
2024-04-13 01:30:10.349+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Http Call : DELETE https://api.openai.com/v1/threads/thread_EyZhVYluMGpdpcVqu5coBIDB
2024-04-13 01:30:10.349+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Headers : {Authorization = **********, OpenAI-Beta = assistants=v1}
2024-04-13 01:30:10.349+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Body : (Empty)
2024-04-13 01:30:10.349+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSenderFactory - Created Sender : HttpAsyncCustomSender
2024-04-13 01:30:10.349+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Received Response
2024-04-13 01:30:10.515+0000 [Thread-4] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response Code : 200
2024-04-13 01:30:10.515+0000 [Thread-4] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : {
  "id": "thread_EyZhVYluMGpdpcVqu5coBIDB",
  "object": "thread.deleted",
  "deleted": true
}
2024-04-13 01:30:10.517+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Invoked Method : Assistants.delete()
2024-04-13 01:30:10.517+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Http Call : DELETE https://api.openai.com/v1/assistants/asst_bazEBg1hiaKZZcYd5nxjyWEE
2024-04-13 01:30:10.517+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Headers : {Authorization = **********, OpenAI-Beta = assistants=v1}
2024-04-13 01:30:10.517+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpConnector - Request Body : (Empty)
2024-04-13 01:30:10.517+0000 [main] DEBUG io.github.sashirestela.cleverclient.sender.HttpSenderFactory - Created Sender : HttpAsyncCustomSender
2024-04-13 01:30:10.517+0000 [main] DEBUG io.github.sashirestela.cleverclient.http.HttpProcessor - Received Response
2024-04-13 01:30:10.702+0000 [Thread-5] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response Code : 200
2024-04-13 01:30:10.702+0000 [Thread-5] DEBUG io.github.sashirestela.cleverclient.sender.HttpSender - Response : {
  "id": "asst_bazEBg1hiaKZZcYd5nxjyWEE",
  "object": "assistant.deleted",
  "deleted": true
}

I'm afraid that your issue cannot be replicated. Maybe it is something about your local configuration or with the OpenAI model. I would suggest using the latest model gpt-4-turbo-2024-04-09.
If you don't have more observations, I think we could close this issue.

Thanks for patience of test.
I will try the new model.
I have one question is that how to process the function Require_Action in stream mode.
var threadRun = threadService.getRunList(threadId).join();
threadRun.forEach(System.out::println);
If we don't submit tool ouput of the function result, the stream will stuck in Require_Action.
How to submit outputs  in stream mode?

@hlzhangxt I'm going to convert this issue into a Discussion item, it is more appropriate. In general, if you have questions, use the Discussion section instead of creating an issue.


Pasted bullet/number lists from Word have bad formatting

Hey.  We faced with an issue that multilevel bullet(or numeric) lists copied from MS Word are formated wrong in editor.
screenshot

any update?


Added authentication retry preference

Added a preference to change the number of authentication retries from 20. Users can lower this setting to avoid getting banned from servers as highlighted in issue #33. Also added a new category in the preferences to group this preference with related preferences, and English strings for both the category heading and the new preference.

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.daniel-32 seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.You have signed the CLA already but the status is still pending? Let us recheck it.


CB-1772 Handle and generate request ID in redbeams

Two new web filters in redbeams deal with request IDs.

RequestIdGeneratingFilter looks for an x-cdp-request-id header in an
incoming request and, if absent, generates one with a random UUID for
a value. This ensures that every request has a request ID.
RequestIdFilter saves the request ID in the x-cdp-request-id header in
a thread-local variable hosted by ThreadBasedRequestIdProvider. This
makes the request ID available to business logic.

PermissionCheckingUtils gets the request ID from the thread-local
provider to pass in UMS calls, instead of the former stub value.
The redbeams AppConfig class registers the two new web filters. The
generating filter is ordered first, so that the other filter can see
the request ID it might generate.
Unlike other services, this request ID handling is not coupled with
logging. (See MDCContextFilter elsewhere to compare). However, later
work can still extract the request ID, generated or not, to include in
the MDC.

I don't understand why the three meaty classes in this review live in redbeams. Assuming there's a good reason for that, all the code looks fine.

The code may, and probably should, migrate into a common module in the future. However, right now, in other services, request ID handling is tightly coupled with logging, and I wanted this to be an independent fresh take on the feature, at least for now.


new CDN URL for 7.x.x

RxJS version:
7.x
Code to reproduce:
go to docs https://rxjs.dev/guide/installation
Expected behavior:
there should be a link for 7.x.x CDN
Actual behavior:
there is no link for 7.x.x
Additional information:
I was able to find the url here<EMAIL_ADDRESS>it is different folder structure from 6.x.x

Hi there. This is fixed in #6426, but the latest docs app version is not yet publicly available.


Add domains up to 900 OR up to 5,000?

[Enter feedback here]
What is the correct number of domains we can add on an M365 tenant?
ON THIS PAGE: It says
Typically, you can add up to 900 domains to your Microsoft 365 subscription.
BUT on other MS Learn pages, it says "up to 5,000":

https://learn.microsoft.com/en-us/microsoft-365/admin/m365-feature-descriptions?view=o365-worldwide&tabs=Domains
https://learn.microsoft.com/en-us/office365/servicedescriptions/exchange-online-protection-service-description/exchange-online-protection-limits

Please confirm on the page. Thanks!

Document Details
⚠ Do not edit this section. It is required for learn.microsoft.com ➟ GitHub issue linking.

ID: 46a11050-b442-7a48-0d37-9bce8908fc14
Version Independent ID: 5456e564-2629-cfc2-dfc9-2b7934fcf43a
Content: Domains Frequently Asked Questions
Content Source: microsoft-365/admin/setup/domains-faq.yml
Service: microsoft-365-business
GitHub Login: @efrene
Microsoft Alias: efrene

@coleefy Thank you for your feedback. We have made changes to the document via PR#https://github.com/MicrosoftDocs/microsoft-365-docs/pull/10198
Once the author approves, the changes will be live.
Thanks
Sri


Missing embedded ansible persisters dependencies

From old to new interface
Fixes problem https://travis-ci.org/ManageIQ/manageiq/jobs/391452668
ManageIQ::Providers::EmbeddedAnsible::Inventory::Persister::AutomationManager / ConfigurationScriptSource includes removed mixins (https://github.com/ManageIQ/manageiq-providers-ansible_tower/pull/81)
Reverting fix: https://github.com/ManageIQ/manageiq-providers-ansible_tower/pull/97 (this is intended to replace them)

@miq-bot add_label bug
Cc @Ladas @jameswnl @agrare

@jameswnl it seems it is failing in one test: https://travis-ci.org/ManageIQ/manageiq/jobs/391635305
I'm not sure how this error happens, local test is ok.
Is this check necessary? That class exists and is identical

@jameswnl @slemrmartin actually, to be consistent with other providers we should be using ManageIQ::Providers::EmbeddedAnsible::AutomationManager::InventoryRootGroup
Also its seems like we do have a lot of empty abstract classes there, so the ansible codebase would deserve a cleanup. :-)

@jameswnl it seems like problem is in spec, not in my code, right?
So I would like to change spec to :type => manager_class::InventoryRootGroup.name like all other specs.
But I don't know how to simulate travis error, do you know?

@jameswnl @Ladas what class do we expect these to be as a result of a refresh today?

@slemrmartin yeah, I think so. But the problem I have is same as you - don't know how to reproduce travis error locally.

travis fixed in https://github.com/ManageIQ/manageiq-providers-ansible_tower/pull/104
but it depends on this PR.
@agrare what next?

@slemrmartin @Ladas @jameswnl I think the problem is that the old interface was setting the STI class incorrectly.  Even though it is "wrong" without a data migration to correct it the new interface should be compatible with the old interface.
This new interface should set the same STI classes as the old one even if the old one wasn't correct.  If you put a PR in to fix existing data then we can fix it here.

@agrare do you want to see Rails in action? :)
"ManageIQ::Providers::EmbeddedAnsible::AutomationManager::InventoryRootGroup".safe_constantize ==

ManageIQ::Providers::AutomationManager::InventoryRootGroup on dev
ManageIQ::Providers::EmbeddedAutomationManager::InventoryRootGroup in travis

@jameswnl because InventoryRootGroup is the only inventory collection which doesn't have class under all namespaces, it's the only IC where ManageIQ::Providers::AutomationManager::InventoryRootGroup have to be specified explicitely.
A weird behaviour I wrote above is performed also for new method. For EmbeddedAnsible it was unpredictable which class is chosen by autoloader.
So I think these specs worked only with some luck before.


Featured Request: Add records number

It would be interesting, in the readme tables, to add the column "number of records" in order to have an idea of the size of the database.

Would be tough to maintain tho. I'd suggest to build a website if you think it's useful.


Please could we have a WaitForElementToDisappear method?

I'm working with a big dynamic component made up of about 100+ questions. As such when one question is answered the previous question disappears and the next one appears. Not all questions are in the same order however so I can't easily use WaitForElement("#Question77-Label") to know that Question76 has completed as this may not actually be after Question76? ...
But what would work is if I could wait for Question77 to hide / disappear from the DOM and then do my asserts etc.
Could this feature be built into the framework?

We can consider it.
In the mean time, you can make your own like this:
namespace Bunit;

public static class BunitExtensions
{
  public static void WaitForElementToDisapear(this IRenderedFragment cut, string cssSelector)
    => cut.WaitForState(() => cut.FindAll(cssSelector).Count == 0);
}

I am a bit late to the party, but here are my two cents:
Disappear has some semantics: It was once there, and now it isn't! In my eyes it is not as simple as just checking whether or not the element isn't there at the moment, but more that the element was present at some point and now it is not present anymore.
public static void WaitForElementToDisapear(this IRenderedFragment cut, string cssSelector)
    => cut.WaitForState(() => cut.FindAll(cssSelector).Count == 0);

This will pass immediately if the element in question is never present.
For your request: that could be achieved in two steps with the current version. One time checking the element is around, the second time it isn't.
PS: This is just my interpretation of disappearing.

I agree, @linkdotnet, the question is, should the bUnit explicitly check that the component is there, or should it be up to the user to first do that check.

I would argue it is the user's responsibility - because disappearing could also mean is still part of the DOM but not visible - or completely "gone" (display:none or visiblity: hidden).
The same applies to the original state - was it just "hidden" or never there? Yes we could provide two functions, but I do think the complexity in our code base would be much more in comparison to what a user would write (2 lines of code).

With v2 there would be a better opportunity as we might stop the renderer - but even then it might be either tricky as things can happen in the synchronous render part.
@robalexclark
You can take the version from @egil to check if the element in question isn't part of the DOM.
If you need the semantics of "it is currently there and I want to wait until it disappears" you can do this:
public static void WaitForElementToDisappear(this IRenderedFragment cut, string cssSelector)
{
    // Assert that the element is currently there - use your appropriate assertion library
    cut.FindAll(cssSelector).Count.ShouleBeGreaterThan(0);

    // Check until the object is gone
    cut.WaitForState(() => cut.FindAll(cssSelector).Count == 0):
}

As the rendering is out of your control, you could even do something like this to make it more obvious what is going on:
public static void WaitForElementToDisappear(this IRenderedFragment cut, string cssSelector, Action disappearAction)
{
    // Assert that the element is currently there - use your appropriate assertion library
    cut.FindAll(cssSelector).Count.ShouleBeGreaterThan(0);

    disappearAction();

    // Check until the object is gone
    cut.WaitForState(() => cut.FindAll(cssSelector).Count == 0):
}

Which you can use like this:
public void MyTest()
{
    var cut = Render<MyComponent>();

    cut.WaitForElementToDisappear("p", () => cut.Click("button"));
}

For now, I would close the ticket as it is way easier and more semantically correct (due to the different meanings of disappearing) to have this logic inside the user's code and not bUnit.
If there is a case where it is not possible to decide that from the users code, then obviously we can add such functionality to the code base.


Create VS Code launch.json during scaffolding of func init

One customer got confused when they didn't see launch.json, as they had expected it to be created during initialization. The downside of creating the file is that VS Code debugging only works for JavaScript, so customers might be confused if they have other function types.
Expected behavior:

Create launch.json with a default port (if it doesn't already exist)
CLI should read launch.json if it exists and use that port. (This will allow for multiple ports on the same machine)

Now I'm confused as I'm sure one got created for my first function! I guessed was part of --debug option and remember wondering what would have happened if I had already had a launch.json. however it didn't happen when a scaffolded my 2nd function in same applies
Perhaps code offers to create one?

I was NOT imagining it :) - see https://github.com/Azure/azure-functions-cli/issues/22#issuecomment-271712075

Create launch.json with a default port. CLI should read launch.json if it exists and use that port. (This will allow for multiple ports on the same machine)

Need to make sure not to trample of any pre existing launch.json for VS code project

@SteveALee Good point, I updated the issue with that detail.

just read in the latest vs code release notes something that might interact wit this

Automatically choosing debug environment
Depending on the active file, VS Code can now automatically choose a debug environment instead of explicitly asking the user. For example, if a user has a JavaScript file active in an editor and wants to setup his launch.json, a launch.json for JavaScript is automatically generated.


License and Usage

Hi there!
I've stumbled upon this repository and it is quite useful! Are you happy for this to be re-used in a product for commercial purposes?
If you are happy for us to use as is, could you possibly add a MIT license to the repository?
Here's a reference: https://help.github.com/articles/adding-a-license-to-a-repository/#including-an-open-source-license-in-your-repository
And a reference for an MIT license: https://choosealicense.com/licenses/mit/
Thanks!

Here you go, I'm happy if this is useful in any way :) and I wouldn't mind seing the result


doctest_docutils.py: Upstream changes

Changes
Links
_from_module:

https://github.com/pytest-dev/pytest/commit/e787d2ed48297cdd1ae95f9cccb31fc999ab1ad5
https://github.com/pytest-dev/pytest/pull/11317
https://github.com/python/cpython/blob/1c26f1ce6c3965b1f7395b60bf45d7fc0bc6de57/Lib/doctest.py#L948-L975
https://github.com/python/cpython/blob/0c56c0502270ebe29461fe5cab3ee4d6111da650/Lib/doctest.py#L954-L981

Codecov Report

Merging #25 (75b9322) into master (dfbea51) will decrease coverage by 0.56%.
The diff coverage is 0.00%.

:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.
@@            Coverage Diff             @@
##           master      #25      +/-   ##
==========================================
- Coverage   58.92%   58.37%   -0.56%
==========================================
  Files          10       10
  Lines         633      639       +6
==========================================
  Hits          373      373
- Misses        260      266       +6

Files
Coverage Δ

src/doctest_docutils.py
35.95% <0.00%> (-0.92%)
:arrow_down:

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more


make sure we return uint8 when applying colormap

closes #421

test are failing because of recent change in rasterio (see: https://github.com/mapbox/rasterio/issues/2289) but was fixed in  https://github.com/cogeotiff/rio-tiler/pull/418 by changing the dateline dataset
let me see if I can bring the change we push in rio-tiler-v3 branch


Add pretty print

This adds pretty printing to Crystal objects. And now when you do p obj that actually pretty prints obj instead of using inspect. The reason for this is that I always find Ruby's pp better whenever I want to quickly "inspect" an object, so I think pretty printing should be preferred. There's also Elixir, which only has IO.inspect which does pretty printing, and that never bothered me.
Example:
class Point
  def initialize
    @x = 1
    @y = 2
    @z = 3
  end
end

class Foo
  @points : Array(Point)

  def initialize
    @points = [Point.new] * 3
  end
end

class Bar
  def initialize
    @foo = Foo.new
  end
end

bar = Bar.new
p bar

Output before:
#<Bar:0x103173f00 @foo=#<Foo:0x103173ee0 @points=[#<Point:0x103173ea0 @x=1, @y=2, @z=3>, #<Point:0x103173ea0 @x=1, @y=2, @z=3>, #<Point:0x103173ea0 @x=1, @y=2, @z=3>]>>

Output after:
#<Bar:0x109f16f00
 @foo=
  #<Foo:0x109f16ee0
   @points=
    [#<Point:0x109f16ea0 @x=1, @y=2, @z=3>,
     #<Point:0x109f16ea0 @x=1, @y=2, @z=3>,
     #<Point:0x109f16ea0 @x=1, @y=2, @z=3>]>>

I think I prefer the later to be outputted, always (one can do puts obj.inspect to get the old behaviour)
I'll be honest: I read the papers about pretty printing and did an implementation myself, but then I checked how it was done in Ruby and it was much better. The difference is that Ruby streams directly to the given output whenever possible, while my implementation constructed the whole tree and then outputted. In the end, my implementation consumed a lot of memory... so I decided to first port Ruby's code to Crystal, check if it works, and then try to understand it. Not surprisingly, porting the code was extremely easy! And it worked out of the box. I think I understand now how it works, though the algorithm is pretty complex (if somebody would like to add more comments afterwards, please do so!). As always, I don't know if I should do something about the copyright, the algorithms seem to be public though I'm not so sure about Ruby's code.
Now we'll have to_s, inspect and pretty_print... maybe we can remove inspect? Or maybe we can declare it such that it creates a pretty printer that will output everything into a single line and then invoke pretty_print with it? In that way users would only need to override to_s and/or pretty_print, but never inspect. In any case, maybe that can be decided after we merge this PR.

👍 for removing inspect

I'm in favour of keeping inspect, but making it delegate to pretty_print by default.

why remove inspect?
this is useful when write some object into log LOG.info "... #{obj.inspect} ...", and pretty_print would bad in log.

I'd keep inspect too, its output is meant to be more terse than pretty_print (for debug purposes) and quite often may be different than to_s.


beacon: consider zero proposals a failure

Motivation

part of #3903

Changes

if the protocol finishes with zero proposals, the beacon protocol failed
when beacon starts epoch, iterate all atxs just once (instead of twice, one for total weight/active set and one for weak coin unit allowance)
tune some logging level and shorten messages. specifically

using hex to log beacon proposals
drop log.binary()

bors try

bors merge

bors merge

bors merge

bors merge


BRANCH_WEBSDK_KEYhideBanner is always true

Hello, thanks for such a great product.
I have a problem where BRANCH_WEBSDK_KEYhideBanner is set to true in local storage every time user clicks on hide button. I do have forgetHIde option set to false. Here is my code:
<script type="text/javascript">
        (function(b,r,a,n,c,h,_,s,d,k){if(!b[n]||!b[n]._q){for(;s<_.length;)c(h,_[s++]);d=r.createElement(a);d.async=1;d.src="https://cdn.branch.io/branch-latest.min.js";k=r.getElementsByTagName(a)[0];k.parentNode.insertBefore(d,k);b[n]=h}})(window,document,"script","branch",function(b,r){b[r]=function(){b._q.push([r,arguments])}},{_q:[],_v:1},"addListener applyCode banner closeBanner creditHistory credits data deepview deepviewCta first getCode init link logout redeem referrals removeListener sendSMS setIdentity track validateCode".split(" "), 0);
        branch.init("key_live_jhhSV96vCY2uY1BFAF69NiaaqDoJ3Lmd");

        branch.banner({
            icon: 'http://frockhub.com/images/icons/large-icon.png',
            title: 'Frockhub',
            description: 'Simply Shop Social',
            openAppButtonText: 'Open',              // Text to show on button if the user has the app installed
            downloadAppButtonText: 'Download',      // Text to show on button if the user does not have the app installed
            sendLinkText: 'Send Link',              // Text to show on desktop button to allow users to text themselves the app
            showiOS: true,                          // Should the banner be shown on iOS devices?
            showAndroid: true,                      // Should the banner be shown on Android devices?
            showDesktop: true,                      // Should the banner be shown on desktop devices?
            iframe: true,                           // Show banner in an iframe, recomended to isolate Branch banner CSS
            disableHide: false,                     // Should the user have the ability to hide the banner? (show's X on left side)
            forgetHide: false,// Should we show the banner after the user closes it? Can be set to true, or an integer to show again after X days
            position: 'top',                        // Sets the position of the banner, options are: 'top' or 'bottom', and the default is 'top'
            mobileSticky: true,
            // Determines whether the mobile banner will be set `position: fixed;` (sticky) or `position: absolute;`, defaults to false *this property only applies when the banner position is 'top'
            desktopSticky: true,                    // Determines whether the desktop banner will be set `position: fixed;` (sticky) or `position: absolute;`, defaults to true *this property only applies when the banner position is 'top'
            customCSS: '.title { color: #F00; }',   // Add your own custom styles to the banner that load last, and are gauranteed to take precedence, even if you leave the banner in an iframe
            make_new_link: false,                   // Should the banner create a new link, even if a link already exists?
            rating: 5,                              // Number of stars (should be your store rating)
            reviewCount: 1000,                      // Number of reviews that generate the rating (should be your store reviews)
            theme: 'light'//,// Uses Branch's predetermined color scheme for the banner { 'light' || 'dark' }, default: 'light'
        }, {});
    </script>

BRANCH_WEBSDK_KEYhideBanner variable name is related to #294

Hi @okonon!  Great question.  The hideBanner stored variable represents a user who has chosen to close the banner, and no longer see it.  When the forgetHide variable is set to false, that is exactly the behavior that happens: the user closes the banner, and it stays closed.
However, if you wish to show the banner every time, you should set the forgetHide variable to true.  This will cause the banner code to ignore the hideBanner stored variable, and show the banner anyway.
A third option is to pass an integer instead of a boolean for forgetHide.  In this case, the banner will remain hidden after the user closes it, but only for the number of days passed to forgetHide.
Hope this helps!  If you have any other questions, we do have an amazing support team that can get you answers or guidance without delays:  https://support.branch.io/