support for function calling on vets

This commit is contained in:
Oded Shopen 2024-09-10 21:44:44 +03:00
parent 6f93676ace
commit a382e8f721
3 changed files with 29 additions and 2 deletions

View file

@ -8,6 +8,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description; import org.springframework.context.annotation.Description;
import org.springframework.samples.petclinic.owner.Owner; import org.springframework.samples.petclinic.owner.Owner;
import org.springframework.samples.petclinic.owner.Pet; import org.springframework.samples.petclinic.owner.Pet;
import org.springframework.samples.petclinic.vet.Vet;
@Configuration @Configuration
class AIFunctionConfiguration { class AIFunctionConfiguration {
@ -20,6 +21,14 @@ class AIFunctionConfiguration {
}; };
} }
@Bean
@Description("List the veterinarians that the pet clinic has")
public Function<VetRequest, VetResponse> listVets(PetclinicAiProvider petclinicAiProvider) {
return request -> {
return petclinicAiProvider.getAllVets();
};
}
@Bean @Bean
@Description("Add a pet to an owner identified by the ownerId") @Description("Add a pet to an owner identified by the ownerId")
public Function<AddPetRequest, AddedPetResponse> addPetToOwner(PetclinicAiProvider petclinicAiProvider) { public Function<AddPetRequest, AddedPetResponse> addPetToOwner(PetclinicAiProvider petclinicAiProvider) {
@ -41,3 +50,10 @@ record OwnersResponse(List<Owner> owners) {
record AddedPetResponse(Owner owner) { record AddedPetResponse(Owner owner) {
}; };
record VetResponse(List<Vet> vet) {
};
record VetRequest(Vet vet) {
}

View file

@ -5,6 +5,8 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.samples.petclinic.owner.Owner; import org.springframework.samples.petclinic.owner.Owner;
import org.springframework.samples.petclinic.owner.OwnerRepository; import org.springframework.samples.petclinic.owner.OwnerRepository;
import org.springframework.samples.petclinic.vet.Vet;
import org.springframework.samples.petclinic.vet.VetRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
@ -12,8 +14,11 @@ public class PetclinicAiProvider {
OwnerRepository ownerRepository; OwnerRepository ownerRepository;
public PetclinicAiProvider(OwnerRepository ownerRepository) { VetRepository vetRepository;
public PetclinicAiProvider(OwnerRepository ownerRepository, VetRepository vetRepository) {
this.ownerRepository = ownerRepository; this.ownerRepository = ownerRepository;
this.vetRepository = vetRepository;
} }
public OwnersResponse getAllOwners() { public OwnersResponse getAllOwners() {
@ -22,6 +27,12 @@ public class PetclinicAiProvider {
return new OwnersResponse(ownerPage.getContent()); return new OwnersResponse(ownerPage.getContent());
} }
public VetResponse getAllVets() {
Pageable pageable = PageRequest.of(0, Integer.MAX_VALUE);
Page<Vet> vetsPage = vetRepository.findAll(pageable);
return new VetResponse(vetsPage.getContent());
}
public AddedPetResponse addPetToOwner(AddPetRequest request) { public AddedPetResponse addPetToOwner(AddPetRequest request) {
Owner owner = ownerRepository.findById(request.ownerId()); Owner owner = ownerRepository.findById(request.ownerId());
owner.addPet(request.pet()); owner.addPet(request.pet());

View file

@ -5,5 +5,5 @@ spring.datasource.username=${POSTGRES_USER:petclinic}
spring.datasource.password=${POSTGRES_PASS:petclinic} spring.datasource.password=${POSTGRES_PASS:petclinic}
# SQL is written to be idempotent so this is safe # SQL is written to be idempotent so this is safe
spring.sql.init.mode=always spring.sql.init.mode=always
spring.ai.azure.openai.chat.options.functions=listOwners,addPetToOwner spring.ai.azure.openai.chat.options.functions=listOwners,listVets,addPetToOwner
spring.ai.azure.openai.chat.options.temperature: 0.7 spring.ai.azure.openai.chat.options.temperature: 0.7