@gendive/chatllm 0.17.30 → 0.17.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2955,6 +2955,7 @@ ${attachmentContext}
2955
2955
  }
2956
2956
  if (detectedSkill && !resolvedSkills[detectedSkill.name]) {
2957
2957
  console.warn(`[useChatUI] \uC2A4\uD0AC "${detectedSkill.name}" \uAC10\uC9C0\uB418\uC5C8\uC73C\uB098 \uBBF8\uB4F1\uB85D. \uB4F1\uB85D\uB41C \uC2A4\uD0AC:`, Object.keys(resolvedSkills));
2958
+ accumulatedContent = skillCleanContent;
2958
2959
  setSessions(
2959
2960
  (prev) => prev.map((s) => {
2960
2961
  if (s.id !== capturedSessionId) return s;
@@ -2969,84 +2970,157 @@ ${attachmentContext}
2969
2970
  );
2970
2971
  }
2971
2972
  if (detectedSkill && resolvedSkills[detectedSkill.name]) {
2972
- setSessions(
2973
- (prev) => prev.map((s) => {
2974
- if (s.id !== capturedSessionId) return s;
2975
- return {
2976
- ...s,
2977
- messages: s.messages.map((m) => {
2978
- if (m.id !== assistantMessageId) return m;
2979
- return {
2980
- ...m,
2981
- content: skillCleanContent,
2982
- skillExecution: {
2983
- skillName: detectedSkill.name,
2984
- params: detectedSkill.params,
2985
- status: "executing"
2986
- }
2987
- };
2988
- })
2989
- };
2990
- })
2991
- );
2992
- let streamedReport = "";
2993
- const { result } = await handleSkillCall(assistantContent, {
2994
- onProgress: (progress) => {
2995
- setSessions(
2996
- (prev) => prev.map((s) => {
2997
- if (s.id !== capturedSessionId) return s;
2998
- return {
2999
- ...s,
3000
- messages: s.messages.map((m) => {
3001
- if (m.id !== assistantMessageId) return m;
3002
- return {
3003
- ...m,
3004
- skillExecution: { ...m.skillExecution, progress }
3005
- };
3006
- })
3007
- };
3008
- })
3009
- );
3010
- },
3011
- onStream: (chunk) => {
3012
- streamedReport += chunk;
3013
- setSessions(
3014
- (prev) => prev.map((s) => {
3015
- if (s.id !== capturedSessionId) return s;
3016
- return {
3017
- ...s,
3018
- messages: s.messages.map((m) => {
3019
- if (m.id !== assistantMessageId) return m;
3020
- return { ...m, content: streamedReport };
3021
- })
3022
- };
3023
- })
3024
- );
3025
- },
3026
- signal: abortControllerRef.current?.signal
3027
- });
3028
- if (result) {
3029
- if (result.metadata?.__toolResult__) {
3030
- const resultType = result.metadata.resultType;
3031
- const toolName = result.metadata.toolName;
3032
- const toolLabel = result.metadata.toolLabel;
3033
- const toolIcon = result.metadata.toolIcon;
3034
- const parts = [];
3035
- if (skillCleanContent.trim()) {
3036
- parts.push({ type: "text", content: skillCleanContent });
2973
+ if (activeChecklistRef.current) {
2974
+ console.log("[useChatUI] \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4 \uB0B4 \uC2A4\uD0AC \uC2E4\uD589:", detectedSkill.name);
2975
+ accumulatedContent = skillCleanContent;
2976
+ setSessions(
2977
+ (prev) => prev.map((s) => {
2978
+ if (s.id !== capturedSessionId) return s;
2979
+ return { ...s, messages: s.messages.map((m) => m.id !== assistantMessageId ? m : { ...m, content: skillCleanContent }) };
2980
+ })
2981
+ );
2982
+ try {
2983
+ const { result: skillResult } = await handleSkillCall(assistantContent, {
2984
+ signal: abortControllerRef.current?.signal
2985
+ });
2986
+ if (skillResult?.content) {
2987
+ accumulatedContent = skillResult.content;
3037
2988
  }
3038
- parts.push({
3039
- type: "tool_result",
3040
- toolName,
3041
- label: toolLabel,
3042
- icon: toolIcon,
3043
- result: {
3044
- type: resultType,
3045
- content: result.content,
3046
- metadata: result.metadata,
3047
- sources: result.sources
2989
+ } catch (e) {
2990
+ console.warn("[useChatUI] \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB0B4 \uC2A4\uD0AC \uC2E4\uD589 \uC2E4\uD328:", e);
2991
+ }
2992
+ } else {
2993
+ setSessions(
2994
+ (prev) => prev.map((s) => {
2995
+ if (s.id !== capturedSessionId) return s;
2996
+ return {
2997
+ ...s,
2998
+ messages: s.messages.map((m) => {
2999
+ if (m.id !== assistantMessageId) return m;
3000
+ return {
3001
+ ...m,
3002
+ content: skillCleanContent,
3003
+ skillExecution: {
3004
+ skillName: detectedSkill.name,
3005
+ params: detectedSkill.params,
3006
+ status: "executing"
3007
+ }
3008
+ };
3009
+ })
3010
+ };
3011
+ })
3012
+ );
3013
+ let streamedReport = "";
3014
+ const { result } = await handleSkillCall(assistantContent, {
3015
+ onProgress: (progress) => {
3016
+ setSessions(
3017
+ (prev) => prev.map((s) => {
3018
+ if (s.id !== capturedSessionId) return s;
3019
+ return {
3020
+ ...s,
3021
+ messages: s.messages.map((m) => {
3022
+ if (m.id !== assistantMessageId) return m;
3023
+ return {
3024
+ ...m,
3025
+ skillExecution: { ...m.skillExecution, progress }
3026
+ };
3027
+ })
3028
+ };
3029
+ })
3030
+ );
3031
+ },
3032
+ onStream: (chunk) => {
3033
+ streamedReport += chunk;
3034
+ setSessions(
3035
+ (prev) => prev.map((s) => {
3036
+ if (s.id !== capturedSessionId) return s;
3037
+ return {
3038
+ ...s,
3039
+ messages: s.messages.map((m) => {
3040
+ if (m.id !== assistantMessageId) return m;
3041
+ return { ...m, content: streamedReport };
3042
+ })
3043
+ };
3044
+ })
3045
+ );
3046
+ },
3047
+ signal: abortControllerRef.current?.signal
3048
+ });
3049
+ if (result) {
3050
+ if (result.metadata?.__toolResult__) {
3051
+ const resultType = result.metadata.resultType;
3052
+ const toolName = result.metadata.toolName;
3053
+ const toolLabel = result.metadata.toolLabel;
3054
+ const toolIcon = result.metadata.toolIcon;
3055
+ const parts = [];
3056
+ if (skillCleanContent.trim()) {
3057
+ parts.push({ type: "text", content: skillCleanContent });
3048
3058
  }
3049
- });
3059
+ parts.push({
3060
+ type: "tool_result",
3061
+ toolName,
3062
+ label: toolLabel,
3063
+ icon: toolIcon,
3064
+ result: {
3065
+ type: resultType,
3066
+ content: result.content,
3067
+ metadata: result.metadata,
3068
+ sources: result.sources
3069
+ }
3070
+ });
3071
+ setSessions(
3072
+ (prev) => prev.map((s) => {
3073
+ if (s.id !== capturedSessionId) return s;
3074
+ return {
3075
+ ...s,
3076
+ messages: s.messages.map((m) => {
3077
+ if (m.id !== assistantMessageId) return m;
3078
+ return {
3079
+ ...m,
3080
+ contentParts: parts,
3081
+ skillExecution: {
3082
+ ...m.skillExecution,
3083
+ status: "done",
3084
+ result
3085
+ }
3086
+ };
3087
+ })
3088
+ };
3089
+ })
3090
+ );
3091
+ if (resultType === "image" || resultType === "file") {
3092
+ saveMessagesOnEarlyReturn();
3093
+ setIsLoading(false);
3094
+ abortControllerRef.current = null;
3095
+ return;
3096
+ }
3097
+ let shouldContinue = continueAfterToolResult;
3098
+ if (onSkillCompleteRef.current) {
3099
+ const decision = onSkillCompleteRef.current(toolName, result);
3100
+ shouldContinue = decision === "continue";
3101
+ }
3102
+ if (!shouldContinue) {
3103
+ saveMessagesOnEarlyReturn();
3104
+ setIsLoading(false);
3105
+ abortControllerRef.current = null;
3106
+ return;
3107
+ }
3108
+ skipNextSkillParsingRef.current = true;
3109
+ saveMessagesOnEarlyReturn();
3110
+ const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
3111
+
3112
+ \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC624\uB958\uB97C \uC548\uB0B4\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.` : `\uB3C4\uAD6C "${toolName}" \uACB0\uACFC:
3113
+
3114
+ ${result.content}
3115
+
3116
+ \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3117
+ setTimeout(() => {
3118
+ sendMessage(feedbackPrompt, { hiddenUserMessage: true });
3119
+ }, 100);
3120
+ setIsLoading(false);
3121
+ abortControllerRef.current = null;
3122
+ return;
3123
+ }
3050
3124
  setSessions(
3051
3125
  (prev) => prev.map((s) => {
3052
3126
  if (s.id !== capturedSessionId) return s;
@@ -3056,7 +3130,7 @@ ${attachmentContext}
3056
3130
  if (m.id !== assistantMessageId) return m;
3057
3131
  return {
3058
3132
  ...m,
3059
- contentParts: parts,
3133
+ sources: result.sources || m.sources,
3060
3134
  skillExecution: {
3061
3135
  ...m.skillExecution,
3062
3136
  status: "done",
@@ -3067,18 +3141,18 @@ ${attachmentContext}
3067
3141
  };
3068
3142
  })
3069
3143
  );
3070
- if (resultType === "image" || resultType === "file") {
3144
+ if (streamedReport) {
3071
3145
  saveMessagesOnEarlyReturn();
3072
3146
  setIsLoading(false);
3073
3147
  abortControllerRef.current = null;
3074
3148
  return;
3075
3149
  }
3076
- let shouldContinue = continueAfterToolResult;
3150
+ let shouldContinueSkill = continueAfterToolResult;
3077
3151
  if (onSkillCompleteRef.current) {
3078
- const decision = onSkillCompleteRef.current(toolName, result);
3079
- shouldContinue = decision === "continue";
3152
+ const decision = onSkillCompleteRef.current(detectedSkill.name, result);
3153
+ shouldContinueSkill = decision === "continue";
3080
3154
  }
3081
- if (!shouldContinue) {
3155
+ if (!shouldContinueSkill) {
3082
3156
  saveMessagesOnEarlyReturn();
3083
3157
  setIsLoading(false);
3084
3158
  abortControllerRef.current = null;
@@ -3086,70 +3160,18 @@ ${attachmentContext}
3086
3160
  }
3087
3161
  skipNextSkillParsingRef.current = true;
3088
3162
  saveMessagesOnEarlyReturn();
3089
- const feedbackPrompt = resultType === "error" ? `\uB3C4\uAD6C "${toolName}" \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD: ${result.content}
3090
-
3091
- \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC624\uB958\uB97C \uC548\uB0B4\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.` : `\uB3C4\uAD6C "${toolName}" \uACB0\uACFC:
3163
+ const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
3092
3164
 
3093
3165
  ${result.content}
3094
3166
 
3095
- \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3167
+ \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uC0AC\uC6A9\uC790\uC758 \uC6D0\uB798 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3096
3168
  setTimeout(() => {
3097
- sendMessage(feedbackPrompt, { hiddenUserMessage: true });
3169
+ sendMessage(resultPrompt, { hiddenUserMessage: true });
3098
3170
  }, 100);
3099
3171
  setIsLoading(false);
3100
3172
  abortControllerRef.current = null;
3101
3173
  return;
3102
3174
  }
3103
- setSessions(
3104
- (prev) => prev.map((s) => {
3105
- if (s.id !== capturedSessionId) return s;
3106
- return {
3107
- ...s,
3108
- messages: s.messages.map((m) => {
3109
- if (m.id !== assistantMessageId) return m;
3110
- return {
3111
- ...m,
3112
- sources: result.sources || m.sources,
3113
- skillExecution: {
3114
- ...m.skillExecution,
3115
- status: "done",
3116
- result
3117
- }
3118
- };
3119
- })
3120
- };
3121
- })
3122
- );
3123
- if (streamedReport) {
3124
- saveMessagesOnEarlyReturn();
3125
- setIsLoading(false);
3126
- abortControllerRef.current = null;
3127
- return;
3128
- }
3129
- let shouldContinueSkill = continueAfterToolResult;
3130
- if (onSkillCompleteRef.current) {
3131
- const decision = onSkillCompleteRef.current(detectedSkill.name, result);
3132
- shouldContinueSkill = decision === "continue";
3133
- }
3134
- if (!shouldContinueSkill) {
3135
- saveMessagesOnEarlyReturn();
3136
- setIsLoading(false);
3137
- abortControllerRef.current = null;
3138
- return;
3139
- }
3140
- skipNextSkillParsingRef.current = true;
3141
- saveMessagesOnEarlyReturn();
3142
- const resultPrompt = `\uC2A4\uD0AC "${detectedSkill.name}" \uC2E4\uD589 \uACB0\uACFC:
3143
-
3144
- ${result.content}
3145
-
3146
- \uC704 \uACB0\uACFC\uB97C \uBC14\uD0D5\uC73C\uB85C \uC0AC\uC6A9\uC790\uC758 \uC6D0\uB798 \uC9C8\uBB38\uC5D0 \uB2F5\uBCC0\uD574\uC8FC\uC138\uC694. skill_use \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3147
- setTimeout(() => {
3148
- sendMessage(resultPrompt, { hiddenUserMessage: true });
3149
- }, 100);
3150
- setIsLoading(false);
3151
- abortControllerRef.current = null;
3152
- return;
3153
3175
  }
3154
3176
  }
3155
3177
  }