|  | @@ -113,7 +113,7 @@ class LLMNode(BaseNode):
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              # handle invoke result
 | 
	
		
			
				|  |  | -            result_text, usage = self._invoke_llm(
 | 
	
		
			
				|  |  | +            result_text, usage, finish_reason = self._invoke_llm(
 | 
	
		
			
				|  |  |                  node_data_model=node_data.model,
 | 
	
		
			
				|  |  |                  model_instance=model_instance,
 | 
	
		
			
				|  |  |                  prompt_messages=prompt_messages,
 | 
	
	
		
			
				|  | @@ -129,7 +129,8 @@ class LLMNode(BaseNode):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          outputs = {
 | 
	
		
			
				|  |  |              'text': result_text,
 | 
	
		
			
				|  |  | -            'usage': jsonable_encoder(usage)
 | 
	
		
			
				|  |  | +            'usage': jsonable_encoder(usage),
 | 
	
		
			
				|  |  | +            'finish_reason': finish_reason
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return NodeRunResult(
 | 
	
	
		
			
				|  | @@ -167,14 +168,14 @@ class LLMNode(BaseNode):
 | 
	
		
			
				|  |  |          )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # handle invoke result
 | 
	
		
			
				|  |  | -        text, usage = self._handle_invoke_result(
 | 
	
		
			
				|  |  | +        text, usage, finish_reason = self._handle_invoke_result(
 | 
	
		
			
				|  |  |              invoke_result=invoke_result
 | 
	
		
			
				|  |  |          )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # deduct quota
 | 
	
		
			
				|  |  |          self.deduct_llm_quota(tenant_id=self.tenant_id, model_instance=model_instance, usage=usage)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return text, usage
 | 
	
		
			
				|  |  | +        return text, usage, finish_reason
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _handle_invoke_result(self, invoke_result: Generator) -> tuple[str, LLMUsage]:
 | 
	
		
			
				|  |  |          """
 | 
	
	
		
			
				|  | @@ -186,6 +187,7 @@ class LLMNode(BaseNode):
 | 
	
		
			
				|  |  |          prompt_messages = []
 | 
	
		
			
				|  |  |          full_text = ''
 | 
	
		
			
				|  |  |          usage = None
 | 
	
		
			
				|  |  | +        finish_reason = None
 | 
	
		
			
				|  |  |          for result in invoke_result:
 | 
	
		
			
				|  |  |              text = result.delta.message.content
 | 
	
		
			
				|  |  |              full_text += text
 | 
	
	
		
			
				|  | @@ -201,10 +203,13 @@ class LLMNode(BaseNode):
 | 
	
		
			
				|  |  |              if not usage and result.delta.usage:
 | 
	
		
			
				|  |  |                  usage = result.delta.usage
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            if not finish_reason and result.delta.finish_reason:
 | 
	
		
			
				|  |  | +                finish_reason = result.delta.finish_reason
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          if not usage:
 | 
	
		
			
				|  |  |              usage = LLMUsage.empty_usage()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return full_text, usage
 | 
	
		
			
				|  |  | +        return full_text, usage, finish_reason
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def _transform_chat_messages(self,
 | 
	
		
			
				|  |  |          messages: list[LLMNodeChatModelMessage] | LLMNodeCompletionModelPromptTemplate
 |