Commit 6a3cafb41ee43b4f27d995a892a8fd013784bbe3

Authored by cherishsince
1 parent c71b8b3c

适配jdk8 - 2,这个地方不会改

yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/model/function/FunctionCallbackContext.java
1   -///*
2   -// * Copyright 2024-2024 the original author or authors.
3   -// *
4   -// * Licensed under the Apache License, Version 2.0 (the "License");
5   -// * you may not use this file except in compliance with the License.
6   -// * You may obtain a copy of the License at
7   -// *
8   -// * https://www.apache.org/licenses/LICENSE-2.0
9   -// *
10   -// * Unless required by applicable law or agreed to in writing, software
11   -// * distributed under the License is distributed on an "AS IS" BASIS,
12   -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   -// * See the License for the specific language governing permissions and
14   -// * limitations under the License.
15   -// */
16   -//package cn.iocoder.yudao.framework.ai.model.function;
17   -//
18   -//import com.fasterxml.jackson.annotation.JsonClassDescription;
19   -//import org.springframework.beans.BeansException;
20   -//import org.springframework.cloud.function.context.catalog.FunctionTypeUtils;
21   -//import org.springframework.cloud.function.context.config.FunctionContextUtils;
22   -//import org.springframework.context.ApplicationContext;
23   -//import org.springframework.context.ApplicationContextAware;
24   -//import org.springframework.context.annotation.Description;
25   -//import org.springframework.context.support.GenericApplicationContext;
26   -//import org.springframework.lang.NonNull;
27   -//import org.springframework.lang.Nullable;
28   -//import org.springframework.util.StringUtils;
29   -//
30   -//import java.lang.reflect.Type;
31   -//import java.util.function.Function;
32   -//
33   -///**
34   -// * A Spring {@link ApplicationContextAware} implementation that provides a way to retrieve
35   -// * a {@link Function} from the Spring context and wrap it into a {@link FunctionCallback}.
36   -// *
37   -// * The name of the function is determined by the bean name.
38   -// *
39   -// * The description of the function is determined by the following rules:
40   -// * <ul>
41   -// * <li>Provided as a default description</li>
42   -// * <li>Provided as a {@code @Description} annotation on the bean</li>
43   -// * <li>Provided as a {@code @JsonClassDescription} annotation on the input class</li>
44   -// * </ul>
45   -// *
46   -// * @author Christian Tzolov
47   -// * @author Christopher Smith
48   -// */
49   -//public class FunctionCallbackContext implements ApplicationContextAware {
50   -//
51   -// private GenericApplicationContext applicationContext;
52   -//
53   -// private FunctionCallbackWrapper.Builder.SchemaType schemaType = FunctionCallbackWrapper.Builder.SchemaType.JSON_SCHEMA;
54   -//
55   -// public void setSchemaType(FunctionCallbackWrapper.Builder.SchemaType schemaType) {
56   -// this.schemaType = schemaType;
57   -// }
58   -//
59   -// @Override
60   -// public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
61   -// this.applicationContext = (GenericApplicationContext) applicationContext;
62   -// }
63   -//
64   -// @SuppressWarnings({ "rawtypes", "unchecked" })
65   -// public FunctionCallback getFunctionCallback(@NonNull String beanName, @Nullable String defaultDescription) {
66   -//
67   -// Type beanType = FunctionContextUtils.findType(this.applicationContext.getBeanFactory(), beanName);
68   -//
69   -// if (beanType == null) {
70   -// throw new IllegalArgumentException(
71   -// "Functional bean with name: " + beanName + " does not exist in the context.");
72   -// }
73   -//
74   -// if (!Function.class.isAssignableFrom(FunctionTypeUtils.getRawType(beanType))) {
75   -// throw new IllegalArgumentException(
76   -// "Function call Bean must be of type Function. Found: " + beanType.getTypeName());
77   -// }
78   -//
79   -// Type functionInputType = TypeResolverHelper.getFunctionArgumentType(beanType, 0);
80   -//
81   -// Class<?> functionInputClass = FunctionTypeUtils.getRawType(functionInputType);
82   -// String functionName = beanName;
83   -// String functionDescription = defaultDescription;
84   -//
85   -// if (!StringUtils.hasText(functionDescription)) {
86   -// // Look for a Description annotation on the bean
87   -// Description descriptionAnnotation = applicationContext.findAnnotationOnBean(beanName, Description.class);
88   -//
89   -// if (descriptionAnnotation != null) {
90   -// functionDescription = descriptionAnnotation.value();
91   -// }
92   -//
93   -// if (!StringUtils.hasText(functionDescription)) {
94   -// // Look for a JsonClassDescription annotation on the input class
95   -// JsonClassDescription jsonClassDescriptionAnnotation = functionInputClass
96   -// .getAnnotation(JsonClassDescription.class);
97   -// if (jsonClassDescriptionAnnotation != null) {
98   -// functionDescription = jsonClassDescriptionAnnotation.value();
99   -// }
100   -// }
101   -//
102   -// if (!StringUtils.hasText(functionDescription)) {
103   -// throw new IllegalStateException("Could not determine function description."
104   -// + "Please provide a description either as a default parameter, via @Description annotation on the bean "
105   -// + "or @JsonClassDescription annotation on the input class.");
106   -// }
107   -// }
108   -//
109   -// Object bean = this.applicationContext.getBean(beanName);
110   -//
  1 +/*
  2 + * Copyright 2024-2024 the original author or authors.
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * https://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package cn.iocoder.yudao.framework.ai.model.function;
  17 +
  18 +import com.fasterxml.jackson.annotation.JsonClassDescription;
  19 +import org.springframework.beans.BeansException;
  20 +import org.springframework.cloud.function.context.catalog.FunctionTypeUtils;
  21 +import org.springframework.cloud.function.context.config.FunctionContextUtils;
  22 +import org.springframework.context.ApplicationContext;
  23 +import org.springframework.context.ApplicationContextAware;
  24 +import org.springframework.context.annotation.Description;
  25 +import org.springframework.context.support.GenericApplicationContext;
  26 +import org.springframework.lang.NonNull;
  27 +import org.springframework.lang.Nullable;
  28 +import org.springframework.util.StringUtils;
  29 +
  30 +import java.lang.reflect.Type;
  31 +import java.util.function.Function;
  32 +
  33 +/**
  34 + * A Spring {@link ApplicationContextAware} implementation that provides a way to retrieve
  35 + * a {@link Function} from the Spring context and wrap it into a {@link FunctionCallback}.
  36 + *
  37 + * The name of the function is determined by the bean name.
  38 + *
  39 + * The description of the function is determined by the following rules:
  40 + * <ul>
  41 + * <li>Provided as a default description</li>
  42 + * <li>Provided as a {@code @Description} annotation on the bean</li>
  43 + * <li>Provided as a {@code @JsonClassDescription} annotation on the input class</li>
  44 + * </ul>
  45 + *
  46 + * @author Christian Tzolov
  47 + * @author Christopher Smith
  48 + */
  49 +public class FunctionCallbackContext implements ApplicationContextAware {
  50 +
  51 + private GenericApplicationContext applicationContext;
  52 +
  53 + private FunctionCallbackWrapper.Builder.SchemaType schemaType = FunctionCallbackWrapper.Builder.SchemaType.JSON_SCHEMA;
  54 +
  55 + public void setSchemaType(FunctionCallbackWrapper.Builder.SchemaType schemaType) {
  56 + this.schemaType = schemaType;
  57 + }
  58 +
  59 + @Override
  60 + public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
  61 + this.applicationContext = (GenericApplicationContext) applicationContext;
  62 + }
  63 +
  64 + @SuppressWarnings({ "rawtypes", "unchecked" })
  65 + public FunctionCallback getFunctionCallback(@NonNull String beanName, @Nullable String defaultDescription) {
  66 +
  67 + Type beanType = FunctionContextUtils.findType(this.applicationContext.getBeanFactory(), beanName);
  68 +
  69 + if (beanType == null) {
  70 + throw new IllegalArgumentException(
  71 + "Functional bean with name: " + beanName + " does not exist in the context.");
  72 + }
  73 +
  74 + if (!Function.class.isAssignableFrom(FunctionTypeUtils.getRawType(beanType))) {
  75 + throw new IllegalArgumentException(
  76 + "Function call Bean must be of type Function. Found: " + beanType.getTypeName());
  77 + }
  78 +
  79 + Type functionInputType = TypeResolverHelper.getFunctionArgumentType(beanType, 0);
  80 +
  81 + Class<?> functionInputClass = FunctionTypeUtils.getRawType(functionInputType);
  82 + String functionName = beanName;
  83 + String functionDescription = defaultDescription;
  84 +
  85 + if (!StringUtils.hasText(functionDescription)) {
  86 + // Look for a Description annotation on the bean
  87 + Description descriptionAnnotation = applicationContext.findAnnotationOnBean(beanName, Description.class);
  88 +
  89 + if (descriptionAnnotation != null) {
  90 + functionDescription = descriptionAnnotation.value();
  91 + }
  92 +
  93 + if (!StringUtils.hasText(functionDescription)) {
  94 + // Look for a JsonClassDescription annotation on the input class
  95 + JsonClassDescription jsonClassDescriptionAnnotation = functionInputClass
  96 + .getAnnotation(JsonClassDescription.class);
  97 + if (jsonClassDescriptionAnnotation != null) {
  98 + functionDescription = jsonClassDescriptionAnnotation.value();
  99 + }
  100 + }
  101 +
  102 + if (!StringUtils.hasText(functionDescription)) {
  103 + throw new IllegalStateException("Could not determine function description."
  104 + + "Please provide a description either as a default parameter, via @Description annotation on the bean "
  105 + + "or @JsonClassDescription annotation on the input class.");
  106 + }
  107 + }
  108 +
  109 + Object bean = this.applicationContext.getBean(beanName);
  110 +
  111 + // TODO: 2024/3/16 fansili 适配jdk8
  112 + return null;
111 113 // if (bean instanceof Function<?, ?> function) {
112 114 // return FunctionCallbackWrapper.builder(function)
113 115 // .withName(functionName)
... ... @@ -119,6 +121,6 @@
119 121 // else {
120 122 // throw new IllegalArgumentException("Bean must be of type Function");
121 123 // }
122   -// }
123   -//
124   -//}
  124 + }
  125 +
  126 +}
... ...