Files
ragflow/internal/agent/dsl/testdata/resume.json
Zhichang Yu e45659868a feat(agent): ship the Go agent canvas port — eino interrupt/resume + Redis check-pointing (#16035)
Replaces the Python agent canvas runtime with a Go implementation that
runs inside `cmd/server_main`.

The canvas compiles into an eino Workflow that pauses on wait-for-user
via native Interrupt/Resume (no sentinel flag) and resumes from a
Redis-backed CheckPointStore.

All 21 Python agent components and ~35 tools are ported with functional
parity.

Sandbox providers now read their JSON config from the admin-panel
system_settings table with env fallback.

234 files / +35,413 / -6,111. All Go files are gofmt-clean (CI gate
added); drops the v2 DSL E2E step and the gap-analysis plan (both
redundant after the port ships).

## Type of change

- [x] Refactoring
- [x] New feature
- [x] Bug fix

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-17 13:24:03 +08:00

462 lines
18 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"globals": {
"sys.conversation_turns": 0,
"sys.date": "",
"sys.files": [],
"sys.history": [],
"sys.query": "",
"sys.user_id": ""
},
"graph": {
"edges": [
{
"data": {
"isHovered": false
},
"id": "xy-edge__Filestart-Parser:HipSignsRhymeend",
"source": "File",
"sourceHandle": "start",
"target": "Parser:HipSignsRhyme",
"targetHandle": "end"
},
{
"data": {
"isHovered": false
},
"id": "xy-edge__Parser:HipSignsRhymestart-TitleChunker:FlatMiceFixend",
"source": "Parser:HipSignsRhyme",
"sourceHandle": "start",
"target": "TitleChunker:FlatMiceFix",
"targetHandle": "end"
},
{
"data": {
"isHovered": false
},
"id": "xy-edge__TitleChunker:FlatMiceFixstart-Extractor:ThreeDrinksActend",
"markerEnd": "logo",
"source": "TitleChunker:FlatMiceFix",
"sourceHandle": "start",
"target": "Extractor:ThreeDrinksAct",
"targetHandle": "end",
"type": "buttonEdge",
"zIndex": 1001
},
{
"data": {
"isHovered": false
},
"id": "xy-edge__Extractor:ThreeDrinksActstart-Extractor:ItchyFoxesStriveend",
"source": "Extractor:ThreeDrinksAct",
"sourceHandle": "start",
"target": "Extractor:ItchyFoxesStrive",
"targetHandle": "end"
},
{
"data": {
"isHovered": false
},
"id": "xy-edge__Extractor:ItchyFoxesStrivestart-Extractor:BusyClocksRushend",
"source": "Extractor:ItchyFoxesStrive",
"sourceHandle": "start",
"target": "Extractor:BusyClocksRush",
"targetHandle": "end"
},
{
"data": {
"isHovered": false
},
"id": "xy-edge__Extractor:BusyClocksRushstart-Extractor:CuteSignsCutend",
"source": "Extractor:BusyClocksRush",
"sourceHandle": "start",
"target": "Extractor:CuteSignsCut",
"targetHandle": "end"
},
{
"data": {
"isHovered": false
},
"id": "xy-edge__Extractor:CuteSignsCutstart-Tokenizer:KindHandsWinend",
"markerEnd": "logo",
"source": "Extractor:CuteSignsCut",
"sourceHandle": "start",
"target": "Tokenizer:KindHandsWin",
"targetHandle": "end",
"type": "buttonEdge",
"zIndex": 1001
}
],
"nodes": [
{
"data": {
"label": "File",
"name": "File"
},
"dragging": false,
"id": "File",
"measured": {
"height": 49,
"width": 200
},
"position": {
"x": 239.52494800353588,
"y": 92.44515504032671
},
"selected": false,
"sourcePosition": "left",
"targetPosition": "right",
"type": "beginNode"
},
{
"data": {
"form": {
"outputs": {
"html": {
"type": "string",
"value": ""
},
"json": {
"type": "Array<object>",
"value": []
},
"markdown": {
"type": "string",
"value": ""
},
"text": {
"type": "string",
"value": ""
}
},
"setups": [
{
"fileFormat": "pdf",
"flatten_media_to_text": true,
"output_format": "json",
"parse_method": "DeepDOC"
},
{
"fileFormat": "spreadsheet",
"flatten_media_to_text": true,
"output_format": "html",
"parse_method": "DeepDOC"
},
{
"fileFormat": "image",
"output_format": "text",
"parse_method": "ocr"
},
{
"fields": [
"from",
"to",
"cc",
"bcc",
"date",
"subject",
"body",
"attachments"
],
"fileFormat": "email",
"output_format": "text"
},
{
"fileFormat": "markdown",
"flatten_media_to_text": true,
"output_format": "json"
},
{
"fileFormat": "text&code",
"output_format": "json"
},
{
"fileFormat": "html",
"output_format": "json"
},
{
"fileFormat": "doc",
"output_format": "json",
"vlm": {}
},
{
"fileFormat": "docx",
"flatten_media_to_text": true,
"output_format": "json"
},
{
"fileFormat": "slides",
"output_format": "json",
"parse_method": "DeepDOC"
}
]
},
"label": "Parser",
"name": "Parser_0"
},
"dragging": false,
"id": "Parser:HipSignsRhyme",
"measured": {
"height": 197,
"width": 200
},
"position": {
"x": 252.18327231534056,
"y": 157.25954787377458
},
"selected": true,
"sourcePosition": "right",
"targetPosition": "left",
"type": "parserNode"
},
{
"data": {
"form": {
"fields": "text",
"filename_embd_weight": 0.1,
"outputs": {},
"search_method": [
"embedding",
"full_text"
]
},
"label": "Tokenizer",
"name": "Indexer_0"
},
"dragging": false,
"id": "Tokenizer:KindHandsWin",
"measured": {
"height": 113,
"width": 200
},
"position": {
"x": 663.5327731044026,
"y": 544.5236681687471
},
"selected": false,
"sourcePosition": "right",
"targetPosition": "left",
"type": "tokenizerNode"
},
{
"data": {
"form": {
"hierarchy": "1",
"include_heading_content": false,
"method": "hierarchy",
"outputs": {
"chunks": {
"type": "Array<Object>",
"value": []
}
},
"promote_first_heading_to_root": false,
"root_chunk_as_heading": true,
"rules": [
{
"levels": [
{
"expression": "^\\s*(?i:(?:\\d+[\\.\\)]\\s*)?(?:EDUCATION|ACADEMIC\\s*BACKGROUND|ACADEMIC\\s*HISTORY|EDUCATIONAL\\s*BACKGROUND|RELEVANT\\s*COURSEWORK|COURSEWORK|EXPERIENCE|WORK\\s*EXPERIENCE|PROFESSIONAL\\s*EXPERIENCE|RELEVANT\\s*EXPERIENCE|EMPLOYMENT\\s*HISTORY|CAREER\\s*HISTORY|INTERNSHIP\\s*EXPERIENCE|PROJECTS|PROJECT\\s*EXPERIENCE|ACADEMIC\\s*PROJECTS|PROFESSIONAL\\s*PROJECTS|SKILLS|TECHNICAL\\s*SKILLS|CORE\\s*COMPETENCIES|COMPETENCIES|QUALIFICATIONS|SUMMARY\\s*OF\\s*QUALIFICATIONS|CERTIFICATIONS|LICENSES|CERTIFICATES|AWARDS|HONORS|HONOURS|ACHIEVEMENTS|PUBLICATIONS|RESEARCH|RESEARCH\\s*EXPERIENCE|LEADERSHIP|LEADERSHIP\\s*EXPERIENCE|ACTIVITIES|EXTRACURRICULAR\\s*ACTIVITIES|ACTIVITIES\\s*(?:&|AND)\\s*SKILLS|INVOLVEMENT|CAMPUS\\s*INVOLVEMENT|VOLUNTEER\\s*EXPERIENCE|VOLUNTEERING|COMMUNITY\\s*SERVICE|LANGUAGES|INTERESTS|HOBBIES|PROFILE|PROFESSIONAL\\s*PROFILE|SUMMARY|PROFESSIONAL\\s*SUMMARY|CAREER\\s*SUMMARY|OBJECTIVE|CAREER\\s*OBJECTIVE|PERSONAL\\s*INFORMATION|CONTACT\\s*INFORMATION|ADDITIONAL\\s*INFORMATION|TRAINING))\\s*[:]?\\s*$"
}
]
},
{
"levels": [
{
"expression": "^\\s*(?:\\d+[\\.、\\)]\\s*)?(?:教育背景|教育经历|学历背景|学术背景|技术背景|工作经历|工作经验|实习经历|项目经历|项目经验|科研经历|研究经历|校园经历|实践经历|专业经历|职业经历|技能|专业技能|技能特长|核心技能|技术栈|个人技能|工作技能|职业技能|技能与评价|技能与自我评价|工作技能与自我评价|职业技能与自我评价|证书|资格证书|职业资格|资质证书|获奖情况|获奖经历|荣誉|荣誉奖项|奖项|科研成果|论文发表|发表论文|领导经历|学生工作|校园活动|社团经历|活动经历|志愿经历|志愿服务|社会实践|语言能力|语言|自我评价|个人评价|自我总结|个人总结|个人优势|个人简介|个人信息|基本信息|联系方式|求职意向|应聘意向|职业目标|求职目标|兴趣爱好|兴趣特长|培训经历|其他信息|附加信息)\\s*[:]?\\s*$"
}
]
}
]
},
"label": "TitleChunker",
"name": "Title Chunker_0"
},
"dragging": false,
"id": "TitleChunker:FlatMiceFix",
"measured": {
"height": 73,
"width": 200
},
"position": {
"x": 524.2908769627791,
"y": 53.05515313482098
},
"selected": false,
"sourcePosition": "right",
"targetPosition": "left",
"type": "chunkerNode"
},
{
"data": {
"form": {
"field_name": "metadata",
"frequencyPenaltyEnabled": true,
"frequency_penalty": 0.7,
"llm_id": "MiniMax-M2.7@MiniMax",
"maxTokensEnabled": false,
"max_tokens": 256,
"outputs": {
"chunks": {
"type": "Array<Object>",
"value": []
}
},
"presencePenaltyEnabled": true,
"presence_penalty": 0.4,
"prompts": "Content: {TitleChunker:FlatMiceFix@chunks}",
"sys_prompt": "Act as a precise resume metadata extractor. Extract stable, chunk-supported metadata from the provided resume content.\n\nRules:\n1. Use only information explicitly stated in the content. Do not infer, guess, normalize, or add missing facts.\n2. The input may be only one chunk of a resume. Extract only what this content directly supports.\n3. Use only these field names:\ncandidate_name, gender, phone, email, city, location, nationality, linkedin, github, website, highest_degree, degree_levels, school_names, majors, graduation_years, work_experience_years, current_job_title, job_titles, company_names, job_experience, industries, target_job_titles, target_locations, employment_types, skills, certificates, awards, summary_tags\n4. Ignore detailed responsibilities, project descriptions, achievement narratives, self-evaluation, and other low-value local details.\n5. Keep values in the same language as the source text whenever possible.\n6. Remove duplicates and keep only concise, high-value metadata.\n7. Return only fields that are explicitly supported by the content. Do not return empty or unsupported fields.\n\nField guidance:\n- highest_degree: highest explicit degree level mentioned\n- degree_levels: all explicit degree levels mentioned\n- school_names: explicit school, college, or university names\n- majors: explicit fields of study\n- graduation_years: explicit graduation years only\n- work_experience_years: only if explicitly stated\n- current_job_title: only if explicitly current or most recent\n- job_titles: explicit role titles\n- company_names: explicit employer names\n- job_experience: concise structured work entries explicitly supported by the content, preferably including title, company, and time information when available\n- industries: explicit industry names only\n- target_job_titles: explicit desired roles only\n- target_locations: explicit desired work locations only\n- skills: concise, core, search-useful skills explicitly mentioned\n- certificates: explicit certificate names only\n- awards: explicit award names only\n- summary_tags: short, high-value tags strictly supported by the content\n\nReturn only the extracted metadata. Do not output explanatory text.",
"temperature": 0.1,
"temperatureEnabled": true,
"tenant_llm_id": 29,
"topPEnabled": true,
"top_p": 0.3
},
"label": "Extractor",
"name": "Auto Metadata"
},
"dragging": false,
"id": "Extractor:ThreeDrinksAct",
"measured": {
"height": 89,
"width": 200
},
"position": {
"x": 550.8123774842874,
"y": 161.4998493859579
},
"selected": false,
"sourcePosition": "right",
"targetPosition": "left",
"type": "contextNode"
},
{
"data": {
"form": {
"field_name": "keywords",
"frequencyPenaltyEnabled": true,
"frequency_penalty": 0.7,
"llm_id": "MiniMax-M2.7@MiniMax",
"maxTokensEnabled": false,
"max_tokens": 256,
"outputs": {
"chunks": {
"type": "Array<Object>",
"value": []
}
},
"presencePenaltyEnabled": true,
"presence_penalty": 0.4,
"prompts": "文本内容\n[在此处插入文本]",
"sys_prompt": "角色\n你是一名文本分析员。\n\n任务\n从给定的文本内容中提取最重要的关键词/短语。\n\n要求\n- 总结文本内容并给出最重要的5个关键词/短语。\n- 关键词必须与给定的文本内容使用相同的语言。\n- 关键词之间用英文逗号分隔。\n- 仅输出关键词。",
"temperature": 0.1,
"temperatureEnabled": true,
"topPEnabled": true,
"top_p": 0.3
},
"label": "Extractor",
"name": "提取器_0"
},
"dragging": false,
"id": "Extractor:ItchyFoxesStrive",
"measured": {
"height": 89,
"width": 200
},
"position": {
"x": 558.7638130889704,
"y": 260.698149098317
},
"selected": false,
"sourcePosition": "right",
"targetPosition": "left",
"type": "contextNode"
},
{
"data": {
"form": {
"field_name": "questions",
"frequencyPenaltyEnabled": true,
"frequency_penalty": 0.7,
"llm_id": "MiniMax-M2.7@MiniMax",
"maxTokensEnabled": false,
"max_tokens": 256,
"outputs": {
"chunks": {
"type": "Array<Object>",
"value": []
}
},
"presencePenaltyEnabled": true,
"presence_penalty": 0.4,
"prompts": "文本内容\n[在此处插入文本]",
"sys_prompt": "角色\n你是一名文本分析员。\n\n任务\n针对给定的文本内容提出3个问题。\n\n要求\n- 理解并总结文本内容并提出最重要的3个问题。\n- 问题的含义不应重叠。\n- 问题应尽可能涵盖文本的主要内容。\n- 问题必须与给定的文本内容使用相同的语言。\n- 每行一个问题。\n- 仅输出问题。",
"temperature": 0.1,
"temperatureEnabled": true,
"topPEnabled": true,
"top_p": 0.3
},
"label": "Extractor",
"name": "提取器_1"
},
"dragging": false,
"id": "Extractor:BusyClocksRush",
"measured": {
"height": 89,
"width": 200
},
"position": {
"x": 592.4119346324834,
"y": 353.6113302354397
},
"selected": false,
"sourcePosition": "right",
"targetPosition": "left",
"type": "contextNode"
},
{
"data": {
"form": {
"field_name": "summary",
"frequencyPenaltyEnabled": true,
"frequency_penalty": 0.7,
"llm_id": "MiniMax-M2.7@MiniMax",
"maxTokensEnabled": false,
"max_tokens": 256,
"outputs": {
"chunks": {
"type": "Array<Object>",
"value": []
}
},
"presencePenaltyEnabled": true,
"presence_penalty": 0.4,
"prompts": "要总结的文本:\n[在此处插入文本]",
"sys_prompt": "扮演一个精准的摘要者。你的任务是为提供的内容创建一个简洁且忠实于原文的摘要。\n\n关键说明\n1. 准确性:摘要必须严格基于所提供的信息。请勿引入任何未明确说明的新事实、结论或解释。\n2. 语言:摘要必须使用与原文相同的语言。\n3. 客观性:不带偏见地呈现要点,保留内容的原始意图和语气。请勿进行编辑。\n4. 简洁性:专注于最重要的思想,省略细节和多余的内容。",
"temperature": 0.1,
"temperatureEnabled": true,
"topPEnabled": true,
"top_p": 0.3
},
"label": "Extractor",
"name": "提取器_2"
},
"dragging": false,
"id": "Extractor:CuteSignsCut",
"measured": {
"height": 89,
"width": 200
},
"position": {
"x": 616.822830981782,
"y": 449.2756537664745
},
"selected": false,
"sourcePosition": "right",
"targetPosition": "left",
"type": "contextNode"
}
]
},
"variables": []
}