feat(skills): enhance agent skills with additional tags and commands
Some checks failed
CI / build-and-test (push) Failing after -29m56s
Some checks failed
CI / build-and-test (push) Failing after -29m56s
- Added language_tags, library_tags, framework_tags, and domain_tags to agent skills. - Introduced new commands: get_skill and get_guardrail for fetching specific skills and guardrails. - Updated database schema and migration scripts to accommodate new fields. - Enhanced skill listing functionality to support filtering by new tags. - Improved error handling and response structures for skill-related operations.
This commit is contained in:
@@ -15,11 +15,24 @@ func (db *DB) AddSkill(ctx context.Context, skill ext.AgentSkill) (ext.AgentSkil
|
||||
if skill.Tags == nil {
|
||||
skill.Tags = []string{}
|
||||
}
|
||||
if skill.LanguageTags == nil {
|
||||
skill.LanguageTags = []string{}
|
||||
}
|
||||
if skill.LibraryTags == nil {
|
||||
skill.LibraryTags = []string{}
|
||||
}
|
||||
if skill.FrameworkTags == nil {
|
||||
skill.FrameworkTags = []string{}
|
||||
}
|
||||
if skill.DomainTags == nil {
|
||||
skill.DomainTags = []string{}
|
||||
}
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
insert into agent_skills (name, description, content, tags)
|
||||
values ($1, $2, $3, $4)
|
||||
insert into agent_skills (name, description, content, tags, language_tags, library_tags, framework_tags, domain_tags)
|
||||
values ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||
returning id, guid, created_at, updated_at
|
||||
`, skill.Name, skill.Description, skill.Content, skill.Tags)
|
||||
`, skill.Name, skill.Description, skill.Content, skill.Tags,
|
||||
skill.LanguageTags, skill.LibraryTags, skill.FrameworkTags, skill.DomainTags)
|
||||
|
||||
created := skill
|
||||
var model generatedmodels.ModelPublicAgentSkills
|
||||
@@ -45,11 +58,11 @@ func (db *DB) RemoveSkill(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
func (db *DB) ListSkills(ctx context.Context, tag string) ([]ext.AgentSkill, error) {
|
||||
q := `select id, name, description, content, tags::text[], created_at, updated_at from agent_skills`
|
||||
q := `select id, name, description, content, tags::text[], language_tags::text[], library_tags::text[], framework_tags::text[], domain_tags::text[], created_at, updated_at from agent_skills`
|
||||
args := []any{}
|
||||
if t := strings.TrimSpace(tag); t != "" {
|
||||
args = append(args, t)
|
||||
q += fmt.Sprintf(" where $%d = any(tags)", len(args))
|
||||
q += fmt.Sprintf(" where $%d = any(tags) or $%d = any(language_tags) or $%d = any(library_tags) or $%d = any(framework_tags) or $%d = any(domain_tags)", len(args), len(args), len(args), len(args), len(args))
|
||||
}
|
||||
q += " order by name"
|
||||
|
||||
@@ -61,52 +74,91 @@ func (db *DB) ListSkills(ctx context.Context, tag string) ([]ext.AgentSkill, err
|
||||
|
||||
var skills []ext.AgentSkill
|
||||
for rows.Next() {
|
||||
var model generatedmodels.ModelPublicAgentSkills
|
||||
var tags []string
|
||||
if err := rows.Scan(&model.ID, &model.Name, &model.Description, &model.Content, &tags, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
s, err := scanSkill(rows)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("scan agent skill: %w", err)
|
||||
}
|
||||
s := ext.AgentSkill{
|
||||
ID: model.ID.Int64(),
|
||||
Name: model.Name.String(),
|
||||
Description: model.Description.String(),
|
||||
Content: model.Content.String(),
|
||||
Tags: tags,
|
||||
CreatedAt: model.CreatedAt.Time(),
|
||||
UpdatedAt: model.UpdatedAt.Time(),
|
||||
}
|
||||
if s.Tags == nil {
|
||||
s.Tags = []string{}
|
||||
}
|
||||
skills = append(skills, s)
|
||||
}
|
||||
return skills, rows.Err()
|
||||
}
|
||||
|
||||
func (db *DB) GetSkill(ctx context.Context, id int64) (ext.AgentSkill, error) {
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
select id, name, description, content, tags::text[], created_at, updated_at
|
||||
from agent_skills where id = $1
|
||||
`, id)
|
||||
const skillSelectCols = `id, name, description, content, tags::text[], language_tags::text[], library_tags::text[], framework_tags::text[], domain_tags::text[], created_at, updated_at`
|
||||
|
||||
type skillScanner interface {
|
||||
Scan(dest ...any) error
|
||||
}
|
||||
|
||||
func scanSkill(row skillScanner) (ext.AgentSkill, error) {
|
||||
var model generatedmodels.ModelPublicAgentSkills
|
||||
var tags []string
|
||||
if err := row.Scan(&model.ID, &model.Name, &model.Description, &model.Content, &tags, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
var tags, langTags, libTags, fwTags, domTags []string
|
||||
if err := row.Scan(&model.ID, &model.Name, &model.Description, &model.Content, &tags, &langTags, &libTags, &fwTags, &domTags, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return ext.AgentSkill{}, err
|
||||
}
|
||||
nilToEmpty := func(s []string) []string {
|
||||
if s == nil {
|
||||
return []string{}
|
||||
}
|
||||
return s
|
||||
}
|
||||
return ext.AgentSkill{
|
||||
ID: model.ID.Int64(),
|
||||
Name: model.Name.String(),
|
||||
Description: model.Description.String(),
|
||||
Content: model.Content.String(),
|
||||
Tags: nilToEmpty(tags),
|
||||
LanguageTags: nilToEmpty(langTags),
|
||||
LibraryTags: nilToEmpty(libTags),
|
||||
FrameworkTags: nilToEmpty(fwTags),
|
||||
DomainTags: nilToEmpty(domTags),
|
||||
CreatedAt: model.CreatedAt.Time(),
|
||||
UpdatedAt: model.UpdatedAt.Time(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (db *DB) GetSkill(ctx context.Context, id int64) (ext.AgentSkill, error) {
|
||||
row := db.pool.QueryRow(ctx, `select `+skillSelectCols+` from agent_skills where id = $1`, id)
|
||||
s, err := scanSkill(row)
|
||||
if err != nil {
|
||||
return ext.AgentSkill{}, fmt.Errorf("get agent skill: %w", err)
|
||||
}
|
||||
s := ext.AgentSkill{
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (db *DB) GetSkillByName(ctx context.Context, name string) (ext.AgentSkill, error) {
|
||||
row := db.pool.QueryRow(ctx, `select `+skillSelectCols+` from agent_skills where name = $1`, name)
|
||||
s, err := scanSkill(row)
|
||||
if err != nil {
|
||||
return ext.AgentSkill{}, fmt.Errorf("get agent skill by name: %w", err)
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (db *DB) GetGuardrailByName(ctx context.Context, name string) (ext.AgentGuardrail, error) {
|
||||
row := db.pool.QueryRow(ctx, `
|
||||
select id, name, description, content, severity, tags::text[], created_at, updated_at
|
||||
from agent_guardrails where name = $1
|
||||
`, name)
|
||||
|
||||
var model generatedmodels.ModelPublicAgentGuardrails
|
||||
var tags []string
|
||||
if err := row.Scan(&model.ID, &model.Name, &model.Description, &model.Content, &model.Severity, &tags, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
return ext.AgentGuardrail{}, fmt.Errorf("get agent guardrail by name: %w", err)
|
||||
}
|
||||
g := ext.AgentGuardrail{
|
||||
ID: model.ID.Int64(),
|
||||
Name: model.Name.String(),
|
||||
Description: model.Description.String(),
|
||||
Content: model.Content.String(),
|
||||
Severity: model.Severity.String(),
|
||||
Tags: tags,
|
||||
CreatedAt: model.CreatedAt.Time(),
|
||||
UpdatedAt: model.UpdatedAt.Time(),
|
||||
}
|
||||
if s.Tags == nil {
|
||||
s.Tags = []string{}
|
||||
if g.Tags == nil {
|
||||
g.Tags = []string{}
|
||||
}
|
||||
return s, nil
|
||||
return g, nil
|
||||
}
|
||||
|
||||
// Agent Guardrails
|
||||
@@ -253,7 +305,7 @@ func (db *DB) RemoveProjectSkill(ctx context.Context, projectID, skillID int64)
|
||||
|
||||
func (db *DB) ListProjectSkills(ctx context.Context, projectID int64) ([]ext.AgentSkill, error) {
|
||||
rows, err := db.pool.Query(ctx, `
|
||||
select s.id, s.name, s.description, s.content, s.tags::text[], s.created_at, s.updated_at
|
||||
select s.`+skillSelectCols+`
|
||||
from agent_skills s
|
||||
join project_skills ps on ps.skill_id = s.id
|
||||
where ps.project_id = $1
|
||||
@@ -266,23 +318,10 @@ func (db *DB) ListProjectSkills(ctx context.Context, projectID int64) ([]ext.Age
|
||||
|
||||
var skills []ext.AgentSkill
|
||||
for rows.Next() {
|
||||
var model generatedmodels.ModelPublicAgentSkills
|
||||
var tags []string
|
||||
if err := rows.Scan(&model.ID, &model.Name, &model.Description, &model.Content, &tags, &model.CreatedAt, &model.UpdatedAt); err != nil {
|
||||
s, err := scanSkill(rows)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("scan project skill: %w", err)
|
||||
}
|
||||
s := ext.AgentSkill{
|
||||
ID: model.ID.Int64(),
|
||||
Name: model.Name.String(),
|
||||
Description: model.Description.String(),
|
||||
Content: model.Content.String(),
|
||||
Tags: tags,
|
||||
CreatedAt: model.CreatedAt.Time(),
|
||||
UpdatedAt: model.UpdatedAt.Time(),
|
||||
}
|
||||
if s.Tags == nil {
|
||||
s.Tags = []string{}
|
||||
}
|
||||
skills = append(skills, s)
|
||||
}
|
||||
return skills, rows.Err()
|
||||
|
||||
Reference in New Issue
Block a user