Skip to content

Commit 6001196

Browse files
Merge pull request #226 from markwallace-microsoft/users/markwallace/agent_compatible_spec
Update Prompty to support Agent definitions
2 parents 4e29fdc + b304e55 commit 6001196

25 files changed

+1578
-519
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
namespace Prompty.Core.Tests;
2+
3+
public class LoadAgentTests
4+
{
5+
public LoadAgentTests()
6+
{
7+
Environment.SetEnvironmentVariable("AZURE_OPENAI_ENDPOINT", "ENDPOINT_VALUE");
8+
}
9+
10+
[Theory]
11+
[InlineData("agents/basic.prompty")]
12+
[InlineData("agents/claim_buddy.prompty")]
13+
[InlineData("agents/code-interpreter.prompty")]
14+
[InlineData("agents/on-your-data.prompty")]
15+
[InlineData("agents/on-your-file.prompty")]
16+
[InlineData("agents/openapi.prompty")]
17+
[InlineData("agents/rag-teams-agent.prompty")]
18+
[InlineData("agents/web-search.prompty")]
19+
public void ItCanLoad(string path)
20+
{
21+
// Arrange & Act
22+
var prompty = Prompty.Load(path);
23+
24+
// Assert
25+
Assert.NotNull(prompty);
26+
Assert.NotNull(prompty.Content);
27+
}
28+
29+
[Fact]
30+
public void ItCanLoadWithMetadata()
31+
{
32+
// Arrange & Act
33+
var prompty = Prompty.Load("agents/basic.prompty");
34+
35+
// Assert
36+
Assert.NotNull(prompty);
37+
Assert.Equal("my_agent_21", prompty.Id);
38+
Assert.Equal("Basic Agent", prompty.Name);
39+
Assert.Equal("A basic prompt that uses the gpt-4o chat API to answer questions", prompty.Description);
40+
Assert.NotNull(prompty.Metadata);
41+
Assert.NotNull(prompty.Metadata.Authors);
42+
Assert.Equal(2, prompty.Metadata.Authors.Count);
43+
Assert.NotNull(prompty.Metadata.Tags);
44+
Assert.Equal(2, prompty.Metadata.Tags.Count);
45+
}
46+
47+
[Fact]
48+
public void ItCanLoadWithModel()
49+
{
50+
// Arrange & Act
51+
var prompty = Prompty.Load("agents/basic.prompty");
52+
53+
// Assert
54+
Assert.NotNull(prompty);
55+
Assert.NotNull(prompty.Model);
56+
Assert.Equal("chat", prompty.Model.Api);
57+
Assert.NotNull(prompty.Model.Connection);
58+
Assert.Equal("azure_openai", prompty.Model.Connection.Type);
59+
Assert.Equal("gpt-4o", prompty.Model.Connection.ExtensionData["azure_deployment"]);
60+
Assert.NotNull(prompty.Model.Options);
61+
Assert.Equal("150", prompty.Model.Options["max_tokens"]);
62+
Assert.Equal("0.5", prompty.Model.Options["temperature"]);
63+
Assert.Equal("1", prompty.Model.Options["top_p"]);
64+
Assert.Equal("0", prompty.Model.Options["frequency_penalty"]);
65+
Assert.Equal("0", prompty.Model.Options["presence_penalty"]);
66+
}
67+
68+
[Fact]
69+
public void ItCanLoadWithInputs()
70+
{
71+
// Arrange & Act
72+
var prompty = Prompty.Load("agents/basic.prompty");
73+
74+
// Assert
75+
Assert.NotNull(prompty);
76+
Assert.NotNull(prompty.Inputs);
77+
Assert.Equal(3, prompty.Inputs.Count);
78+
Assert.NotNull(prompty.Inputs["firstName"]);
79+
Assert.NotNull(prompty.Inputs["lastName"]);
80+
Assert.NotNull(prompty.Inputs["question"]);
81+
Assert.Equal("firstName", prompty.Inputs["firstName"].Name);
82+
Assert.Equal(PropertyType.String, prompty.Inputs["firstName"].Type);
83+
Assert.Equal("User", prompty.Inputs["firstName"].Default);
84+
Assert.Equal("April", prompty.Inputs["firstName"].Sample);
85+
Assert.Equal("The first name of the customer", prompty.Inputs["firstName"].Description);
86+
Assert.True(prompty.Inputs["firstName"].Strict);
87+
Assert.True(prompty.Inputs["firstName"].Required);
88+
Assert.Null(prompty.Inputs["firstName"].JsonSchema);
89+
}
90+
91+
[Fact]
92+
public void ItCanLoadWithOutputs()
93+
{
94+
// Arrange & Act
95+
var prompty = Prompty.Load("agents/basic.prompty");
96+
97+
// Assert
98+
Assert.NotNull(prompty);
99+
Assert.NotNull(prompty.Outputs);
100+
Assert.NotNull(prompty.Outputs["work"]);
101+
Assert.Equal("work", prompty.Outputs["work"].Name);
102+
Assert.Equal(PropertyType.Object, prompty.Outputs["work"].Type);
103+
Assert.Equal("The thing to output", prompty.Outputs["work"].Description);
104+
Assert.NotNull(prompty.Outputs["work"].JsonSchema);
105+
}
106+
107+
[Fact]
108+
public void ItCanLoadWithTools()
109+
{
110+
// Arrange & Act
111+
var prompty = Prompty.Load("agents/basic.prompty");
112+
113+
// Assert
114+
Assert.NotNull(prompty);
115+
Assert.NotNull(prompty.Tools);
116+
Assert.Single(prompty.Tools);
117+
Assert.Equal("coder", prompty.Tools[0].Id);
118+
Assert.Equal("openai.CodeInterpreter", prompty.Tools[0].Type);
119+
Assert.NotNull(prompty.Tools[0].Options);
120+
Assert.NotNull(prompty.Tools[0].Options?["connection"]);
121+
Assert.NotNull(prompty.Tools[0].Options?["other"]);
122+
}
123+
124+
[Fact]
125+
public void ItCanLoadWithTemplate()
126+
{
127+
// Arrange & Act
128+
var prompty = Prompty.Load("agents/basic.prompty");
129+
130+
// Assert
131+
Assert.NotNull(prompty);
132+
Assert.NotNull(prompty.Template);
133+
Assert.Equal("mustache", prompty.Template.Format);
134+
Assert.Equal("prompty", prompty.Template.Parser);
135+
}
136+
}

