You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
4.3 KiB
Go
85 lines
4.3 KiB
Go
/*
|
|
* Copyright 2025 CloudWeGo Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package agents
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/cloudwego/eino/adk"
|
|
"github.com/cloudwego/eino/components/model"
|
|
"github.com/cloudwego/eino/components/tool"
|
|
"github.com/cloudwego/eino/components/tool/utils"
|
|
"github.com/cloudwego/eino/compose"
|
|
)
|
|
|
|
func NewCodeAgent(ctx context.Context, tcm model.ToolCallingChatModel) (adk.Agent, error) {
|
|
type RAGInput struct {
|
|
Query string `json:"query" jsonschema_description:"query for search"`
|
|
Context *string `json:"context" jsonschema_description:"user input context"`
|
|
}
|
|
type RAGOutput struct {
|
|
Documents []string `json:"documents"`
|
|
}
|
|
knowledgeBaseTool, err := utils.InferTool(
|
|
"knowledge_base",
|
|
"knowledge base which could answer common questions, provide specific reasons for answers, and improve accuracy",
|
|
func(ctx context.Context, input *RAGInput) (output *RAGOutput, err error) {
|
|
// replace it with real knowledge base search
|
|
if input.Query == "" {
|
|
return nil, fmt.Errorf("RAG Input query is required")
|
|
}
|
|
|
|
return &RAGOutput{
|
|
[]string{
|
|
"Q: What is the difference between a list and a tuple in Python?\nA: A list is mutable, meaning you can modify its elements after creation, while a tuple is immutable and cannot be changed once created. Lists use square brackets [], tuples use parentheses ().",
|
|
"Q: How do you handle exceptions in Java?\nA: You handle exceptions in Java using try-catch blocks. Code that might throw an exception is placed inside the try block, and the catch block handles the exception. Optionally, a finally block can be used for cleanup.",
|
|
"Q: What is the purpose of the async and await keywords in JavaScript?\nA: async marks a function as asynchronous, allowing it to return a Promise. await pauses the execution of an async function until the Promise resolves, enabling easier asynchronous code writing.",
|
|
"Q: How can you optimize SQL queries for better performance?\nA: Common optimizations include creating indexes on frequently queried columns, avoiding SELECT *, using JOINs efficiently, and analyzing query execution plans to identify bottlenecks.",
|
|
"Q: What is dependency injection and why is it useful?\nA: Dependency injection is a design pattern where an object receives its dependencies from an external source rather than creating them itself. It promotes loose coupling, easier testing, and better code maintainability.",
|
|
},
|
|
}, nil
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
|
|
Name: "CodeAgent",
|
|
Description: "The CodeAgent specializes in generating high-quality code by leveraging a knowledge base as a tool. It recalls relevant knowledge and best practices to produce efficient, maintainable, and accurate code solutions tailored to the project requirements.",
|
|
Instruction: `You are the CodeAgent. Your responsibilities include:
|
|
|
|
- Generating high-quality, efficient, and maintainable code based on the project requirements.
|
|
- Utilizing a knowledge base tool to recall relevant coding standards, patterns, and best practices.
|
|
- Ensuring the code is clear, well-documented, and meets the specified functionality.
|
|
- Reviewing related knowledge to enhance the accuracy and quality of your code.
|
|
- Communicating your coding decisions and providing explanations when necessary.
|
|
- Responding promptly and professionally to user requests or clarifications.
|
|
|
|
Tool handling:
|
|
When the user's question is vague or exceeds the scope of your answer, please use the knowledge_base tool to recall relevant results from the knowledge base and provide accurate answers based on the results.
|
|
`,
|
|
Model: tcm,
|
|
ToolsConfig: adk.ToolsConfig{
|
|
ToolsNodeConfig: compose.ToolsNodeConfig{
|
|
Tools: []tool.BaseTool{knowledgeBaseTool},
|
|
},
|
|
},
|
|
MaxIterations: 3,
|
|
})
|
|
}
|