summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
ec38dad)
The function tools that every model call sends are promptTools, and
their schema helpers start with prompt too. The turns and the
compactions send the same prompt and tools, so the tools are a part of
the prompt, and agentTools read as the tools of an agent next to the
agent config. The parts of the prompt text, such as the task sentence
and the clause on the instructions, start with prompt as well.
The declarations of prompt.go already follow the order of the go-code
skill. The behavior does not change.
Issue:
947bddb
client: client,
model: model,
instructions: instructions,
client: client,
model: model,
instructions: instructions,
require.Equal(t, map[string]any{"effort": "high"}, body["reasoning"])
require.Equal(t, "agent-key", body["prompt_cache_key"])
require.Equal(t, map[string]any{"effort": "high"}, body["reasoning"])
require.Equal(t, "agent-key", body["prompt_cache_key"])
- tools, err := json.Marshal(agentTools())
+ tools, err := json.Marshal(promptTools())
require.NoError(t, err)
sent, err := json.Marshal(body["tools"])
require.NoError(t, err)
sent, err := json.Marshal(body["tools"])
// promptName stands for the name of the agent in promptText.
promptName = "{name}"
// promptName stands for the name of the agent in promptText.
promptName = "{name}"
- // taskSentence is the sentence of promptText that gets instructionsClause
- // when the user has instructions.
- taskSentence = "Do the user's tasks yourself, with your tools."
+ // promptTaskSentence is the sentence of promptText that gets
+ // promptInstructionsClause when the user has instructions.
+ promptTaskSentence = "Do the user's tasks yourself, with your tools."
- // instructionsClause points to the instructions of the user at the end
- // of the prompt.
- instructionsClause = ", following the user's instructions\nat the end of this prompt: who they are, how their files are organized and how\nthey want work done"
+ // promptInstructionsClause points to the instructions of the user at
+ // the end of the prompt.
+ promptInstructionsClause = ", following the user's instructions\nat the end of this prompt: who they are, how their files are organized and how\nthey want work done"
- // instructionsHeading starts the instructions of the user after
+ // promptInstructionsHeading starts the instructions of the user after
- instructionsHeading = "\n\n# The user's instructions\n\n"
+ promptInstructionsHeading = "\n\n# The user's instructions\n\n"
)
// promptText is the system prompt of the reference design, nearly word for
)
// promptText is the system prompt of the reference design, nearly word for
- text = strings.Replace(text, taskSentence, strings.TrimSuffix(taskSentence, ".")+instructionsClause+".", 1)
+ text = strings.Replace(text, promptTaskSentence, strings.TrimSuffix(promptTaskSentence, ".")+promptInstructionsClause+".", 1)
- return text + instructionsHeading + instructions
+ return text + promptInstructionsHeading + instructions
-// agentTools returns the function tools of every call: zoom, date, shell,
+// promptTools returns the function tools of every call: zoom, date, shell,
// read, write, and edit. A compaction sends them too and never calls them,
// because a change of the tools ends the shared prompt cache.
// read, write, and edit. A compaction sends them too and never calls them,
// because a change of the tools ends the shared prompt cache.
-func agentTools() []ModelTool {
+func promptTools() []ModelTool {
return []ModelTool{
{
Type: "function",
Name: "zoom",
Description: "Open the line id+n of the view into the two lines of n/2 under it; n = 1 gives the message whole.",
return []ModelTool{
{
Type: "function",
Name: "zoom",
Description: "Open the line id+n of the view into the two lines of n/2 under it; n = 1 gives the message whole.",
- Parameters: objectSchema(map[string]any{
- "id": integerSchema("The first message of the line: a multiple of n."),
- "n": integerSchema("The number of messages of the line: a power of 2."),
+ Parameters: promptObjectSchema(map[string]any{
+ "id": promptIntegerSchema("The first message of the line: a multiple of n."),
+ "n": promptIntegerSchema("The number of messages of the line: a power of 2."),
Type: "function",
Name: "date",
Description: "The date and time of message id.",
Type: "function",
Name: "date",
Description: "The date and time of message id.",
- Parameters: objectSchema(map[string]any{
- "id": integerSchema("The message."),
+ Parameters: promptObjectSchema(map[string]any{
+ "id": promptIntegerSchema("The message."),
Type: "function",
Name: "shell",
Description: "Run a command with bash, as the user, in the working directory, with no input. Gives its output and error output, and its exit status when it fails.",
Type: "function",
Name: "shell",
Description: "Run a command with bash, as the user, in the working directory, with no input. Gives its output and error output, and its exit status when it fails.",
- Parameters: objectSchema(map[string]any{
- "command": stringSchema("The bash command."),
+ Parameters: promptObjectSchema(map[string]any{
+ "command": promptStringSchema("The bash command."),
Type: "function",
Name: "read",
Description: "Read a text file.",
Type: "function",
Name: "read",
Description: "Read a text file.",
- Parameters: objectSchema(map[string]any{
- "path": stringSchema("The file, absolute or relative to the working directory."),
+ Parameters: promptObjectSchema(map[string]any{
+ "path": promptStringSchema("The file, absolute or relative to the working directory."),
Type: "function",
Name: "write",
Description: "Write a text file whole, replacing it when it exists. Makes the missing directories.",
Type: "function",
Name: "write",
Description: "Write a text file whole, replacing it when it exists. Makes the missing directories.",
- Parameters: objectSchema(map[string]any{
- "path": stringSchema("The file, absolute or relative to the working directory."),
- "text": stringSchema("The whole new content."),
+ Parameters: promptObjectSchema(map[string]any{
+ "path": promptStringSchema("The file, absolute or relative to the working directory."),
+ "text": promptStringSchema("The whole new content."),
Type: "function",
Name: "edit",
Description: "Replace the one occurrence of old in a text file with new.",
Type: "function",
Name: "edit",
Description: "Replace the one occurrence of old in a text file with new.",
- Parameters: objectSchema(map[string]any{
- "path": stringSchema("The file, absolute or relative to the working directory."),
- "old": stringSchema("The exact text to replace. It must occur once in the file."),
- "new": stringSchema("The text that replaces old."),
+ Parameters: promptObjectSchema(map[string]any{
+ "path": promptStringSchema("The file, absolute or relative to the working directory."),
+ "old": promptStringSchema("The exact text to replace. It must occur once in the file."),
+ "new": promptStringSchema("The text that replaces old."),
-// objectSchema returns a strict JSON schema of an object whose properties are
-// all required.
-func objectSchema(properties map[string]any) map[string]any {
+// promptObjectSchema returns a strict JSON schema of an object whose properties
+// are all required.
+func promptObjectSchema(properties map[string]any) map[string]any {
required := make([]string, 0, len(properties))
for name := range properties {
required = append(required, name)
required := make([]string, 0, len(properties))
for name := range properties {
required = append(required, name)
-// integerSchema returns the JSON schema of an integer.
-func integerSchema(description string) map[string]any {
+// promptIntegerSchema returns the JSON schema of an integer.
+func promptIntegerSchema(description string) map[string]any {
return map[string]any{
"type": "integer",
"description": description,
}
}
return map[string]any{
"type": "integer",
"description": description,
}
}
-// stringSchema returns the JSON schema of a string.
-func stringSchema(description string) map[string]any {
+// promptStringSchema returns the JSON schema of a string.
+func promptStringSchema(description string) map[string]any {
return map[string]any{
"type": "string",
"description": description,
return map[string]any{
"type": "string",
"description": description,
}
func TestAgentToolsAreStrictAndStable(t *testing.T) {
}
func TestAgentToolsAreStrictAndStable(t *testing.T) {
names := make([]string, len(tools))
for n, tool := range tools {
names[n] = tool.Name
names := make([]string, len(tools))
for n, tool := range tools {
names[n] = tool.Name
require.NoError(t, err)
for range 10 {
require.NoError(t, err)
for range 10 {
- again, err := json.Marshal(agentTools())
+ again, err := json.Marshal(promptTools())
require.NoError(t, err)
require.Equal(t, first, again)
}
require.NoError(t, err)
require.Equal(t, first, again)
}
Model: l.agent.config.Model,
Effort: l.agent.config.Effort,
Instructions: instructions,
Model: l.agent.config.Model,
Effort: l.agent.config.Effort,
Instructions: instructions,
Input: input,
Turn: turn,
})
Input: input,
Turn: turn,
})