runtime/promptycs/Prompty.Core.Tests/LoadTests.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using System.Transactions;
2-
31
namespace Prompty.Core.Tests;
42

53

@@ -33,7 +31,7 @@ public void LoadRawWithConfig(string path)
3331
{
3432
var prompty = Prompty.Load(path, "fake");
3533

36-
Assert.Equal("FAKE_TYPE", prompty.Model?.Configuration.Type);
34+
Assert.Equal("FAKE_TYPE", prompty.Model?.Connection?.Type);
3735
}
3836

3937
[Fact]
@@ -46,9 +44,10 @@ public void BasicSampleParameters()
4644
for (int i = 0; i < props.Length; i++)
4745
{
4846
string? item = props[i];
47+
Assert.NotNull(prompty.Inputs);
4948
Assert.NotNull(prompty.Inputs[item]);
5049
Assert.Equal(PropertyType.String, prompty.Inputs[item].Type);
51-
Assert.Equal(samples[i], prompty.Inputs[item].Sample);
50+
Assert.Equal(samples[i], prompty.Inputs[item].Sample);
5251
}
5352
}
5453

@@ -58,10 +57,10 @@ public void BasicParameters()
5857
var p = "prompty/basic_props.prompty";
5958
var prompty = Prompty.Load(p);
6059
string[] props = { "firstName", "lastName", "question", "age", "pct", "valid", "items" };
61-
PropertyType[] types = { PropertyType.String,
62-
PropertyType.String,
63-
PropertyType.String,
64-
PropertyType.Number,
60+
PropertyType[] types = { PropertyType.String,
61+
PropertyType.String,
62+
PropertyType.String,
63+
PropertyType.Number,
6564
PropertyType.Number,
6665
PropertyType.Boolean,
6766
PropertyType.Array };
@@ -89,7 +88,7 @@ public void BasicParameters()
8988
{
9089
Assert.Equal(samples[i], prompty.Inputs[item].Sample);
9190
Assert.Equal(defaults[i], prompty.Inputs[item].Default);
92-
}
91+
}
9392
Assert.Equal($"The {item} description", prompty.Inputs[item].Description);
9493
}
9594
}

