diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 5413f83c27..d3f71c4647 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -16,14 +16,14 @@ jobs: - name: Check Docker Compose inputs id: docker-compose-changes - uses: tj-actions/changed-files@v46 + uses: tj-actions/changed-files@v47 with: files: | docker/generate_docker_compose docker/.env.example docker/docker-compose-template.yaml docker/docker-compose.yaml - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.11" diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml index bbf89236de..704d896192 100644 --- a/.github/workflows/build-push.yml +++ b/.github/workflows/build-push.yml @@ -112,7 +112,7 @@ jobs: context: "web" steps: - name: Download digests - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: path: /tmp/digests pattern: digests-${{ matrix.context }}-* diff --git a/.github/workflows/deploy-agent-dev.yml b/.github/workflows/deploy-agent-dev.yml index dff48b5510..dd759f7ba5 100644 --- a/.github/workflows/deploy-agent-dev.yml +++ b/.github/workflows/deploy-agent-dev.yml @@ -19,7 +19,7 @@ jobs: github.event.workflow_run.head_branch == 'deploy/agent-dev' steps: - name: Deploy to server - uses: appleboy/ssh-action@v0.1.8 + uses: appleboy/ssh-action@v1 with: host: ${{ secrets.AGENT_DEV_SSH_HOST }} username: ${{ secrets.SSH_USER }} diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index cd1c86e668..38fa0b9a7f 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -16,7 +16,7 @@ jobs: github.event.workflow_run.head_branch == 'deploy/dev' steps: - name: Deploy to server - uses: appleboy/ssh-action@v0.1.8 + uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} diff --git a/.github/workflows/deploy-hitl.yml b/.github/workflows/deploy-hitl.yml index 8144ba4f08..7d5f0a22e7 100644 --- a/.github/workflows/deploy-hitl.yml +++ b/.github/workflows/deploy-hitl.yml @@ -20,7 +20,7 @@ jobs: ) steps: - name: Deploy to server - uses: appleboy/ssh-action@v0.1.8 + uses: appleboy/ssh-action@v1 with: host: ${{ secrets.HITL_SSH_HOST }} username: ${{ secrets.SSH_USER }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 1870b1f670..b6df1d7e93 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -18,7 +18,7 @@ jobs: pull-requests: write steps: - - uses: actions/stale@v5 + - uses: actions/stale@v10 with: days-before-issue-stale: 15 days-before-issue-close: 3 diff --git a/.github/workflows/trigger-i18n-sync.yml b/.github/workflows/trigger-i18n-sync.yml index de093c9235..66a29453b4 100644 --- a/.github/workflows/trigger-i18n-sync.yml +++ b/.github/workflows/trigger-i18n-sync.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index e9fbb515e4..023ffc991a 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -30,6 +30,11 @@ class TagBindingRemovePayload(BaseModel): type: Literal["knowledge", "app"] | None = Field(default=None, description="Tag type") +class TagListQueryParam(BaseModel): + type: Literal["knowledge", "app", ""] = Field("", description="Tag type filter") + keyword: str | None = Field(None, description="Search keyword") + + register_schema_models( console_ns, TagBasePayload, @@ -43,12 +48,15 @@ class TagListApi(Resource): @setup_required @login_required @account_initialization_required + @console_ns.doc( + params={"type": 'Tag type filter. Can be "knowledge" or "app".', "keyword": "Search keyword for tag name."} + ) @marshal_with(dataset_tag_fields) def get(self): _, current_tenant_id = current_account_with_tenant() - tag_type = request.args.get("type", type=str, default="") - keyword = request.args.get("keyword", default=None, type=str) - tags = TagService.get_tags(tag_type, current_tenant_id, keyword) + raw_args = request.args.to_dict() + param = TagListQueryParam.model_validate(raw_args) + tags = TagService.get_tags(param.type, current_tenant_id, param.keyword) return tags, 200 diff --git a/api/core/llm_generator/llm_generator.py b/api/core/llm_generator/llm_generator.py index b4c3ec1caf..be1e306d47 100644 --- a/api/core/llm_generator/llm_generator.py +++ b/api/core/llm_generator/llm_generator.py @@ -71,8 +71,8 @@ class LLMGenerator: response: LLMResult = model_instance.invoke_llm( prompt_messages=list(prompts), model_parameters={"max_tokens": 500, "temperature": 1}, stream=False ) - answer = cast(str, response.message.content) - if answer is None: + answer = response.message.get_text_content() + if answer == "": return "" try: result_dict = json.loads(answer) @@ -184,7 +184,7 @@ class LLMGenerator: prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False ) - rule_config["prompt"] = cast(str, response.message.content) + rule_config["prompt"] = response.message.get_text_content() except InvokeError as e: error = str(e) @@ -237,13 +237,11 @@ class LLMGenerator: return rule_config - rule_config["prompt"] = cast(str, prompt_content.message.content) + rule_config["prompt"] = prompt_content.message.get_text_content() - if not isinstance(prompt_content.message.content, str): - raise NotImplementedError("prompt content is not a string") parameter_generate_prompt = parameter_template.format( inputs={ - "INPUT_TEXT": prompt_content.message.content, + "INPUT_TEXT": prompt_content.message.get_text_content(), }, remove_template_variables=False, ) @@ -253,7 +251,7 @@ class LLMGenerator: statement_generate_prompt = statement_template.format( inputs={ "TASK_DESCRIPTION": instruction, - "INPUT_TEXT": prompt_content.message.content, + "INPUT_TEXT": prompt_content.message.get_text_content(), }, remove_template_variables=False, ) @@ -263,7 +261,7 @@ class LLMGenerator: parameter_content: LLMResult = model_instance.invoke_llm( prompt_messages=list(parameter_messages), model_parameters=model_parameters, stream=False ) - rule_config["variables"] = re.findall(r'"\s*([^"]+)\s*"', cast(str, parameter_content.message.content)) + rule_config["variables"] = re.findall(r'"\s*([^"]+)\s*"', parameter_content.message.get_text_content()) except InvokeError as e: error = str(e) error_step = "generate variables" @@ -272,7 +270,7 @@ class LLMGenerator: statement_content: LLMResult = model_instance.invoke_llm( prompt_messages=list(statement_messages), model_parameters=model_parameters, stream=False ) - rule_config["opening_statement"] = cast(str, statement_content.message.content) + rule_config["opening_statement"] = statement_content.message.get_text_content() except InvokeError as e: error = str(e) error_step = "generate conversation opener" @@ -315,7 +313,7 @@ class LLMGenerator: prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False ) - generated_code = cast(str, response.message.content) + generated_code = response.message.get_text_content() return {"code": generated_code, "language": code_language, "error": ""} except InvokeError as e: @@ -351,7 +349,7 @@ class LLMGenerator: raise TypeError("Expected LLMResult when stream=False") response = result - answer = cast(str, response.message.content) + answer = response.message.get_text_content() return answer.strip() @classmethod @@ -375,10 +373,7 @@ class LLMGenerator: prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False ) - raw_content = response.message.content - - if not isinstance(raw_content, str): - raise ValueError(f"LLM response content must be a string, got: {type(raw_content)}") + raw_content = response.message.get_text_content() try: parsed_content = json.loads(raw_content) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx index 939e4e9fe6..81b4f2474e 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx @@ -65,15 +65,17 @@ const CardView: FC = ({ appId, isInPanel, className }) => {
{t('overview.disableTooltip.triggerMode', { ns: 'appOverview', feature: featureName })}
-
{ event.stopPropagation() - window.open(triggerDocUrl, '_blank') }} > {t('overview.appInfo.enableTooltip.learnMore', { ns: 'appOverview' })} -
+ ), [t, triggerDocUrl])