U10a 续片:提示词与 xlsx 资产内嵌回退 #10
@@ -0,0 +1,10 @@
|
||||
// configs 包内嵌运行提示词资产(U10a:单文件应用无源码目录时回退使用)。
|
||||
// 磁盘路径存在时仍优先磁盘(开发态行为不变)。
|
||||
package configs
|
||||
|
||||
import "embed"
|
||||
|
||||
// Assets 内嵌 configs/agents 与 configs/shared 提示词。
|
||||
//
|
||||
//go:embed agents shared
|
||||
var Assets embed.FS
|
||||
+13
-2
@@ -1,10 +1,13 @@
|
||||
package quote
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"chat-agent-system/templates"
|
||||
"github.com/xuri/excelize/v2"
|
||||
)
|
||||
|
||||
@@ -112,8 +115,16 @@ func CalculateAndFill(in Input, templateXlsx string, outPath string) (*Summary,
|
||||
}
|
||||
}
|
||||
|
||||
f, err := excelize.OpenFile(templateXlsx)
|
||||
if err != nil {
|
||||
var f *excelize.File
|
||||
if tf, err := excelize.OpenFile(templateXlsx); err == nil {
|
||||
f = tf
|
||||
} else if eb, eerr := templates.XlsxAssets.ReadFile(strings.TrimPrefix(filepath.ToSlash(templateXlsx), "templates/")); eerr == nil {
|
||||
ef, oerr := excelize.OpenReader(bytes.NewReader(eb))
|
||||
if oerr != nil {
|
||||
return nil, fmt.Errorf("open embedded template %s: %w", templateXlsx, oerr)
|
||||
}
|
||||
f = ef
|
||||
} else {
|
||||
return nil, fmt.Errorf("open template %s: %w", templateXlsx, err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"chat-agent-system/configs"
|
||||
"chat-agent-system/internal/workflowdef"
|
||||
"chat-agent-system/templates"
|
||||
)
|
||||
@@ -90,12 +91,23 @@ func GetAgentInstructionFile(rel string) (string, error) {
|
||||
path := filepath.Join(root, filepath.FromSlash(rel))
|
||||
b, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("read agent instruction file %s: %w", rel, err)
|
||||
// U10a:磁盘缺失(单文件部署)时回退内嵌 configs 资产。
|
||||
eb, eerr := configs.Assets.ReadFile(strings.TrimPrefix(rel, "configs/"))
|
||||
if eerr != nil {
|
||||
return "", fmt.Errorf("read agent instruction file %s: %w", rel, err)
|
||||
}
|
||||
b = eb
|
||||
}
|
||||
|
||||
inst := string(b)
|
||||
writingPath := filepath.Join(root, "configs", "shared", "writing.md")
|
||||
if wb, err := os.ReadFile(writingPath); err == nil {
|
||||
wb, werr := os.ReadFile(writingPath)
|
||||
if werr != nil {
|
||||
if eb, eerr := configs.Assets.ReadFile("shared/writing.md"); eerr == nil {
|
||||
wb = eb
|
||||
}
|
||||
}
|
||||
if wb != nil {
|
||||
inst += "\n\n" + string(wb)
|
||||
}
|
||||
return inst, nil
|
||||
|
||||
@@ -4,7 +4,9 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"chat-agent-system/configs"
|
||||
"chat-agent-system/internal/template"
|
||||
"chat-agent-system/templates"
|
||||
)
|
||||
|
||||
func TestLoadDocTemplatesAndAgents(t *testing.T) {
|
||||
@@ -67,3 +69,24 @@ func TestGetDocTemplate_WorksWithoutDiskCheckout(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestEmbeddedPromptAssetsPresent 校验 U10a 内嵌资产齐备(单文件部署回退源)。
|
||||
// embed 在编译期捕获源码树,这里防止资产被意外移出嵌入范围。
|
||||
func TestEmbeddedPromptAssetsPresent(t *testing.T) {
|
||||
for _, name := range []string{"agents/leader.md", "agents/engineer.md", "shared/writing.md"} {
|
||||
b, err := configs.Assets.ReadFile(name)
|
||||
if err != nil {
|
||||
t.Fatalf("embedded configs asset %s: %v", name, err)
|
||||
}
|
||||
if len(b) == 0 {
|
||||
t.Fatalf("embedded configs asset %s is empty", name)
|
||||
}
|
||||
}
|
||||
xl, err := templates.XlsxAssets.ReadFile("xlsx/cdo_quote.xlsx")
|
||||
if err != nil {
|
||||
t.Fatalf("embedded xlsx asset: %v", err)
|
||||
}
|
||||
if len(xl) == 0 {
|
||||
t.Fatal("embedded xlsx asset is empty")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,3 +7,8 @@ import "embed"
|
||||
//
|
||||
//go:embed docs/*.md
|
||||
var DocTemplates embed.FS
|
||||
|
||||
// XlsxAssets 内嵌运行 xlsx 资产(如 cdo_quote.xlsx);磁盘路径存在时优先磁盘。
|
||||
//
|
||||
//go:embed xlsx
|
||||
var XlsxAssets embed.FS
|
||||
|
||||
Reference in New Issue
Block a user