runtime/promptycs/Prompty.Core.Tests/Prompty.Core.Tests.csproj

Lines changed: 14 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -26,130 +26,18 @@
2626
<ProjectReference Include="..\Prompty.Core\Prompty.Core.csproj" />
2727
</ItemGroup>
2828

29-
<ItemGroup>
30-
<None Update="generated\1contoso.md">
31-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
32-
</None>
33-
<None Update="generated\2contoso.md">
34-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
35-
</None>
36-
<None Update="generated\3contoso.md">
37-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
38-
</None>
39-
<None Update="generated\4contoso.md">
40-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
41-
</None>
42-
<None Update="generated\basic.prompty">
43-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
44-
</None>
45-
<None Update="generated\basic.prompty.md">
46-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
47-
</None>
48-
<None Update="generated\camping.jpg">
49-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
50-
</None>
51-
<None Update="generated\context.prompty.md">
52-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
53-
</None>
54-
<None Update="generated\contoso_multi.md">
55-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
56-
</None>
57-
<None Update="generated\faithfulness.prompty.md">
58-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
59-
</None>
60-
<None Update="generated\groundedness.prompty.md">
61-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
62-
</None>
63-
<None Update="prompty.json">
64-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
65-
</None>
66-
<None Update="prompty\basic_props.prompty">
67-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
68-
</None>
69-
<None Update="prompty\basic.prompty">
70-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
71-
</None>
72-
<None Update="prompty\basic_mustache.prompty">
73-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
74-
</None>
75-
<None Update="prompty\basic.prompty.execution.json">
76-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
77-
</None>
78-
<None Update="prompty\basic_json_output.prompty">
79-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
80-
</None>
81-
<None Update="prompty\camping.jpg">
82-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
83-
</None>
84-
<None Update="prompty\chat.prompty">
85-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
86-
</None>
87-
<None Update="prompty\context.json">
88-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
89-
</None>
90-
<None Update="prompty\context.prompty">
91-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
92-
</None>
93-
<None Update="prompty\context.prompty.execution.json">
94-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
95-
</None>
96-
<None Update="prompty\embedding.prompty">
97-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
98-
</None>
99-
<None Update="prompty\embedding.prompty.execution.json">
100-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
101-
</None>
102-
<None Update="prompty\evaluation.prompty">
103-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
104-
</None>
105-
<None Update="prompty\faithfulness.prompty">
106-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
107-
</None>
108-
<None Update="prompty\faithfulness.prompty.execution.json">
109-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
110-
</None>
111-
<None Update="prompty\fake.prompty">
112-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
113-
</None>
114-
<None Update="prompty\funcfile.json">
115-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
116-
</None>
117-
<None Update="prompty\funcfile.prompty">
118-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
119-
</None>
120-
<None Update="prompty\functions.prompty">
121-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
122-
</None>
123-
<None Update="prompty\functions.prompty.execution.json">
124-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
125-
</None>
126-
<None Update="prompty\groundedness.prompty">
127-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
128-
</None>
129-
<None Update="prompty\groundedness.prompty.execution.json">
130-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
131-
</None>
132-
<None Update="prompty\prompty.json">
133-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
134-
</None>
135-
<None Update="prompty\serverless.prompty">
136-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
137-
</None>
138-
<None Update="prompty\serverless.prompty.execution.json">
139-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
140-
</None>
141-
<None Update="prompty\serverless_stream.prompty">
142-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
143-
</None>
144-
<None Update="prompty\serverless_stream.prompty.execution.json">
145-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
146-
</None>
147-
<None Update="prompty\streaming.prompty">
148-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
149-
</None>
150-
<None Update="prompty\streaming.prompty.execution.json">
151-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
152-
</None>
153-
</ItemGroup>
154-
29+
<ItemGroup>
30+
<None Update="generated\*.*">
31+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
32+
</None>
33+
<None Update="prompty.json">
34+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
35+
</None>
36+
<None Update="prompty\*.*">
37+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
38+
</None>
39+
<None Update="agents\*.*">
40+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
41+
</None>
42+
</ItemGroup>
15543
</Project>

0 commit comments

Comments
 (0)